Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызов Си-шного обработчика FIQ - прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Maximm
Доброе время суток!
Пытаюсь объявить обработчик 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


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

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

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

Нет ни малейшего желания читать мутный код с непоименованными константами 1-2-10-0x10-... Если хотите, что-бы Ваши исходники читали, проявите уважение и сделайте его читабельным, заодно скорее всего сами ошибку найдете. И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить smile.gif
Maximm
Цитата(zltigo @ Mar 23 2008, 22:04) *
И лишние прыжки из startup уберите - без надобности они. И прерывания-бы надо разрешить smile.gif


За константы извиняйте, в этом и была ошибка, а где лишние прыжки в startup'e?
zltigo
Цитата(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() кто сделал?
Maximm
Цитата(zltigo @ Mar 23 2008, 22:23) *
Ну а __enable_interrupt() кто сделал?


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

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

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

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


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


Спасибо, за ответы и разъяснения - учту в дальнейшей работе! smile3046.gif
KRS
а __global_reg() можно прикрутить к FIQ
да и вообще кто нибудь __global_reg() использовал?
aaarrr
Цитата(KRS @ Mar 23 2008, 23:30) *
а __global_reg() можно прикрутить к FIQ
да и вообще кто нибудь __global_reg() использовал?

Можно, правда обработчик в отдельный файл положить придется. Но получится криво - лучше уж позволить компилятору распределять регистры так, как ему удобно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.