main_ubi_sdk v 0.1.3
This is UBI4 documentation
Soft_timer

Библиотека для создания отложенных или регулярных задач. More...

Data Structures

struct  soft_timer_init_struct
 Структура для инициализации soft_timer. More...
 
struct  soft_timer_handler_struct
 Внутренняя структура soft_timer. More...
 
struct  soft_timer_class_struct
 Верхнеуровневая структура soft_timer, с которой предстоит работать. More...
 

Enumerations

enum  soft_timer_mode_enum { SOFT_TIMER_EXEC_WHILE_MODE , SOFT_TIMER_EXEC_IRQ_MODE }
 enum режимов исполнения soft_timer More...
 

Functions

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а.
 

Detailed Description

Библиотека для создания отложенных или регулярных задач.

  1. Создать структуру soft_timer_init_struct. Например
    soft_timer_init_struct init_ms_timer_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
  2. Создать указатель на soft_timer_class и инициализировать класс
    soft_timer_init(&init_ms_timer_struct, &ms_timer_obj);
    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
  3. Добавить исполнение тика soft_timer. Обычно он исполняется в SysTick() или в прерывании по таймеру, если требуется таймер с шагом не в 1мс
    //stm32**xx_it.c
    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.
  4. Создаем функцию, которую хотим вызывать.
    Она должна иметь формат soft_timer_handler_t. Внутрь функции будет передан объект таймера, номер soft_timer и указатель на параметр p.
    void soft_timer_callback(soft_timer_class_struct* soft_timer_obj, int timer_instance, void* p)
    {
    foo();
    }
  5. Создаем новый soft_timer
    uint8_t timer_instance = create_soft_timer(ms_timer_obj, soft_timer_callback, p, true, false,SOFT_TIMER_EXEC_IRQ_MODE);
    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
  6. Запускаем таймер
    start_soft_timer(ms_timer_obj, timer_instance, 10000); //Запуск таймера на 10 сек
    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мс)
  7. Через данное количество времени будет вызвана функция soft_timer_callback.
    Если repeat = true, то таймер запустится снова, если нет, то остановится.
    Если delete_on_completion = true, то таймер будет удален.
  8. soft_timer можно остановить вручную.
    stop_soft_timer(ms_timer_obj, timer_instance); // Остановка таймера
    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

Enumeration Type Documentation

◆ 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 и повиснет.
Кроме того, не стоит на долго держать процессор в прерывании, потому что могут потеряться другие прерывания.

Function Documentation

◆ create_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а

Parameters
soft_timer_objУказатель на объект soft_timer
handlerУказатель на функцию, которую нужно вызвать
pУказатель на параметр, который нужно передать внутрь функции
repeatПовторять ли вызов
delete_on_completionУдалить таймер после выполнения
handler_exec_modeВыполнение таймера в прерывании или в while(1). Проще и удобнее в прерывании, но delay повесит систему. В таком случае можно использовать while
Returns
Номер soft_timer
Here is the caller graph for this function:

◆ remove_soft_timer()

bool remove_soft_timer ( soft_timer_class_struct * soft_timer_obj,
int instance )

Функция удаления soft_timerа

Parameters
soft_timer_objУказатель на объект soft_timer
instanceНомер soft_timerа
Returns
true если таск удален
Here is the caller graph for this function:

◆ soft_timer_init()

void soft_timer_init ( soft_timer_init_struct * init_struct,
soft_timer_class_struct ** soft_timer_obj )

Функция инициализции soft_timer.

Parameters
init_structСтруктура с настройками
soft_timer_objУказатель на указатель на класс soft_timer

◆ soft_timer_is_run()

bool soft_timer_is_run ( soft_timer_class_struct * soft_timer_obj,
int instance )

Функция получения статуса soft_timerа.

Parameters
soft_timer_objУказатель на объект soft_timer
Returns
true если таск работает, иначе false
Here is the caller graph for this function:

◆ soft_timer_tick_exec()

void soft_timer_tick_exec ( soft_timer_class_struct * soft_timer_obj)

Функция тика soft_timer. Эту функцию нужно вызывать в прерывании таймера (или SysTick()) для работы soft_timer.

Parameters
soft_timer_objУказатель на объект soft_timer
Here is the call graph for this function:

◆ start_soft_timer()

bool start_soft_timer ( soft_timer_class_struct * soft_timer_obj,
int instance,
uint32_t time_ms )

Функция запуска soft_timerа

Parameters
soft_timer_objУказатель на объект soft_timer
instanceНомер soft_timerа
time_msВремя в тиках таймера
Returns
true если таск запущен
Here is the caller graph for this function:

◆ stop_soft_timer()

bool stop_soft_timer ( soft_timer_class_struct * soft_timer_obj,
int instance )

Функция остановки soft_timerа

Parameters
soft_timer_objУказатель на объект soft_timer
instanceНомер soft_timerа
Returns
true если таск остановлен
Here is the caller graph for this function:

◆ timer_owerflow()

void timer_owerflow ( soft_timer_class_struct * soft_timer_obj)

Функция переполнения таймера.

Parameters
soft_timer_objУказатель на объект soft_timer