EmbeddedRelated.com
Forums
Memfault Beyond the Launch

Setting ARM CPSR to C variable

Started by Luken8r November 18, 2008
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?
	




Luken8r wrote:
> 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.
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; }
Anthony Fremont wrote:
> Luken8r wrote: >> 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. > > 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

Memfault Beyond the Launch