2014-10-13 12 views
5

sto usando S5PV210 che si basa su ARM Cortex-A8Perché arm-linux-gcc unica riserva R0-r4 quando si entra in modalità IRQ

Quando dichiaro una routine di interrupt come questo:

void isr_routine(void) __attribute__ ((interrupt ("IRQ"))); 

e compilare come questo

arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $< -o [email protected] 

so che gcc passerà contesto per me da un po 'di spinta registers.Before so che questo, ho fatto manually.So io sono curioso di sapere come gcc lo fanno. Dopo lo smontaggio, ho trovato i codici come sotto

PUSH  {r0-r4,r11,r12,lr} 

Va contro la mia concezione su come cambiare contesto. In ARM Cortex-A8 documento ufficiale, è esplicito che R0-R12 è condivisa da modalità utente e IRQ mode.However lr in modalità utente è indipendente dalla IRQ mode.So, ho usato per cambiare contesto come questo

PUSH  {r0-r12} 

Va bene? Perché gcc push lr registra e perché non gcc push rigers r5-r10?

risposta

7

r4-r11 sono conservati tra le chiamate di funzione come parte dell'ARM ABI, quindi la routine di interrupt non è necessario salvarli a meno che la funzione stessa stia andando a clobber loro. Se un'altra funzione che la routine di interrupt chiama vuole modificare questi registri, è già obbligata a salvarli e ripristinarli come parte del normale ABI. Sembra che in questo set il compilatore volesse usare solo r4 e r11 (non si usano r5-r10).

Sebbene non autorevole, l'articolo di Wikipedia è di facile lettura e può essere utile: http://en.wikipedia.org/wiki/Calling_convention#ARM

3

r5-r10 sono registri di salvataggio in callee in ARM, quindi gcc li spingerà se vengono utilizzati in isr_routine. Se non vengono utilizzati (e cercheranno di non usarli se possibile), non si preoccuperanno di salvare/ripristinare il loro valore, perché non è necessario. Sto indovinando che la tua routine_sr è abbastanza semplice da non essere necessaria (tutto si adatta a r0-r4 o r11-r12)

Problemi correlati