1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Jieli-Tech-fw-AC63_BT_SDK

 / Детали:

ЗАМЕЧАНИЕ: регистрация программного таймера не расходует аппаратный таймер (sys_timer_add, sys_timeout_add,...

Предстоит сделать
Владелец
Создано  
05.03.2025

sys_s_hi_timer_add). Правильный способ записи.

Описание

Система по умолчанию использует таймер timer1 в качестве источника системной частоты 1 мс. Все программные таймеры основаны на этом timer1.

Расширены два способа использования таймеров:

  1. Выполнение в обратном вызове прерываний (не следует использовать операции с задержками, затратами времени, выключением питания, записью VM, записи flash):
    • 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 мс как единицу учета времени.

  1. Два типа таймеров не должны использоваться вложенными друг в друга.

Из-за того, что обратные вызовы двух типов таймеров выполняются в разных местах и не являются последовательными, обратный вызов 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;
}
}

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
系统相关
label.
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
git@api.gitlife.ru:oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
oschina-mirror
Jieli-Tech-fw-AC63_BT_SDK
Jieli-Tech-fw-AC63_BT_SDK