|
|
  |
Прерывания SAM |
|
|
|
Jun 3 2006, 21:55
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Написал прием/передачу по USART по прерываниям. До этого прерывания использовал PIT, на котором базируется системный таймер. Вызова приема/передачи в теле программы нет, присутствует только сама функция прерывания, тем не менее программа в это прерывание залетает(включается светодиод), при этом таймер тихо сходит с ума.(Если пишу в AIC_EOICR, зависает, если нет увеличивется частота). Такое впечетление, что влет в оба прерывания происходит по переполнению PIT. Прерывания конфигурил по AT91F_AIC_ConfigureIt, приоритет PIT = 7, USART = 6.Компилятор gcc, режим ARM, о баге с thumb режимом осведомлен, атрибут прерывания поставлен. Я что-то не понял в конфигурации AIC? или на выходе из USART Interrupt нужны какие-то танцы? Помогите ибо день на это уже убил.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 5 2006, 04:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата imho трабла не с AIC'ом в общем, а с тем, что AIC'у сообщается о завершении обработки прерывания, а USART'у - нет. ОК, с AIC_EOICR понятно - закрытие прерывания в AIC. Чтение PIT_PIVR - сброс флажка прерывания в PIT. Чтение US_CSR - сброс флажка прерывания в USART? (регистр read-only). У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы: у функций стоит атрибут nacked и используются макросы ISR_ENTRY и ISR_EXIT позаимствованые из примера с прерывниями. Ключик компилятора -marm для всего или -mthumb-interworking для основной программы и -marm для файла с прерываниями - ситуация в любом случае одинаковая.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 5 2006, 08:57
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(beer_warrior @ Jun 5 2006, 07:44)  У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы:.... Не думаю что тогда было бы это: Цитата .. если нет увеличивется частота это imho два взаимоисключающих фактора. все должно быть проще.. Сокращенный код обработчика usart'a был бы весьма кстати.
|
|
|
|
|
Jun 5 2006, 13:41
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954

|
Цитата(beer_warrior @ Jun 4 2006, 00:55)  Написал прием/передачу по USART по прерываниям. До этого прерывания использовал PIT, на котором базируется системный таймер. Вызова приема/передачи в теле программы нет, присутствует только сама функция прерывания, тем не менее программа в это прерывание залетает(включается светодиод), при этом таймер тихо сходит с ума.(Если пишу в AIC_EOICR, зависает, если нет увеличивется частота). Такое впечетление, что влет в оба прерывания происходит по переполнению PIT. Прерывания конфигурил по AT91F_AIC_ConfigureIt, приоритет PIT = 7, USART = 6.Компилятор gcc, режим ARM, о баге с thumb режимом осведомлен, атрибут прерывания поставлен. Я что-то не понял в конфигурации AIC? или на выходе из USART Interrupt нужны какие-то танцы? Помогите ибо день на это уже убил.  Победил подобное поведение, сконфигурировав оба прерывания (и PIT, и UART) как level sensetive (НЕ edge sensetive).
Сообщение отредактировал gmax - Jun 5 2006, 13:42
|
|
|
|
|
Jun 5 2006, 14:48
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954

|
Цитата(defunct @ Jun 5 2006, 16:47)  Цитата(gmax @ Jun 5 2006, 16:41)  Победил подобное поведение, сконфигурировав оба прерывания (и PIT, и UART) как level sensetive (НЕ edge sensetive).
Точно, и в даташите есть информация об этом: 31.5.3 Interrupt The USART interrupt line is connected on one of the internal sources of the Advanced Interrupt Controller. Using the USART interrupt requires the AIC to be programmed first. Note that it is not recommended to use the USART interrupt line in edge sensitive mode.Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).
|
|
|
|
|
Jun 6 2006, 13:16
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(gmax @ Jun 5 2006, 17:48)  Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно). интересно, что значит "я конфигурирую НЕ ТАК"? а как можно еще так то, если в даташите сказано конкретно как? жутко интересно 8))
--------------------
|
|
|
|
|
Jun 6 2006, 14:39
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954

|
Цитата(PrSt @ Jun 6 2006, 16:16)  Цитата(gmax @ Jun 5 2006, 17:48)  Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).
интересно, что значит "я конфигурирую НЕ ТАК"? а как можно еще так то, если в даташите сказано конкретно как? жутко интересно 8)) В datasheet РЕКОМЕНДУЕТСЯ, а не СКАЗАНО конкретно как! А НЕ ТАК значит, что если в datasheet написано edge sensitive, то я конфигурирую НЕ ТАК, то есть level sensitive.
|
|
|
|
|
Jun 7 2006, 15:09
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954

|
Цитата(defunct @ Jun 6 2006, 23:52)  Цитата(gmax @ Jun 6 2006, 17:39)  В datasheet РЕКОМЕНДУЕТСЯ, а не СКАЗАНО конкретно как! А НЕ ТАК значит, что если в datasheet написано edge sensitive, то я конфигурирую НЕ ТАК, то есть level sensitive.  А! понятно, у вас просто проблемы с переводом  В даташите сказано, что НЕ рекомендуется использовать линию прерывания USART в edge sensitive режиме. т.е. вы делаете как раз так, как там написано ;> Точно!  Не дочитал... 2 beer_barriorпроблема обнаружилась? озвучьте результаты, пожалуйста
|
|
|
|
|
Jun 8 2006, 04:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата проблема обнаружилась? озвучьте результаты, пожалуйста чем дальше в лес - тем толще патизаны  Провел время в разборе листингов,такое впечетление, что проблема в линкере, строка Код AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS ] = (unsigned int) SysTimerInterrupt в отдельно взятом файле interrupts.c честно пишет точку входа в прерывание в виде метки. В собранном main.lss эта метка подменяется на абсолютно левый адрес. Причем меняется в зависимости от режима компиляции, а закономерности я не могу найти
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|