2013-05-03 1 views
2

Je souhaite avoir une routine d'interruption dans SRAM sur un LPC1768. J'utilise une chaîne d'outils GCC similaire à Yagarto. Actuellement je peux faire ce qui suit de C:Interruption de l'assembleur de pouce dans la section SRAM personnalisée

NVIC_SetVector(TIMER0_IRQn, interruptTest); 

... Puis dans mon dossier de montage:

.text 
/* .section .fastcode */ 
    .global  interruptTest 
    .func  interruptTest 
    .thumb_func 
interruptTest: 
    ldr   r0,=(LPC_TIM0 + IR) /* point to Timer 0's Interrupt Register */ 
    mov   r1,#(1 << 0)   /* Interrupt Pending bit for MR0 int */ 
    str   r1,[r0]    /* Clear it */ 

    bx   lr 

    .size  interruptTest, . - interruptTest 
    .endfunc 

Maintenant, cela fonctionne très bien, le pointeur sur la fonction « interruptTest » est bizarre . Toutefois, lorsque j'active le bit '.section .fastcode', le pointeur sur l'interruption devient même au lieu de impair.

Ma question est: Comment faire pour que la routine d'interruption soit reconnue comme une fonction du pouce?

+1

Ajouter '.thumb' quelque part? '.section .fastcode' est une section de l'éditeur de liens. Je vois que c'est du code avec différents LMA/VMA de certains googling; mais je ne suis pas sûr que vous vous référez à la même chose. Avez-vous plus d'informations sur '.fastcode'? Est-ce comme [cette question] (http://stackoverflow.com/questions/13831462/understanding-the-location-counter-of-gnu-linker-scripts)? –

+0

J'ai déjà essayé d'ajouter '.thumb' juste au-dessus de '.thumb_func', mais cela n'a fait aucune différence, donc je l'ai omis pour éviter toute confusion. La section .text fonctionne toujours, sans rien modifier d'autre. Le linker-script que j'ai utilisé est ici: [link] (http://openlcb.sourceforge.net/trunk/scratchpads/dgoodman/OpenLCB_Template/makesection/LPC17xx.ld) –

+0

Note: J'ai dû corriger le lien - script, de sorte que la section BSS ne remplace pas les sections .fastcode et .data. J'ai envoyé des rapports de bug à l'auteur à ce sujet. –

Répondre

3

Got it! L'insertion de '.type interruptTest,% function' permet de le faire fonctionner.

donc la source finale devrait être:

.section .fastcode,"ax",%progbits 
    .global  interruptTest 
    .func  interruptTest 
    .type  interruptTest,%function 
    .thumb_func 
interruptTest: 
    ldr   r0,=(LPC_TIM0 + IR) /* point to Timer 0's Interrupt Register */ 
    mov   r1,#(1 << 0)   /* Interrupt Pending bit for MR0 int */ 
    str   r1,[r0]    /* Clear it */ 

    bx   lr 

    .size  interruptTest, . - interruptTest 
    .endfunc 

Important: La "hache",% progbits ont été ajoutés à la directive .Section, car sinon la section sera parfois ignorée.

Questions connexes