Hi everyone,
I have posted to this forum a couple months ago about using the enable_irq()/disable_irq() instruction intrinsics in RealView Compiler (ARMCC V4.0.0.728). In that occasion, I set up two software interrupts for calling such intrinsics, as they only have the intended effect when not in User Mode.
Just now, though, I realized that interrupts were not being disabled. I know for a fact that my SWI are set up appropriately, because they change the value of a flag I set up. Does anyone have any clue what could be happening? Documentation seems to be pretty clear about the fact that one enters supervisor mode during SWI, and that would be appropriate for enabling/disabling interrupts, but I must be missing something.
Relevant source code
void __SWI_8 (void) { __enable_irq(); __enable_fiq(); interrupts_enabled = 1; } void __SWI_9 (void) { __disable_irq(); __disable_fiq(); interrupts_enabled = 0; }
Relevant links
Instruction Intrinsics http://www.keil.com/support/man/docs/armcc/armcc_chdfgfab.htm
disable_irq() www.keil.com/.../armccref_CJAFBCBB.htm
enable_irq() www.keil.com/.../armccref_CJAEAEHA.htm
ARMCC: MODIFY IRQ FLAG TO ENABLE/DISABLE INTERRUPTS (RealView Compiler V3) http://www.keil.com/support/docs/3229.htm
Thanks in advance, -- George Andrew Brindeiro Robotron Automation and Technology
http://www.keil.com/support/man/docs/armcc/armcc_Chdgddcj.htm
Restrictions on inline assembly operations
Some low-level features that are available in the ARM assembler armasm, such as branching and writing to PC, are not supported.
Registers such as r0-r3, sp, lr, and the NZCV flags in the CPSR must be used with caution. If you use C or C++ expressions, these might be used as temporary registers and NZCV flags might be corrupted by the compiler when evaluating the expression. See Virtual registers.
The pc, lr, and sp registers cannot be explicitly read or modified using inline assembly code because there is no direct access to any physical registers. However, you can use the following intrinsics described in the Compiler Reference Guide to access these registers: