• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 этого не было.
 
Сверху Снизу