Библиотека для создания отложенных или регулярных задач.
More...
|
| void | soft_timer_init (soft_timer_init_struct *init_struct, soft_timer_class_struct **soft_timer_obj) |
| | Функция инициализции soft_timer.
|
| |
| int | create_soft_timer (soft_timer_class_struct *soft_timer_obj, soft_timer_handler_t handler, void *p, bool repeat, bool delete_on_completion, soft_timer_mode_enum handler_exec_mode) |
| | Функция создания нового soft_timerа
|
| |
| bool | remove_soft_timer (soft_timer_class_struct *soft_timer_obj, int instance) |
| | Функция удаления soft_timerа
|
| |
| bool | stop_soft_timer (soft_timer_class_struct *soft_timer_obj, int instance) |
| | Функция остановки soft_timerа
|
| |
| bool | start_soft_timer (soft_timer_class_struct *soft_timer_obj, int instance, uint32_t time_ms) |
| | Функция запуска soft_timerа
|
| |
| void | soft_timer_tick_exec (soft_timer_class_struct *soft_timer_obj) |
| | Функция тика soft_timer. Эту функцию нужно вызывать в прерывании таймера (или SysTick()) для работы soft_timer.
|
| |
| void | timer_owerflow (soft_timer_class_struct *soft_timer_obj) |
| | Функция переполнения таймера.
|
| |
| bool | soft_timer_is_run (soft_timer_class_struct *soft_timer_obj, int instance) |
| | Функция получения статуса soft_timerа.
|
| |
Библиотека для создания отложенных или регулярных задач.
- Softtimer_controller - это инициализированная структура soft_timer_class_struct
- Soft_timer - одна из задач внутри soft_timer_controller, которых может быть создано до timer_size
Примерно как выполнение задач в прерывании по таймеру, только здесь задачи могут добавляться и удаляться динамически во время исполнения кода.
Вот пример использования Softtimer. Все примеры здесь для миллисекундного таймера.
Softtimer_controller состоит из правильно инициализированной структуры soft_timer_class_struct. (Шаги 1-3)
Таких структур может быть несколько, но обычно достаточно одного миллисекундного таймера.
После этого внутри этой структуры можно создавать до timers_size soft_timer. (Шаги после 4-..)
- Создать структуру soft_timer_init_struct. Например
.tick_step_us = 1000,
.timers_size = 50,
.GetTick = HAL_GetTick,
.StartTickTimer = 0,
.StopTickTimer = 0,
.isTimerEnable = 0
};
Структура для инициализации soft_timer.
Definition base_soft_timer.h:134
- Создать указатель на soft_timer_class и инициализировать класс
void soft_timer_init(soft_timer_init_struct *init_struct, soft_timer_class_struct **soft_timer_obj)
Функция инициализции soft_timer.
Definition base_soft_timer.c:30
soft_timer_class_struct * ms_timer_obj
Верхнеуровневая структура soft_timer, с которой предстоит работать.
Definition base_soft_timer.h:169
- Добавить исполнение тика soft_timer. Обычно он исполняется в SysTick() или в прерывании по таймеру, если требуется таймер с шагом не в 1мс
uint32_t global_time_overflow = 0;
void SysTick_Handler(void)
{
if (HAL_GetTick() == 0)
{
global_time_overflow++;
}
}
void soft_timer_tick_exec(soft_timer_class_struct *soft_timer_obj)
Функция тика soft_timer. Эту функцию нужно вызывать в прерывании таймера (или SysTick()) для работы s...
Definition base_soft_timer.c:168
void timer_owerflow(soft_timer_class_struct *soft_timer_obj)
Функция переполнения таймера.
Definition base_soft_timer.c:50
Инициализация окончена. Теперь можно управлять отдельными soft_timer.
- Создаем функцию, которую хотим вызывать.
Она должна иметь формат soft_timer_handler_t. Внутрь функции будет передан объект таймера, номер soft_timer и указатель на параметр p.
- Создаем новый soft_timer
int create_soft_timer(soft_timer_class_struct *soft_timer_obj, soft_timer_handler_t handler, void *p, bool repeat, bool delete_on_completion, soft_timer_mode_enum handler_exec_mode)
Функция создания нового soft_timerа
Definition base_soft_timer.c:60
@ SOFT_TIMER_EXEC_IRQ_MODE
Definition base_soft_timer.h:125
Он вернет нам uint8_t переменную с номером этого soft_timerа, по которому мы будем обращаться к нему дальше.
В аргументы передаем - Parameters
-
| soft_timer_obj | Указатель на soft_timer |
| handler | Указатель на функцию |
| p | Указатель на параметр (если надо) |
| repeat | Повторять ли вызов |
| delete_on_completion | Удалить ли soft_timer после исполнения |
| handler_exec_mode | Режим исполнение (в While или IRQ) soft_timer_mode_enum |
- Запускаем таймер
bool start_soft_timer(soft_timer_class_struct *soft_timer_obj, int instance, uint32_t time_ms)
Функция запуска soft_timerа
Definition base_soft_timer.c:130
В аргументы передаем - Parameters
-
| soft_timer_obj | Указатель на soft_timer |
| timer_instance | Номер soft_timer |
| time_ms | Время в тиках таймера (для миллисекундного таймера это 1мс) |
- Через данное количество времени будет вызвана функция soft_timer_callback.
Если repeat = true, то таймер запустится снова, если нет, то остановится.
Если delete_on_completion = true, то таймер будет удален.
- soft_timer можно остановить вручную.
bool stop_soft_timer(soft_timer_class_struct *soft_timer_obj, int instance)
Функция остановки soft_timerа
Definition base_soft_timer.c:117
Также soft_timer можно удалить и получить статус - See also
- remove_soft_timer
-
soft_timer_is_run
◆ soft_timer_mode_enum
enum режимов исполнения soft_timer
| Enumerator |
|---|
| SOFT_TIMER_EXEC_WHILE_MODE | В этом режиме soft_timer будет исполнен внтури while(1). Для этого в while() должна быть добавлена функция sheduller_exece();
|
| SOFT_TIMER_EXEC_IRQ_MODE | В этом режиме soft_timer будет исполнен внтури прерывания. Для мс таймера это SysTick_Handler() - Warning
- Если выбрать режим IRQ и добавить HAL_Delay(), он станет ждать SysTick() внутри прерывания SysTick и повиснет.
Кроме того, не стоит на долго держать процессор в прерывании, потому что могут потеряться другие прерывания.
|
◆ create_soft_timer()
Функция создания нового soft_timerа
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
| handler | Указатель на функцию, которую нужно вызвать |
| p | Указатель на параметр, который нужно передать внутрь функции |
| repeat | Повторять ли вызов |
| delete_on_completion | Удалить таймер после выполнения |
| handler_exec_mode | Выполнение таймера в прерывании или в while(1). Проще и удобнее в прерывании, но delay повесит систему. В таком случае можно использовать while |
- Returns
- Номер soft_timer
◆ remove_soft_timer()
Функция удаления soft_timerа
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
| instance | Номер soft_timerа |
- Returns
- true если таск удален
◆ soft_timer_init()
Функция инициализции soft_timer.
- Parameters
-
| init_struct | Структура с настройками |
| soft_timer_obj | Указатель на указатель на класс soft_timer |
◆ soft_timer_is_run()
Функция получения статуса soft_timerа.
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
- Returns
- true если таск работает, иначе false
◆ soft_timer_tick_exec()
Функция тика soft_timer. Эту функцию нужно вызывать в прерывании таймера (или SysTick()) для работы soft_timer.
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
◆ start_soft_timer()
Функция запуска soft_timerа
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
| instance | Номер soft_timerа |
| time_ms | Время в тиках таймера |
- Returns
- true если таск запущен
◆ stop_soft_timer()
Функция остановки soft_timerа
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |
| instance | Номер soft_timerа |
- Returns
- true если таск остановлен
◆ timer_owerflow()
Функция переполнения таймера.
- Parameters
-
| soft_timer_obj | Указатель на объект soft_timer |