Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перестают срабатывать прерывания таймеров
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
quarz
Долго разбирался, отчего перестают срабатывать прерывания таймеров. Могли работать какое-то время, а потом все. Отваливался и Systick, и все остальные - Tim2, 3, 6 разом. Другие прерывания при этом продолжали работать. Проверял конфигурацию Systick - счетчик декрементируется, прерывание разрешено.

Оказалось, в одной из веток кода в обработчике Tim2 стояла задержка 10мс (работающая по Systick), что больше периода срабатывания этого таймера. Я хорошо знаю заповедь о минимизации времени работы в прерываниях, но думал что если к очередному срабатыванию не выйти из обработчика, максимум что потеряешь - это очередной вызов обработчика.
Почему же прекращают вызываться все обработчики таймеров?

мк ST32L151
adnega
Цитата(quarz @ Apr 10 2015, 10:16) *
Почему же прекращают вызываться все обработчики таймеров?
мк ST32L151

При равных приоритетах ничего работать не будет.
При вызове обработчика TIM2, блокируются все прерывания с текущим приоритетом и ниже.
Если в обработчике от TIM2 вы ждете события из обработчика SysTick (а в вашем случае именно SysTick отсчитывает 10 мс таймаут),
то недождетесь, т.к. SysTick запрещен.

Нужно: либо отказаться от возможности таких блокировок, либо поднимать приоритеты.
Вообще, никаких блокировок в обработчиках быть не должно - видимо, у вас проблемы с архитектурой программы.
quarz
Естественно у Systick приоритет самый высокий, выше чем у других таймеров.
На счет архитектуры - Sleep в обработчике вызывался по ошибке, в обработчиках нет блокировок.

Мне интересно, почему отваливаются прерывания таймеров, если обработчик выполняется дольше чем период вызова прерываний
adnega
Цитата(quarz @ Apr 10 2015, 11:16) *
Мне интересно, почему отваливаются прерывания таймеров, если обработчик выполняется дольше чем период вызова прерываний

Вы уверены:
1) что SysTick продолжает обрабатываться?
2) что вы не весите в сплошном обработчике какого-то прерывания (пользовательский код выполняется)?
3) что периферийный флаг сбрасывается и устанавливается вновь?
4) что устанавливается pending-бит соответствующего прерывания в NVIC?
quarz
1. Systick тактируется и продолжает считать, прерывания разрешены - это я вижу по его регистрам
2. Именно так, для эксперимента я поставил в обработчик 2 таймера код, выполняющийся долго. НО приоритет Systick выше и должен прерывать обработчик таймера 2. Вот это не понятно

3,4 не проверял
adnega
Цитата(quarz @ Apr 10 2015, 14:08) *
Вот это не понятно
3,4 не проверял

А есть какие-нить дополнительные средства отладки? Консоль или светодиод на худой конец?

volatile у переменной таймера имеется?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.