|
|
  |
Вызов Си-шного обработчика FIQ - прерывания, При компиляции RealView компилятором |
|
|
|
Mar 23 2008, 18:55
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Доброе время суток! Пытаюсь объявить обработчик FIQ-прерывания, как Си-функцию, Си-компилятор RealView, прерывание не вызывается! Раньше в Кейловском копмиляторе была директива "__FIQ" и всё работало, но в RealView eё нет и для IRQ и FIQ обработчиков используется - "__IRQ". Вот просой пример кода - он не работает, подскажите в чем проблема! Код void Timer(void) __irq { if (IOSET0 & LED_1) IOCLR0 |= LED_1; else IOSET0 |= LED_1; T0IR = 0x01; }
int main(void) { IODIR0 |= LED_1 | LED_2; IOCLR0 |= LED_2; IOSET0 |= LED_1;
T0PR = 2999; T0TCR = 2; T0MCR = 3; T0MR0 = 999; T0TCR = 1; VICIntSelect = 0x10; VICIntEnable = 0x10;
while(1); }
Кусок Startup'a
AREA RESET, CODE, READONLY ARM EXTERN Timer
Vectors LDR PC, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_Addr LDR PC, PAbt_Addr LDR PC, DAbt_Addr NOP ; Reserved Vector LDR PC, [PC, #-0x0FF0]; Vector from VicVectAddr LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0 ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler IRQ_Handler B IRQ_Handler FIQ_Handler B Timer Разобрался с проблемой во время написания вопроса, как обычно и бывает) Представленный код посностью рабочий, может кому-нибудь пригодиться, как пример Извините за флуд!
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
Mar 23 2008, 19:04
|

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

|
Цитата(Maximm @ Mar 23 2008, 21:26)  Раньше в Кейловском копмиляторе была директива "__FIQ" и всё работало, но в RealView eё нет и для IRQ и FIQ обработчиков используется - "__IRQ". Ну нету - недоработка  . Как следствие сохраняются лишние регистры, но работоспособность это не влияет. Расцикливатесь и ищите причину в другом месте. Цитата Вот просой пример кода - он не работает, подскажите в чем проблема! Нет ни малейшего желания читать мутный код с непоименованными константами 1-2-10-0x10-... Если хотите, что-бы Ваши исходники читали, проявите уважение и сделайте его читабельным, заодно скорее всего сами ошибку найдете. И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 23 2008, 19:12
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Цитата(zltigo @ Mar 23 2008, 22:04)  И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить  За константы извиняйте, в этом и была ошибка, а где лишние прыжки в startup'e?
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
Mar 23 2008, 19:23
|

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

|
Цитата(Maximm @ Mar 23 2008, 22:12)  За константы извиняйте, в этом и была ошибка, а где лишние прыжки в startup'e? LDR PC, FIQ_Addr -> FIQ_Addr DCD FIQ_Handler -> FIQ_Handler B Timer ->.... ^^^^^^^^^^^^^^^^^^^^^^ Цитата(Maximm @ Mar 23 2008, 22:12)  .. в этом и была ошибка.. Ну а __enable_interrupt() кто сделал?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 23 2008, 19:35
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Цитата(zltigo @ Mar 23 2008, 22:23)  Ну а __enable_interrupt() кто сделал? Я их включаю, когда в User Mode перехожу, точнее не я, а в стандартном Кейловском startup'e так сделано. Или я Вас не правильно понимаю?
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
Mar 23 2008, 19:46
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Цитата(zltigo @ Mar 23 2008, 22:39)  хотя разрешать прерывания "автоматом" в startup это кривовато... Цитата(aaarrr @ Mar 23 2008, 22:41)  Некоторый выйгрыш от использования FIQ можно получить при помощи asm-обертки для прерывания: сохранить R0-R3 в старших регистрах, а не на стеке. Спасибо, за ответы и разъяснения - учту в дальнейшей работе!
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|