Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: str91 траблы с прерываниями
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sergvks
Настроены два прерывания от rx уарта и таймера, у уарта приоритет 1, у таймера 2. Таймер генерирует прерывание раз в 1мс. Иногда происходит ложное срабатывание прерывания от уарта(редко) и из буфера читается байт идентичный предыдущему считанному. Вопрос: как с этим бороться ?

PS
При запрещении прерывания таймера всё работает как часы.
IV_K
использовать протокол с контрольной суммой и повторными посылками при несовпадении
scifi
Цитата(sergvks @ Jul 6 2007, 16:13) *
Вопрос: как с этим бороться ?

Как обычно: отлаживать. Если проблему можно воспроизвести, значит её можно и устранить.
Надо останавливать программу на самом интересном месте (ложное прерывание) и анализировать содержимое стека и переменных. При этом полезно разную отладочную информацию о состоянии программы накапливать в переменных, чтобы было что анализировать.
А насчёт протокола с контрольной суммой и повторными посылками - это, наверное, шутка была. Следуя этой логике, каждый баг программы следует воспринимать как данность и не пытаться его исправить.
sergeeff
Конечно это какой-то баг. У меня в системе через uart по прерыванию прокачивались деятки мегабайт одновременно с разрешенным системным таймером. Оба с разными приоритетами. Никаких ошибок не выявлено.

Надо искать.
AlexandrY
Тут такая область, что не угадаешь правильного способа.
Можно сколько угодно насовать отладочной информации и всяких переменных, но против хардварных багов это ничем не поможет, а пару недель убить легко на такое копание. Возможнор обход с контрольной суммой будет даже более приемлем.

UART-ы и таймера находятся в разных каскадах контроллера прерываний, и таймеры по любому имеют более высокий приоритет. Возможно проблемы с шиной и надо откорректировать тактовую частоту периферии по отношению к системной.


Цитата(scifi @ Jul 7 2007, 11:08) *
Как обычно: отлаживать. Если проблему можно воспроизвести, значит её можно и устранить.
Надо останавливать программу на самом интересном месте (ложное прерывание) и анализировать содержимое стека и переменных. При этом полезно разную отладочную информацию о состоянии программы накапливать в переменных, чтобы было что анализировать.
А насчёт протокола с контрольной суммой и повторными посылками - это, наверное, шутка была. Следуя этой логике, каждый баг программы следует воспринимать как данность и не пытаться его исправить.
sergvks
Цитата(AlexandrY @ Jul 7 2007, 20:25) *
UART-ы и таймера находятся в разных каскадах контроллера прерываний, и таймеры по любому имеют более высокий приоритет.


У меня сложилось такое же мнение. Выловил этот глюк так: простенькая программка: прерывание от таймера(перезагрузка + очистка флага) и в прерывании от уарта uart->tx=uart->rx, в main while(1).
Буду играться с частотами, спасибо за совет.
Andy_ry
Цитата(sergeeff @ Jul 7 2007, 12:42) *
Конечно это какой-то баг. У меня в системе через uart по прерыванию прокачивались деятки мегабайт одновременно с разрешенным системным таймером. Оба с разными приоритетами. Никаких ошибок не выявлено.
Надо искать.

Что уже решили проблему?
http://mcu.st.com/mcu/modules.php?mop=modl...30&forum=21
Тогда какой код у камня? У меня те же проблемы! Как только задействуешь прерывания из двух контроллеров VIC0 и VIC1 одновременно творятся чудеса (обычно UART встаёт колом или данные искажаются)
Vladimir_T
Посмотрите в отладчике не заходит ли по этим векторам.
VIC0->DVAR
VIC1->DVAR
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.