2017-02-22 2 views
0

I einen Inline-Assembler-Code für den Arm haben Cortex-R5IAR 7.40 Compilers Erzeugung ungültiger Baugruppe

#include <stdio.h> 

#define mtcpsr(v) __asm volatile(\ 
       "msr cpsr,%0\n"\ 
       : : "r" (v)\ 
      ) 

int mfcpsr (void) 
{ 
    int rval; 
    asm("mrs %0, cpsr" : "=r"(rval)); 
    return rval; 
} 


void main(void) 
{ 

    /* 
    * Enable interrupts in the ARM 
    */ 

    mtcpsr(mfcpsr() & ~ ((0x80U) & (0x40U | 0x80U))); 
} 

dies, wenn mit IAR 7.40 Compilers in Thumb-Modus zusammengestellt von --cpu_mode = Daumen als Compiler-Flag eingestellt wird, erzeugt Baugruppe als

   `.text6`: 
       mfcpsr: 
    0xfffc040c: 0xf3ef 0x8000 MRS  R0, APSR 
    0xfffc0410: 0x4770   BX  LR 
    0xfffc0412: 0x0000   MOVS R0, R0 
       main: 
    0xfffc0414: 0xb580   PUSH {R7, LR} 
    0xfffc0416: 0xf7ff 0xfff9 BL  mfcpsr     ; 0xfffc040c 
    0xfffc041a: 0xf020 0x0080 BIC.W R0, R0, #128   ; 0x80 
    0xfffc041e: 0xf380 0x8000 MSR  ??-0-0, R0 
    0xfffc0422: 0xbd01   POP  {R0, PC} 

MSR ?? - 0-0, R0 ist die ungültige Baugruppe. Ich erwarte es als MSR CPSR_fc, R0 (was ich ohne Daumen-Option bekam). Können Sie mir helfen, das Problem zu lokalisieren?

+1

Ihre ASM sagt 'Frau' nicht 'msr'? –

+0

Hallo David, korrigiere meine Frage jetzt. Entschuldigung, dass ich das vermisse. – kvnsk

Antwort

2

Die Syntax des MSR-Befehls in Ihrem Code ist nicht korrekt. Der MSR-Befehl erfordert, dass der Name des Statusregisters, in Ihrem Fall CPSR, durch die Felder ergänzt wird, die aktualisiert werden sollen. Wenn Sie also das mtcpsr Makro Folgendes ändern erhalten Sie die erwartete Ausgabe

#define mtcpsr(v) __asm volatile(\ 
      "msr CPSR_cxsf,%0\n"\ 
      : : "r" (v)\ 
     ) 

Ich kann nur vermuten, warum der Compiler verhält sich anders in Arm und Daumen-Modus oder warum es keine Warnung ausgeben, aber es ist wahrscheinlich ein Fehler. Wenn Sie nur Interrupts aktivieren möchten, können Sie die CPSIE if Anweisung oder die __enable_interrupts() intrinsische Funktion verwenden.

+0

Hi Johan, ich habe etwas Code vergessen. Es tut uns leid. Die Abfrage wurde jetzt korrigiert. – kvnsk