|
FreeRTOS + прерывания |
|
|
|
Nov 13 2006, 10:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(3.14 @ Nov 13 2006, 11:54)  Разъясните плиз попопулярнее как засовывать свои обработчики прерывания Как обычно, системе все равно. Цитата и какие тонкости в контексте операционки следует учитывать. Ну кроме использования вариантов некоторых системных вызовов ориентированных на вызов из обработчиков прерывания - никаких.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 13 2006, 10:44
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
1) создал асмову обложку Код RSEG ICODE:CODE CODE32 EXTERN vUSARTISR PUBLIC vUSARTISREntry #include "ISR_Support.h" vUSARTISREntry: portSAVE_CONTEXT bl vUSARTISR portRESTORE_CONTEXT END 2) объявил Код extern void vUSARTISREntry( void ); __arm void vUSARTISR( void ); 3) обработчик Код __arm void vUSARTISR(void) { write_char_USART0 ('A'); USART_pt->US_CR = AT91C_US_RSTSTA; } 4) в инициализации USART-а добавил Код AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ( void (*)( void ) ) vUSARTISREntry); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); Вроде все на месте а не фурычит
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Nov 13 2006, 15:07
|

Частый гость
 
Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272

|
Код /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; нужно добавить в конец обработчика а вообще проще взять целиком пример из исходников FREERTOS - там же ведь он есть
|
|
|
|
|
Nov 13 2006, 18:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(3.14 @ Nov 13 2006, 19:56)  Под IAR-ом. Тогда для начала незачем асмовские оберки городить Код __irq __arm void vUSARTISREntry( void ) { .... } Дальше разбирайтесь с инициализацией AVRовского железа....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 13 2006, 18:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(3.14 @ Nov 13 2006, 20:31)  А в чем тогда смысл этих оберток (это кейловское "наследие")? Для тех, кто без __irq Цитата Насчет AVR, хотите сказать что в периферии SAM7 многое от AVR? Хотел написать Atmel :-) Цитата Меня, если честно, больше на филлипс тянет но пока ни образцев ни тем более серийных экземпляров их арм-ов с MAC-ами нет. Внешний на SPI - и все проблемы..
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 13 2006, 22:31
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Цитата(zltigo @ Nov 13 2006, 22:40)  Цитата Меня, если честно, больше на филлипс тянет но пока ни образцев ни тем более серийных экземпляров их арм-ов с MAC-ами нет.
Внешний на SPI - и все проблемы.. Не нравится.
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Nov 19 2006, 22:41
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Вчера нарвался на грабли с IARом.
Суть такая. Беру FreeRTOS, из него - демку под SAM7S64, которая USB-джойстик. Для начала все выкинул лишнее, оставил только USB и мигание диодами. Потом решил добавить обработчик на ADC. Сделал все точно так-же, как у них в демке сделано для USB. Единственная разница - я не запускаю отдельной задачей весь "пакет" с инициализацией, а просто инициализирую ADC, разрешаю прерывание и все. Да, необходимое уточнение. Файлы я назвал ADC.s79 и ADC.c. В первом - асмовая обертка, во втором - инициализация и собственно обработчик.
Дальше компилю, заливаю во флеш (тут еще один вопрос, задам в отдельной ветке), и..... глухо, даже диоды не моргают.
Удивляюсь, оставляю код, но выкидываю запуск инициализации (по идее, все по дефолту - прерывания не разрешены, и т.д. и т.п., просто есть кусок кода в бинарнике, который никогда не выполняется) - те-же грабли.
Попробовал в отладчике запустить и, что меня удивило, запуск начинается почему-то не в Cstartup.s79, а в ассемблерной обертке обработчика ADC. Ну в общем меня посетила странная мысль и я переименовал файлы из ADC.* в xADC.*. После этого все заработало.
Это что, такая мода у компилятора - менять точку входа в зависимости от имени файлов? Ну и, заодно, вопрос. Правомерно ли после инициализации ADC выполнять AT91F_AIC_ConfigureIt и AT91F_AIC_EnableIt и забывать о всех проблемах? Достаточно ли этого?
|
|
|
|
|
Nov 20 2006, 01:20
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Дело было не в бобине Я не учел, что четыре из восьми каналов АЦП завернуты на кнопки и светодиоды  Соответственно, ничего не жило и не моргало. Вот только теперь - вопрос. Вот обработчик: Код static __arm __irq void vADC_ISR(void) { unsigned portCHAR i = 0; unsigned portCHAR sr =0; // Read status register sr = a_pADC->ADC_SR & 0xff; /* sADC_RAW[0]=a_pADC->ADC_CDR4; sADC_RAW[1]=a_pADC->ADC_CDR5; sADC_RAW[2]=a_pADC->ADC_CDR6; sADC_RAW[3]=a_pADC->ADC_CDR7; */ sBUTTONS[7]=sr; for (i=0;i<8;i++) { if ( (sr >> i) & 0x01) { // Bit is set, put data to array sADC_RAW[i]= (*( AT91C_ADC_CDR0 + (0x04*i))) & 0xff; } } // Start new conversion a_pADC->ADC_CR = 0x2; /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; } Что не так в цикле?  Не работает
|
|
|
|
|
Nov 20 2006, 11:19
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070

|
Цитата(Kitsok @ Nov 19 2006, 22:41)  Вчера нарвался на грабли с IARом. Да, необходимое уточнение. Файлы я назвал ADC.s79 и ADC.c. Да, интересные грабли. Получается, что IAR после трансляции должен создать два объектных файла с одинаковыми именами ADC.r79. Естественно, останется только один из них. Так что надо давать файлам разные имена.
|
|
|
|
|
Nov 20 2006, 13:35
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата В очередной раз удивляюсь тому, как программисты любят обвинять компилятор в собственных глюках.   Ну я не уверен, что это мой глюк, бо имена у файлов все-ж разные, я тут быстро писал, поэтому получились одинаковые  Но поскольку проблема решена, то и ладно. Другой вопрос. Вот что не так в этой строчке: Код sADC_RAW[i]= (*( AT91C_ADC_CDR0 + (0x04*i))) & 0xff; По задумке хочется считать CDR соответствующего i канала АЦП. Где косяк?
|
|
|
|
|
Nov 21 2006, 11:28
|

Участник

Группа: Новичок
Сообщений: 19
Регистрация: 28-09-05
Пользователь №: 9 057

|
Цитата(Kitsok @ Nov 20 2006, 01:20)  /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq?
--------------------
Было бы железо софт напишем
|
|
|
|
|
Nov 21 2006, 13:16
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(megaloki @ Nov 21 2006, 11:28)  Цитата(Kitsok @ Nov 20 2006, 01:20)  /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0;
Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq? Я смотрел листинг, там одно присвоение идет. Т.е. выкидывать EOICR=0 я не пробовал, но так - работает
|
|
|
|
|
Nov 22 2006, 12:13
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(megaloki @ Nov 21 2006, 10:28)  Цитата(Kitsok @ Nov 20 2006, 01:20)  /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0;
Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq? "Патамушта надо" __irq говорит компилятору сгенерить пролог/эпилог необходимый для обработчика прерываний. А AIC является обычным периферийным узлом, и как его сбрасывать и надо ли вообще сбрасывать, компилятор не имеет никакого понятия. В ADuC его вообще нет, в LPC он называется VIC. А компилятор один на всех.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 24 2006, 03:21
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(zltigo @ Nov 13 2006, 18:10)  Тогда для начала незачем асмовские оберки городить В FreeRTOS в примерах у каждого обработчика есть обертка и комментарий: Цитата ; Wrapper for the * interrupt service routine. This can cause a ; context switch so requires an assembly wrapper. Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает...
--------------------
|
|
|
|
|
Nov 24 2006, 10:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AVR @ Nov 24 2006, 02:21)  Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает... Для тех компиляторов которые могут самостоятельно генерить фрейм для обработчика (IAR в их числе) - не нужны, если в прерывании контексты не переключаются. Если переключаются, тогда следует использовать жирную системную обертку. Пример, как указать компилятору - был приведен.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2006, 13:05
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(AVR @ Nov 24 2006, 03:21)  Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает... Если переключение в ISR не требует уведомления задач через очереди или как-то еще, то обертка не нужна. Если требует, то нужна  У меня и с оберткой, и без обертки работает, но я данные из обработчика передают тупо, без очередей (хоть это и не правильно)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|