Setting ARM CPSR to C variable

Nov 18, 2008 2 Replies

Im using the TI Code Composer suite with an ARM 7 and Im looking for a way to get the CPSR back into a C variable. I was looking through the documentation that came with the compiler and it didnt have quite what I was looking for. What Im need to do is get the state of the interrupt disable bit. I need to use this bit as a condition variable for something like:



===



if (interrupts enabled){ do this }



===



the inline asm syntax is just



=== asm("assembly"); ===



The problem is, Im not sure how to associate some C variable to the asm code to pass the CPSR back to the C code flow. Ive used other compilers in the past that have an option to pass arguments to the asm code like



=== _asm("tfr b, ccr",foo); ===


which passes the condition code register (for an HC12) to the var foo, but this compiler does not have that capability.



I first tried



===



volatile ui32_t cpsrstat; asm(" .global _cpsrstat"); // cpsrstat defined in C code asm("_cpsrstat .set r0"); // set variable to r0 asm(" mrs r0,cpsr"); // move CPSR to r0



===



With this Im getting an illegal mnemonic error at the MRS instruction. Am I barking up the wrong tree here?


This is how you do it in GCC just in case it helps. I didn't write it, but I can confirm that it does work.

static inline unsigned asm_get_cpsr(void) { unsigned long retval; asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); return retval; }

I did not get to see if this compiles, but this should work.

static inline unsigned asm_get_cpsr(void) { unsigned long retval; __asm (" mrs r0, cpsr" ); __asm (" mrs retval, r0" ); return retval; }

or slightly shorter, directly in an asm function in a C module:

asm_get_cpsr: .asmfunc mrs r0,cpsr ; get cpsr mov pc, lr ; return to caller .endasmfunc

Scott

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required