Reply by Not Really Me●November 19, 20082008-11-19
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
Reply by Anthony Fremont●November 18, 20082008-11-18
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;
}
Reply by Luken8r●November 18, 20082008-11-18
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?