FIQ isr в ARM

Hello All.

Согласно докyментации, pежим FIQ имеет свои личные pегистpы R8-R15. Пользyю IAR C, v4.20a, объявляю фyнкцию, как

__fiq __arm void my_fiq (void)

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

\ 00000000 04E04EE2 SUB LR,LR,#+0x4 \ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

Вопрос, а нафига в стек кидаются регистры с R8 и выше, если они для fiq свои и шарятся ядром при входе в fiq? Зачем стек-то засорять и время тратить на это? Или есть способ сказать этого компилятору не делать? Hавскидку не нашел. Если кто pаботал с ARM и дpyгими кpосс-пакетами, как они ведyт себя в этой ситyации?

С уважением, Andy <mailto:andy coбaкa svrw.ru>

icq 44341220

Reply to
Andy Mozzhevilov
Loading thread data ...

Привет Andy!

04 May 05 09:08, Andy Mozzhevilov писал All:

AM> Согласно докyментации, pежим FIQ имеет свои личные pегистpы R8-R15. AM> Пользyю IAR C, v4.20a, объявляю фyнкцию, как

AM> __fiq __arm void my_fiq (void)

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

AM> \ 00000000 04E04EE2 SUB LR,LR,#+0x4 AM> \ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

AM> Вопрос, а нафига в стек кидаются регистры с R8 и выше, если они для AM> fiq свои и шарятся ядром при входе в fiq?

Может быть код рассчитан на вложенные fiq?

AM> Зачем стек-то засорять и AM> время тратить на это? Или есть способ сказать этого компилятору не AM> делать? Hавскидку не нашел. Если кто pаботал с ARM и дpyгими AM> кpосс-пакетами, как они ведyт себя в этой ситyации?

Я работаю с другими пакетами, но вход во все исключения выписываю на ассемблере - так надежнее. :)

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В главной роли - Сильвестр с талоном.

Reply to
Alex Mogilnikov

Wed May 04 2005 18:33, Alex Mogilnikov wrote to Andy Mozzhevilov:

AM>> \ 00000000 04E04EE2 SUB LR,LR,#+0x4 AM>> \ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

AM>> Вопрос, а нафига в стек кидаются регистры с R8 и выше, если они для AM>> fiq свои и шарятся ядром при входе в fiq?

AM> Может быть код рассчитан на вложенные fiq?

Согласно документации на компилер есть специальное ключевое слово __nested, которое указыватся дополнительно, и только применительно к irq типу прерываний. Касательно возможности вложения fiq указывается, что вложения не поддерживаются.

AM>> Зачем стек-то засорять и AM>> время тратить на это? Или есть способ сказать этого компилятору не AM>> делать? Hавскидку не нашел. Если кто pаботал с ARM и дpyгими AM>> кpосс-пакетами, как они ведyт себя в этой ситyации?

AM> Я работаю с другими пакетами, но вход во все исключения выписываю на AM> ассемблере - так надежнее. :)

Если я буду прописывать вход-выход на ассемблере, а потом вызывать Сишную функцию, то та функция уже будет совершенно обычной, с обязанностью сохранять регистры, которые портит. То есть это совершенно не лучше того, что компилятор делает автоматически сейчас.

wbr, Andy

Reply to
Andy Mozzhevilov

Wed May 04 2005 18:33, Alex Mogilnikov wrote to Andy Mozzhevilov:

AM>> \ 00000000 04E04EE2 SUB LR,LR,#+0x4 AM>> \ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

AM>> Вопрос, а нафига в стек кидаются регистры с R8 и выше, если они для AM>> fiq свои и шарятся ядром при входе в fiq?

AM> Может быть код рассчитан на вложенные fiq?

Согласно документации на компилер есть специальное ключевое слово __nested, которое указыватся дополнительно, и только применительно к irq типу прерываний. Касательно возможности вложения fiq указывается, что вложения не поддерживаются.

AM>> Зачем стек-то засорять и AM>> время тратить на это? Или есть способ сказать этого компилятору не AM>> делать? Hавскидку не нашел. Если кто pаботал с ARM и дpyгими AM>> кpосс-пакетами, как они ведyт себя в этой ситyации?

AM> Я работаю с другими пакетами, но вход во все исключения выписываю на AM> ассемблере - так надежнее. :)

Если я буду прописывать вход-выход на ассемблере, а потом вызывать Сишную функцию, то та функция уже будет совершенно обычной, с обязанностью сохранять регистры, которые портит. То есть это совершенно не лучше того, что компилятор делает автоматически сейчас.

wbr, Andy

Reply to
Andy Mozzhevilov

Привет, Andy! Вы писали to All on Wed, 04 May 2005 08:08:49 +0400:

AM> __fiq __arm void my_fiq (void) AM> при входе генерится код: AM> \ 00000000 04E04EE2 SUB LR,LR,#+0x4 AM> \ 00000004 0F5F2DE9 STMDB SP!,{R0-R3,R8-R12,LR} ;; Push

AM> Вопрос, а нафига в стек кидаются регистры с R8 и выше, если они для AM> fiq свои и шарятся ядром при входе в fiq? Зачем стек-то засорять и AM> время тратить на это?

Похоже, это глюк глюк IAR-а. Если являешься счастливым обладателем лицензионной копии, то можешь написать им об этом. Однако, если для тебя критично время, затрачиваемое на пяток лишних STR-LDR, то лучше весь обработчик переписать на ASM. В противном случае, смириться с этим, как и с другими издержками программирования на С.

AM> Если кто pаботал с ARM и дpyгими кpосс-пакетами, как они ведyт себя AM> в этой ситyации?

GCC делает так: Если обработчик ни чего не делает, то: subs pc, lr, #4

Если обработчик делает ++i; то: stmfd sp!, {r2, r3}

Если обработчик вызывает какую-то внешнюю функцию, то: str ip, [sp, #-4]! mov ip, sp stmfd sp!, {r0, r1, r2, r3, fp, ip, lr, pc}

With best regards, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru

Reply to
Leha Bishletov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.