nikll wrote:
Я думал по FreeRTOS, пришел к выводу что для нашей задачи FreeRTOS будет лишним оверхедом не предоставляющим существенного преимущества, не те задачи

, tcp стек не нужен,интерфейсного взаимодейсвия нет, все четко распределенно по порядкам приорететам и времени выполнения, зачем городить полноценную ОСь?
На мой взгляд вполне достаточно суперцикла с захардкоженными приорететами через порядок в switch'е (обьем кода меньше сотни строк на все - вечер покодить, RTOS со всеми семафорами мьютексами потоками и прочим апи так быстро не освоить).
Реально ОС даст многое. Например сама разрулит ситуацию с длинными фоновыми вычислениями. Их не так то просто разбивать на этапы. Кроме того ОС позволит достаточно просто расширять возможности не переписывая все заново. Я не планирую расти - есть конкретная задача, надо ее решить и ездить. Максимум в дальнейшем дорабатывать алгоритмы расчета смеси. Никаких дополнительных возможностей вводить не буду. Мне это просто не надо. Хотя о ОС еще подумаю. Уж очень хорошо вытесняющая многозадачность должна лечь на архитектуру STM8

Тут кортекс ей не конкурент. Одна команда полностью! переключает контекст. Всего за 9 тактов. Кортекс впрочем примерно за то же время справится, но только за счет в 3 раза более высокой частоты. При равных тактах ему ничего не светит.
nikll wrote:
про volatile ты правельно заметил, вот только почити все значения используемые в прерываниях расчитываются в основном цикле.
Прочитай что ли книжку по Си. Того же Кернигана с Ричи. Узнаешь что такое volatile и когда он нужен. Для использования переменных в прерывании рассчитываемых в основном цикле этот квалификатор нужен как корове седло. Он нужен для обратных действий. Впрочем если его и добавить для очереди - ничего не изменится. Там очень короткий и простой обработчик.
nikll wrote:
Если делать управление всеми форсунками в одном прерывании то выходит следующее:
обращение к очереди
считывание текущей записи
определение что именно требуется сделать (открыть/заркрыть, порт.пин)
если было открытие форсунки то добавляем в очередь таймер на закрытие форсунки
выбрасывание текущего элемента из очереди с переходом на следующий
все остальное запихать все в прерывание ДПКВ и там уже определять из угла начала впрыска конкретный зуб на котором сосчитать добавочное время для таймера прерывания форсунок
В общем получается немало кода и нифига не десятки тактов (очередь придется делать volatile т.к. заполнятся она будет в основном цикле и изменятся в прерывании ДПКВ)
Нда. Очередь - массив структур по количеству равный числу цилиндров. Действия в очереди однотипные, вычислять что делать не надо. В структуре содержится указатель на следующую структуру - это чтоб не считать индексы или не сравнивать указатели. Собственно в структуре 4 поля. 1 - значение загружаемое в канал сравнения таймера, 1 - маска на порт, 1 - значение для вывода, 1 - указатель на следующий элемент очереди, считай на следующую структуру в массиве. И есть один указатель вне структур - на текущую структуру в очереди. Он и изменяется и используется только в прерывании, так что volatile и ему не нужен. И так наши действия примерно такие:
Загружаем указатель на текущий элемент очереди - на текущую структуру. Загружаем по нему маску и значение для вывода. Накладываем маску на порт и затем устанавливаем значение выходов. Сбрасываем флаг прерывания от этого канала. Загружаем указатель на следующий элемент очереди и сохраняем его как указатель на текущий. ВСЕ! На вскидку - обработчик около 20-25 тактов. Плюс 9+3 на вход и 11 на выход из прерывания - итого 48 тактов примерно. Около 2мкс при такте 24МГц. При этом нет ограничений - я например могу управлять сразу двумя рядами форсунок. То есть иногда включать две одновременно, а иногда только одну. Допустим наддутый мотор и соответственно высокая производительность форс. Так можно их разбить, одну большую на 2 поменьше. И на ХХ будет только одна включаться, а на режиме полной мощности - две. И это не потребует ни одного лишнего такта при обработке очереди! Только изменятся маска и значение для вывода в порт. Масштабируемость - запредельная

Мне она впрочем не понадобится.
Теперь прикинем загрузку на примере 4ц бензовпрыска. Имеем за оборот 2 события на открытие и 2 на закрытие. Период при 6000 оборотов - 10мС. За это время мы тратим пусть 4*60 = 240 тактов. При частоте 24МГц за 10мс имеем 240000 тактов. 240/240000 = 0,1% загрузки. Да, без таймеров просто никуда...

Это ж пипец - бедный проц.

Да, если распределить форсунки по 1 на канал таймера то можно вообще без прерываний обойтись. И целую 0,1% производительности сэкономить! Вот в этом и есть разница между решением задачи в лоб и продумыванием алгоритма. 0,1% всего. Вемсовцы явно думают над алгоритмами, я не все понимаю как они смогли реализовать. Но явно принцип на форсунки примерно такой же. Впрочем можно еще подумать, может и не 0,1% удастся занять. Вот только ИМХО это и так не напряжно.