sys_s_hi_timer_add). Правильный способ записи.
Система по умолчанию использует таймер timer1
в качестве источника системной частоты 1 мс. Все программные таймеры основаны на этом timer1
.
Расширены два способа использования таймеров:
sys_hi_timer_add()
— циклический таймер, который не позволяет системе переходить в низкопотребностное состояние до удаления.sys_hi_timeout_add()
— одноразовый таймер, выполняющий функцию один раз при истечении времени.sys_s_hi_timer_add()
— циклический таймер, который не влияет на возможность системы переходить в низкопотребностное состояние, но может менять периодичность. Рекомендовано использование этого типа таймера.sys_s_hi_timeout_add()
— одноразовый таймер, выполняющий функцию один раз при истечении времени.При использовании данного типа таймера важно помнить, что зарегистрированные функции вызываются внутри обратного вызова прерываний. Нельзя выполнять операции с задержками, затратами времени, выключением питания, записью flash или VM. Время выполнения функции должно быть меньше 0.5 мс.
Единицы измерения — миллисекунды, шаг составляет 1 мс.2. Выполнение в потоках системы:
sys_timer_add()
— циклический таймер, который может влиять на время перехода системы в низкопотребностное состояние. Краткосрочные периоды могут увеличивать энергопотребление.sys_timeout_add()
— одноразовый таймер, выполняющий функцию один раз при истечении времени.При использовании данного типа таймера важно помнить, что зарегистрированные функции выполняются в потоках системы, и их приоритет зависит от приоритета регистрирующегося потока.Единицы измерения — миллисекунды, шаг составляет 10 мс. 5 мс эквивалентно 10 мс. Система использует 10 мс как единицу учета времени.
Из-за того, что обратные вызовы двух типов таймеров выполняются в разных местах и не являются последовательными, обратный вызов hi_timer
может прерывать обратный вызов sys_timer
. Поэтому запрещено следующее использование:
hi_timer
запрещается регистрация, удаление или изменение sys_timer
.sys_timer
запрещается изменение hi_timer
, особенно при работе с критическими секциями.local_irq_disable();
local_irq_enable();
Циклический таймер:
static uint16_t timer_loop = 0;
static void timer_loop_func(void *priv) {
static uint8_t cnt = 0;
cnt++;
log_info("%s[cnt:%d]", __func__, cnt);
}
void timer_loop_init(void) {
log_info("%s[id:%d]", __func__, timer_loop);
if (timer_loop) {
sys_timer_del(timer_loop); // Перед регистрацией проверяем наличие существующего таймера
timer_loop = 0;
}
timer_loop = sys_timer_add(NULL, timer_loop_func, 5 * 1000); // Единицы измерения — миллисекунды
}
void timer_loop_del(void) {
log_info("%s[id:%d]", __func__, timer_loop);
if (timer_loop) {
sys_timer_del(timer_loop); // Перед удалением проверяем наличие таймера
timer_loop = 0; // После удаления очищаем значение
}
}
```Одноразовый таймер:
```c
static uint16_t timer_one = 0;
static void timer_one_func(void *priv)
{
static u8 cnt = 0;
cnt++;
log_info("%s[cnt:%d]", func, cnt);
//sys_timeout_add будет выполнен только один раз, ниже автоматически удалится
//внутри обратного вызова нельзя использовать sys_timeout_del
timer_one = 0; //очистка ID номера, обязательно должно быть!!!
}
void timer_one_init(void)
{
log_info("%s[id:%d]", func, timer_one);
if (timer_one) {
sys_timeout_del(timer_one); //до регистрации, нужно проверить была ли регистрация
timer_one = 0;
}
timer_one = sys_timeout_add(NULL, timer_one_func, 5 * 1000); //единицы измерения - миллисекунды
}
void timer_one_del(void)
{
log_info("%s[id:%d]", func, timer_one);
if (timer_one) {
sys_timeout_del(timer_one);
timer_one = 0;
}
}
Вход Перед тем как оставить комментарий