Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прерывание fiq
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sarez
Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации fiq-прерывания в IAR под LPC (или любой другой) ? Особенно интересует содержание startup- файла. Чтоб посмотреть , как умные люди делают, а то я что-то вконец запутался...
Andy Mozzhevilov
Цитата(Sarez @ May 10 2007, 18:20) *
Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации fiq-прерывания в IAR под LPC (или любой другой) ? Особенно интересует содержание startup- файла. Чтоб посмотреть , как умные люди делают, а то я что-то вконец запутался...


Само fiq прерывание реализуется как:
Код
#pragma vector = 0x1c
__fiq __arm void FIQ_isr (void)
{
}


Необходимо также помнить, что нужно проинициализировать стек FIQ.
В стандартном startup это не делается, я делаю это в функции low_level_init в asm файле:
Код
    MODULE __low_level_init

; Mode, correspords to bits 0-5 in CPSR
MODE_BITS    DEFINE    0x1F    ; Bit mask for mode bits in CPSR
USR_MODE    DEFINE    0x10    ; User mode
FIQ_MODE    DEFINE    0x11    ; Fast Interrupt Request mode
IRQ_MODE    DEFINE    0x12    ; Interrupt Request mode
SVC_MODE    DEFINE    0x13    ; Supervisor mode
ABT_MODE    DEFINE    0x17    ; Abort mode
UND_MODE    DEFINE    0x1B    ; Undefined Instruction mode
SYS_MODE    DEFINE    0x1F    ; System mode

;; ICODE is the same segment as cstartup. By placing __low_level_init
;; in the same segment, we make sure it can be reached with BL. */

    RSEG  FIQ_STACK:DATA(2)
    RSEG  ICODE:CODE:NOROOT(2)
    PUBLIC  __low_level_init
    CODE32
__low_level_init:

    mrs     r1,cpsr                        ; Original PSR value
    bic     r0,r1,#MODE_BITS               ; Clear the mode bits
    orr     r0,r0,#FIQ_MODE                ; Set FIQ mode bits
    msr     cpsr_c,r0                      ; Change the mode
    ldr     sp,=SFE(FIQ_STACK) & 0xFFFFFFF8; End of FIQ_STACK

    msr     cpsr_c,r1                      ; Back to mode

;; Choose if segment initialization */
;; should be done or not.           */
;; Return: 0 to omit seg_init       */
;;         1 to run seg_init        */

    MOV   R0,#1

;; Return with BX to be independent of mode of caller

    BX    LR

    LTORG

    ENDMOD

    END


Сам сегмент FIQ_STACK нужно не забыть объявить. У меня это делается линкером:
-Z(DATA)FIQ_STACK+$(FIQ_STACK_SIZE)=$(RAM_START)-$(RAM_END)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.