ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1406609 Топик полностью
Nikolay_Po (22.02.2024 22:25, просмотров: 252) ответил Adept на ну это понятно, а я максимально рационально старался использовать ресурсы :) компактную версию планировщика, без проблем засовываю в любую "тайню", практически, единый подход к написанию ПО ждя всех случаев сильно всё упрощает. И да, камкой смысл пихать в цикл "инвариантные действия" (в чём сакральный смысл, к примеру отрабатывать клавиатурный драйвер или драйвер индикаций каждые 100 микросекунд?? Ну кроме излишней загрузки CPU :) Вот так и скатываемся к говнокодингу
В STM32, даже в F1, достаточно уровней прерываний и их источников ("триггеров") чтобы разрулить штук 7 разных очередей и даже больше (у меня в текущем проекте, на данный момент, 7). 

Причём контроллер прерываний позволяет группировать приоритеты в группы, так, что если одна задача в группе уже начала выполняться, то другая задача из группы, даже если и имеет более высокий приоритет, её не прервёт, пока не завершиться та, что вызвана первой.

В общем, вы можете построить систему из нескольких конечных автоматов, выполняемых с разными приоритетами, исключительно на прерываниях. Так, что ваш главный цикл в main() будет выглядеть так:


do{;}while(1);

и всё будет работать. Более приоритетные автоматы могут вызывать менее приоритетные из своего кода. И когда обработка более приоритетных задач завершается, выполняются менее приоритетные. Так, что в совокупности с main() вы можете легко загрузить ЦП на 100% полезными задачами с нужными приоритетами.

Например, у меня в мэйне крутится лишь приборка и конечный автомат фонового сохранения/выемки данных флеш (при этом само взаимодействие по SPI - в прерываниях с DMA).

Вы, сделав всю важную, не пользовательскую логику в прерываниях, можете отдать мейн интерпретатору скриптов. Под вопросом остаётся лишь разграничение пользовательских скриптов, так, чтобы один неудачный скрипт не блокировал выполнение остальных, важных.