Setting ARM CPSR to C variable

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?

Reply to
Luken8r
Loading thread data ...

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; }

Reply to
Anthony Fremont

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

Reply to
Not Really Me

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.