Поскольку, как я писал ранее, возможности кода, выполняющегося в контексте программных таймеров, весьма ограничены, я даже не стал пытаться выполнять какие-либо действия «бизнес-логики» в 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);
А реакция на выставленные флаги происходит в самих задачах.
Такой подход в моём случае себя полностью оправдал. С такими таймерами работать оказалось очень удобно.






