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

 
 
 
Reply to this topicStart new topic
> Вызов Си-шного обработчика FIQ - прерывания, При компиляции RealView компилятором
Maximm
сообщение Mar 23 2008, 18:55
Сообщение #1


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

Группа: Свой
Сообщений: 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


Разобрался с проблемой во время написания вопроса, как обычно и бывает)
Представленный код посностью рабочий, может кому-нибудь пригодиться, как пример

Извините за флуд!


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 23 2008, 19:04
Сообщение #2


Гуру
******

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



Цитата(Maximm @ Mar 23 2008, 21:26) *
Раньше в Кейловском копмиляторе была директива "__FIQ" и всё работало, но в RealView eё нет и для IRQ и FIQ обработчиков используется - "__IRQ".

Ну нету - недоработка sad.gif. Как следствие сохраняются лишние регистры, но работоспособность это не влияет. Расцикливатесь и ищите причину в другом месте.
Цитата
Вот просой пример кода - он не работает, подскажите в чем проблема!

Нет ни малейшего желания читать мутный код с непоименованными константами 1-2-10-0x10-... Если хотите, что-бы Ваши исходники читали, проявите уважение и сделайте его читабельным, заодно скорее всего сами ошибку найдете. И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Maximm
сообщение Mar 23 2008, 19:12
Сообщение #3


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

Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137



Цитата(zltigo @ Mar 23 2008, 22:04) *
И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить smile.gif


За константы извиняйте, в этом и была ошибка, а где лишние прыжки в startup'e?


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 23 2008, 19:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Maximm
сообщение Mar 23 2008, 19:35
Сообщение #5


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

Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137



Цитата(zltigo @ Mar 23 2008, 22:23) *
Ну а __enable_interrupt() кто сделал?


Я их включаю, когда в User Mode перехожу, точнее не я, а в стандартном Кейловском startup'e так сделано.
Или я Вас не правильно понимаю?


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 23 2008, 19:39
Сообщение #6


Гуру
******

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



Цитата(Maximm @ Mar 23 2008, 22:35) *
Или я Вас не правильно понимаю?

Я без понятия,что сделано в чем то "стандартном". Но если сделано, то естественно все работоспособно, хотя разрешать прерывания "автоматом" в startup это кривовато...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 23 2008, 19:41
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Maximm @ Mar 23 2008, 22:35) *
Я их включаю, когда в User Mode перехожу, точнее не я, а в стандартном Кейловском startup'e так сделано.
Или я Вас не правильно понимаю?

Просто startup лучше было выложить полностью - никто же не знает, что у Вас там на самом деле написано.

Некоторый выйгрыш от использования FIQ можно получить при помощи asm-обертки для прерывания:
сохранить R0-R3 в старших регистрах, а не на стеке.
Go to the top of the page
 
+Quote Post
Maximm
сообщение Mar 23 2008, 19:46
Сообщение #8


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

Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137



Цитата(zltigo @ Mar 23 2008, 22:39) *
хотя разрешать прерывания "автоматом" в startup это кривовато...


Цитата(aaarrr @ Mar 23 2008, 22:41) *
Некоторый выйгрыш от использования FIQ можно получить при помощи asm-обертки для прерывания:
сохранить R0-R3 в старших регистрах, а не на стеке.


Спасибо, за ответы и разъяснения - учту в дальнейшей работе! smile3046.gif


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 23 2008, 20:30
Сообщение #9


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а __global_reg() можно прикрутить к FIQ
да и вообще кто нибудь __global_reg() использовал?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 23 2008, 20:52
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ Mar 23 2008, 23:30) *
а __global_reg() можно прикрутить к FIQ
да и вообще кто нибудь __global_reg() использовал?

Можно, правда обработчик в отдельный файл положить придется. Но получится криво - лучше уж позволить компилятору распределять регистры так, как ему удобно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:41
Рейтинг@Mail.ru


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