Программные таймеры в FreeRTOS — практическое использование

Поскольку, как я писал ранее, возможности кода, выполняющегося в контексте программных таймеров, весьма ограничены, я даже не стал пытаться выполнять какие-либо действия «бизнес-логики» в callback-функциях таймеров.

Вместо этого, я сделал обёртку вокруг программных таймеров FreeRTOS, которая делает всего одну простую вещь. Мои таймеры всего лишь в нужные моменты устанавливают нужные биты в указанных прн создании таймеров группах событий. Т.е. таймеры выполняют поручения вида «сделай так, чтобы в этой группе событий через столько-то миллисекунд установился этот бит (или несколько битов, если это зачем-то нужно)».

Интерфейс моего класса-обёртки в результате получился примитивный:

class MyTimers {
public:
    enum TimerType {normal, oneOff, autoReload};

    /// returns the ID of created timer
    int createTimer(EventGroupHandle_t event_group, EventBits_t flags, int  period, TimerType timer_type = normal);

    /// starts the specified timer
    void startTimer(int timer_id);

    /// stops the specified timer
    void stopTimer(int timer_id);

    /// changes period for the specified timer
    void changePeriod(int timer_id, int period);

    /// stops & deletes the specified timer
    void deleteTimer(int timer_id);

А реакция на выставленные флаги происходит в самих задачах.

Такой подход в моём случае себя полностью оправдал. С такими таймерами работать оказалось очень удобно.

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