|
|
  |
FAST IRQ (LPC213X) |
|
|
|
Aug 14 2006, 11:56
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279

|
Не подскажет ли кто как задается адрес процедуры обработчика Fast IRQ для LPC213X. Уже весь раздел VIC прочитал, но так и не понял. Может это VICDefVectAddr, но в описании сказано что он используется для невекторных прерываний, а про FIQ не говорится, хотя ранее использовался термин FIQ service routine. (И еще, где взять описание ассемблера для данного семейства процессоров, или хотя бы как называется это описание, в сети сам найду).
|
|
|
|
|
Aug 14 2006, 13:57
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279

|
Да, забыл сказать, пользуюсь CrossStudio 1.4, функцию __ARMLIB_enableFIQ(); вызвать не забыл, адрес процедуры FIQ записал по адресу 0x0000001c, процедура оформлена как Код static __attribute__ ((interrupt("FIQ"))) void ISR_READ(void) { EXTINT = 0x02; IO0PIN^=0x80000000; VICVectAddr = 0x0; } в режиме векторного прерывания или невекторного default прерывания проблем нет (светодиод горит), а FIQ не работает (соответственно не горит).
|
|
|
|
|
Aug 14 2006, 18:19
|

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

|
Цитата(GetSmart @ Aug 14 2006, 18:44)  То, что будет вызван вектор FIQ задаётся примерно так: VICIntSelect |= Да. Причем судя по всему именно классафикация источника прерывания в качестве FIQ и не была сделана вопрошаюшим. Цитата ...будет вызывать вектор FIQ. VICVectAddr? можно при этом использовать любой с учётом нужного приоритета. Нет. На FIQ нет векторного механизма, посему VICVectAddr* к нему вообще никакого отношения не имеет. При нескольких источниках FIQ есть только возможность в общем обработчике читать FIQ Status register и по нему ветвиться.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 15 2006, 06:06
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279

|
[quote name='zltigo' date='Aug 14 2006, 22:19' post='144439'] [quote] Нет. На FIQ нет векторного механизма, посему VICVectAddr* к нему вообще никакого отношения не имеет. При нескольких источниках FIQ есть только возможность в общем обработчике читать FIQ Status register и по нему ветвиться. [/quote] Ну да, об этом я читал, а как задать этот общий обработчик, на самом деле прерывание возникает и вешает микроконтроллер, что по всей видимости вызвано неверным зданием адреса обработчика или некорректным оформлением процедуры обработчика. Может надо в startup заменить строку Код ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */ чем то другим, а не записвать адрес процедуры обработки непосредственно в 0x0000001c, или переопределить сам fiq_handler записанный как Код fiq_handler: b fiq_handler .weak fiq_handler
|
|
|
|
|
Aug 15 2006, 06:34
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 9-06-05
Пользователь №: 5 868

|
Вот упражнение для Keil, в нем все прекрасно рассмотрено про FIQ. Запусти в отладчике и все станет ясно.
|
|
|
|
|
Aug 15 2006, 08:19
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(RRaptor @ Aug 15 2006, 10:06)  Ну да, об этом я читал, а как задать этот общий обработчик, на самом деле прерывание возникает и вешает микроконтроллер, что по всей видимости вызвано неверным зданием адреса обработчика или некорректным оформлением процедуры обработчика. Может надо в startup заменить строку Код ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */ чем то другим, а не записвать адрес процедуры обработки непосредственно в 0x0000001c, или переопределить сам fiq_handler записанный как Код fiq_handler: b fiq_handler .weak fiq_handler Проще всего на месте Код ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */ написать Код b fiq_handler /* fiq handler */
|
|
|
|
|
Aug 15 2006, 09:45
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279

|
// Вот упражнение для Keil, // в нем все прекрасно рассмотрено про FIQ. // Запусти в отладчике и все станет ясно. К сожалению отладчик у меня не работает (не распаяли на устройстве из-за занятости отладочных выводов) а как адаптировать startup из архива к startup из CrossStudio я вряд ли соображу. // Проще всего на месте Код ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */ // написать Код b fiq_handler /* fiq handler */ Ну да, только этот код в startup.s а обработчик в main.cpp и startup.s не видит то что написано в main.cpp. Ну в общем хоть и корявое решение а все таки я его придумал, а именно 1. Подправить обработчик FIQ в startup чтобы он указывал на 15 прерывание Код // ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */ ldr pc, [pc, #-0xEE8] /* fiq handler */ 2. Записать в VICVectAddr15 адрес процедурны обработки прерывания. Правда при этом становится на одно векторное прерывание меньше, но в моем пректе это не критично. Большое спасибо всем ответившим, если кто-то знает решение лучше буду только рад.
|
|
|
|
|
Aug 15 2006, 12:50
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(RRaptor @ Aug 15 2006, 13:45)  Ну да, только этот код в startup.s а обработчик в main.cpp и startup.s не видит то что написано в main.cpp. Записать Код extern "C" { void fiq_handler(); } если компилируется в режиме C++
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|