scmRTOS и stm32f030f4 – базовый проект

Попробовав 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, так сказатб.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *