Перейти к содержанию
    

IAR С и FIQ прерывание

Есть прерывание, объявленное как fiq :

__fiq __arm void my_fiq (void)

 

 

при входе в которое генерится код:

 

\ 00000000 04E04EE2 SUB LR,LR,#+0x4

\ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

 

Вопрос, а нафига в fiq прерывании в стек кидаются регистры с R8 и выше,

если они для fiq свои (личные и персональные) и шарятся ядром при входе в fiq? Зачем стек-то засорять и время тратить на это?

Или есть способ сказать этого компилятору не делать? Навскидку не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В gcc это делается так:

 

 

void __vector_XX (void) __attribute__((signal,naked))

{

}

 

Ключевое слово здесь - naked. -> функция без прификса и постфикса, тобиш совершенно пустая, даже без ret-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У IAR во всех примерах в файле Cstartup.s79 обработчик FIQ (FIQ_Handler_Entry) сначала переходит в SVC-режим, а затем идет на твой C-обработчик (my_fiq).

Естественно, в SVC-режиме нет теневых регистров - вот он их и сохраняет.

Так как FIQ я использовал только для критичных по времени прерываний, то и писал его на ассемблере, чтобы он ничего лишнего не делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У IAR во всех примерах в файле Cstartup.s79 обработчик FIQ (FIQ_Handler_Entry) сначала переходит в SVC-режим, а затем идет на твой C-обработчик (my_fiq).

Естественно, в SVC-режиме нет теневых регистров - вот он их и сохраняет.

Так как FIQ я использовал только для критичных по времени прерываний, то и писал его на ассемблере, чтобы он ничего лишнего не делал.

 

В startup нет никаких перехватов обработчика fiq и смены режима.

Я не знаю, где ты это увидел, может покажешь, но стандартный стартап

(который в src/lib лежит) вообще не устанавливает вектора, в расчете на то,

что ты будешь пользоваться для этого #pragma vecror=...

В большинстве примеров вообще вектора устанавливаются на самих себя,

видимо только для того, чтобы вообще быть куда-то установленными

Никаих дополнительных действий до входа в irq нигде не производится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во всех примерах в файле Cstartup.s79:

 

FIQ_Handler_Entry:

 

;- Switch in SVC/User Mode to allow User Stack access for C code

; because the FIQ is not yet acknowledged

 

;- Save and r0 in FIQ_Register

mov r9,r0

ldr r0 , [r8, #AIC_FVR]

msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC

 

;- Save scratch/used registers and LR in User Stack

stmfd sp!, { r1-r3, r12, lr}

 

;- Branch to the routine pointed by the AIC_FVR

mov r14, pc

bx r0

 

;- Restore scratch/used registers and LR from User Stack

ldmia sp!, { r1-r3, r12, lr}

 

;- Leave Interrupts disabled and switch back in FIQ mode

msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ

 

;- Restore the R0 ARM_MODE_SVC register

mov r0,r9

 

;- Restore the Program Counter using the LR_fiq directly in the PC

subs pc,lr,#4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во всех примерах в файле Cstartup.s79:

 

 

Ну во первых, не во всех, а только в примерах для атмеловских SAM7S.

В остальных примерах этого нет.

Во-вторых, я не понял, какой смысл в замене режима. Зачем им доступ к

стеку там понадобился, в простейших примерах. Делать на основе этих стартапов вывод о том, что это нужно так делать и что компилятор рассчитывает, что будет сделано именно так, я бы не стал. И делать так смысла не вижу.

Впрочем, написал в иар, может чего ответят после праздников.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...