Попробовав FreeRTOS, я не смог остановиться и понял, что в проекта хочу использовать кукую бы то ни было операционку. Понятное дело, не во всех, но, например, в аппаратуре для RC это вполне оправдано. FreeRTOS всем хороша, но для моего любимого микроконтроллера она жрёт уж больно много ресурсов,, имея избыточную функциональность.
Я черканул заметку о своём небольшом планировщике, однако я пока в тупике – писать ли свой велясопед или поискать что-нибудь под задачу таки. Поискал и нашёл scmRTOS, маленькую и компактную, с минимумом функций, но при этом полностью работоспособную, а что ещё нужно то? Из минусов для меня – написана на плюсах, а я идеологически верно испокон веков писал на сях для контроллеров. Ну штош©, с плюсами знаком не понаслышке, в олимпиадном программировании (может, расскажу когда-нибудь) уверенно использую, так что почему бы и нет.
Дело позднее, обстановка напряжённая, поэтому сейчас накидал только тестовый проект, который на моей плате приёмника аппаратуры реализует светодиодную моргалку с разным периодом у светиков. В разработке использовал настроенную среду на основе PlatformIO, тестовый пример для L0 из репозитария и немного магии, ну как всегда.
Вот листинг main.cpp:
#include <stm32f0xx.h> #include <scmRTOS.h> #include "defines.h" #include "delay.h" // Process types typedef OS::process<OS::pr0, 100> TProc0; typedef OS::process<OS::pr1, 100> TProc1; // Process objects TProc0 Proc0; TProc1 Proc1; int main() { system_clock(); RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; GPIOA->MODER |= GPIO_MODER_2_OUT; GPIOB->MODER |= GPIO_MODER_6_OUT; // run OS::run(); } namespace OS { template<> OS_PROCESS void TProc0::exec() { for (;;) { GPIOA->ODR ^= (1<<2); sleep(300); } } } namespace OS { template<> OS_PROCESS void TProc1::exec() { for (;;) { GPIOB->ODR ^= (1<<6); sleep(800); } } }
В мэйне подрубаем тактирование GPIO и настраиваем соответствующие пины для светиков, используя мои определения, о которых писал здеся.
В секции process_types объявляются типы процессов для красивости, хотя каждого типа может быть только один процесс (так как не может быть задач с одинаковым приоритетом). Собсна pr0 и pr1 – приоритеты, магическое 100 – размер стека для задачи (закрывать плотно, открывать осторожнодобавлять много, уменьшать аккуратно). В задачах, описанных в конце, тогглим бит в регистре ODR и тупим заданное количество тактов ОСи (настраивается в scmRTOS_TARGET_CFG.h):
//------------------------------------------------------------------------------ // Define SysTick clock frequency and its interrupt rate in Hz. // It makes sense if USE_CUSTOM_TIMER = 0. // #define SYSTICKFREQ 48000000 #define SYSTICKINTRATE 1000
system_clock из моего куска кода (язык не поворачивается сказать библиотеки) delay выставляет частоту в 48МГц, ФАПЧа внутреннюю RC-цепочку на 8МГц.
Вот и всё, постараюсь поподробнее в будущем расписать про эту ОСь, так как тема мне интересная, а материала немного.
А вот и репо проекта – http://git.stm32f0.ru/Yarik.Yar/scmRTOS_templ
Stay in touch, так сказатб.