• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Работа с таймерами

alexsmd

New member
Здравствуйте, что происходит с таймерами когда они отрабатывают?
пишу прошивку, мне надо по определенному событию формировать импульсы



функция

Код:
void ICACHE_FLASH_ATTR intr_callback(unsigned pin, unsigned level) {
    os_timer_disarm(&key_timer);
    os_timer_disarm(&key_timer_off);
    os_timer_setfn(&key_timer, (os_timer_func_t *)key_cb, (void *)0); // set function to a timer
    os_timer_setfn(&key_timer_off, (os_timer_func_t *)key_cb_off, (void *)0); // set function to a timer
    ets_timer_arm_new(&key_timer, DELAY, 0, 0);
    ets_timer_arm_new(&key_timer_off, DELAYOFF, 0, 0);
}
Эта функция работает по прерыванию, не происходит ли переполнения буфера или еще какой гадости из-за таймеров ?
Как грамотно работать с таймерами?

Пробовал в конце функции добавлять строки:
os_timer_disarm(&key_timer);
os_timer_disarm(&key_timer_off);
но видимо таймеры вырубаются раньше срока срабатывания.
 

kript0n

New member
Здравствуйте, что происходит с таймерами когда они отрабатывают?
пишу прошивку, мне надо по определенному событию формировать импульсы



функция

Код:
void ICACHE_FLASH_ATTR intr_callback(unsigned pin, unsigned level) {
    os_timer_disarm(&key_timer);
    os_timer_disarm(&key_timer_off);
    os_timer_setfn(&key_timer, (os_timer_func_t *)key_cb, (void *)0); // set function to a timer
    os_timer_setfn(&key_timer_off, (os_timer_func_t *)key_cb_off, (void *)0); // set function to a timer
    ets_timer_arm_new(&key_timer, DELAY, 0, 0);
    ets_timer_arm_new(&key_timer_off, DELAYOFF, 0, 0);
}
Эта функция работает по прерыванию, не происходит ли переполнения буфера или еще какой гадости из-за таймеров ?
Как грамотно работать с таймерами?

Пробовал в конце функции добавлять строки:
os_timer_disarm(&key_timer);
os_timer_disarm(&key_timer_off);
но видимо таймеры вырубаются раньше срока срабатывания.
Попробуйте в ets_timer_arm_new последним параметром передать 1. Должно работать.
 

pvvx

Активный участник сообщества
Эта функция работает по прерыванию, не происходит ли переполнения буфера или еще какой гадости из-за таймеров ?
Нет, не происходит.
Как грамотно работать с таймерами?
Как у вас и описано. os_timer_disarm, os_timer_setfn, ets_timer_arm_new.
Далее вызовется назначенная в os_timer_setfn() функция.

Пробовал в конце функции добавлять строки:
os_timer_disarm(&key_timer);
os_timer_disarm(&key_timer_off);
А смысл?
но видимо таймеры вырубаются раньше срока срабатывания.
Кто вырубается? Назначенная функция не выполняетcя?

+ В коде ets_timer_arm_new() есть проверка на повторное назначение и тогда в начале там выполняется os_timer_disarm(). В старых SDK этого не было.
 
Сверху Снизу