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

 
 
 
Reply to this topicStart new topic
> IAR С и FIQ прерывание, зачем IAR кидает в стек R8-R14?
Andy Mozzhevilov
сообщение May 3 2005, 11:14
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Есть прерывание, объявленное как 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? Зачем стек-то засорять и время тратить на это?
Или есть способ сказать этого компилятору не делать? Навскидку не нашел.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
doomer#gp
сообщение May 4 2005, 09:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 382
Регистрация: 10-03-05
Из: USA
Пользователь №: 3 234



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


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

Ключевое слово здесь - naked. -> функция без прификса и постфикса, тобиш совершенно пустая, даже без ret-а.
Go to the top of the page
 
+Quote Post
sapID
сообщение May 5 2005, 03:52
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 24
Регистрация: 21-10-04
Из: Пермь, РФ
Пользователь №: 934



У IAR во всех примерах в файле Cstartup.s79 обработчик FIQ (FIQ_Handler_Entry) сначала переходит в SVC-режим, а затем идет на твой C-обработчик (my_fiq).
Естественно, в SVC-режиме нет теневых регистров - вот он их и сохраняет.
Так как FIQ я использовал только для критичных по времени прерываний, то и писал его на ассемблере, чтобы он ничего лишнего не делал.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение May 5 2005, 05:20
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(sapID @ May 5 2005, 08:52)
У IAR во всех примерах в файле Cstartup.s79 обработчик FIQ (FIQ_Handler_Entry) сначала переходит в SVC-режим, а затем идет на твой C-обработчик (my_fiq).
Естественно, в SVC-режиме нет теневых регистров - вот он их и сохраняет.
Так как FIQ я использовал только для критичных по времени прерываний, то и писал его на ассемблере, чтобы он ничего лишнего не делал.
*


В startup нет никаких перехватов обработчика fiq и смены режима.
Я не знаю, где ты это увидел, может покажешь, но стандартный стартап
(который в src/lib лежит) вообще не устанавливает вектора, в расчете на то,
что ты будешь пользоваться для этого #pragma vecror=...
В большинстве примеров вообще вектора устанавливаются на самих себя,
видимо только для того, чтобы вообще быть куда-то установленными
Никаих дополнительных действий до входа в irq нигде не производится.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
sapID
сообщение May 6 2005, 03:28
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 24
Регистрация: 21-10-04
Из: Пермь, РФ
Пользователь №: 934



Во всех примерах в файле 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
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение May 6 2005, 11:59
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(sapID @ May 6 2005, 08:28)
Во всех примерах в файле Cstartup.s79:

*


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


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 12:28
Рейтинг@Mail.ru


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