реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> str91 траблы с прерываниями
sergvks
сообщение Jul 6 2007, 12:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 251
Регистрация: 26-07-05
Пользователь №: 7 117



Настроены два прерывания от rx уарта и таймера, у уарта приоритет 1, у таймера 2. Таймер генерирует прерывание раз в 1мс. Иногда происходит ложное срабатывание прерывания от уарта(редко) и из буфера читается байт идентичный предыдущему считанному. Вопрос: как с этим бороться ?

PS
При запрещении прерывания таймера всё работает как часы.
Go to the top of the page
 
+Quote Post
IV_K
сообщение Jul 6 2007, 16:06
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 17-06-05
Пользователь №: 6 087



использовать протокол с контрольной суммой и повторными посылками при несовпадении
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 7 2007, 07:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(sergvks @ Jul 6 2007, 16:13) *
Вопрос: как с этим бороться ?

Как обычно: отлаживать. Если проблему можно воспроизвести, значит её можно и устранить.
Надо останавливать программу на самом интересном месте (ложное прерывание) и анализировать содержимое стека и переменных. При этом полезно разную отладочную информацию о состоянии программы накапливать в переменных, чтобы было что анализировать.
А насчёт протокола с контрольной суммой и повторными посылками - это, наверное, шутка была. Следуя этой логике, каждый баг программы следует воспринимать как данность и не пытаться его исправить.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 7 2007, 08:42
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Конечно это какой-то баг. У меня в системе через uart по прерыванию прокачивались деятки мегабайт одновременно с разрешенным системным таймером. Оба с разными приоритетами. Никаких ошибок не выявлено.

Надо искать.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 7 2007, 16:25
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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

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


Цитата(scifi @ Jul 7 2007, 11:08) *
Как обычно: отлаживать. Если проблему можно воспроизвести, значит её можно и устранить.
Надо останавливать программу на самом интересном месте (ложное прерывание) и анализировать содержимое стека и переменных. При этом полезно разную отладочную информацию о состоянии программы накапливать в переменных, чтобы было что анализировать.
А насчёт протокола с контрольной суммой и повторными посылками - это, наверное, шутка была. Следуя этой логике, каждый баг программы следует воспринимать как данность и не пытаться его исправить.
Go to the top of the page
 
+Quote Post
sergvks
сообщение Jul 9 2007, 06:28
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 251
Регистрация: 26-07-05
Пользователь №: 7 117



Цитата(AlexandrY @ Jul 7 2007, 20:25) *
UART-ы и таймера находятся в разных каскадах контроллера прерываний, и таймеры по любому имеют более высокий приоритет.


У меня сложилось такое же мнение. Выловил этот глюк так: простенькая программка: прерывание от таймера(перезагрузка + очистка флага) и в прерывании от уарта uart->tx=uart->rx, в main while(1).
Буду играться с частотами, спасибо за совет.
Go to the top of the page
 
+Quote Post
Andy_ry
сообщение Jul 11 2007, 12:18
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 29-03-07
Пользователь №: 26 595



Цитата(sergeeff @ Jul 7 2007, 12:42) *
Конечно это какой-то баг. У меня в системе через uart по прерыванию прокачивались деятки мегабайт одновременно с разрешенным системным таймером. Оба с разными приоритетами. Никаких ошибок не выявлено.
Надо искать.

Что уже решили проблему?
http://mcu.st.com/mcu/modules.php?mop=modl...30&forum=21
Тогда какой код у камня? У меня те же проблемы! Как только задействуешь прерывания из двух контроллеров VIC0 и VIC1 одновременно творятся чудеса (обычно UART встаёт колом или данные искажаются)

Сообщение отредактировал Andy_ry - Jul 11 2007, 12:19
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение Jul 11 2007, 12:36
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Посмотрите в отладчике не заходит ли по этим векторам.
VIC0->DVAR
VIC1->DVAR
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 03:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.026 секунд с 7
ELECTRONIX ©2004-2016