Hello,
entry of interrupts must be compiled in ARM mode. If you return from a
function or interrupt by LR (return address in link register) you do not
need to take care about ARM&Thumb. If you want to jump to a Thumb
function from ARM mode you can use a these instructions
bx ip ;Branch (simple jump)
blx label ;Branch with link register (call subfuction)
All addresses have an even value due to its 32bit (ARM) or 16bit (Thumb)
instruction length. But if you branch to an odd address
(destination_addr + 1) the ARM core will enter Thumb state. If the
address is even it will assume that the code is in ARM mode
/* ARM mode */
1000: ...
1004: blx 2001 ;Call sub-function "subfunc" @0x2000
1008: ...
/* Thumb mode */
subfunc:
2000: push {r4, lr} ;LR = 0x1008 (even: this was ARM mode)
...
2010: pop {r4}
2012: pop {r0} ;R0 = LR
2014: bx r0 ;return (and enter ARM mode again)
-------------------------------------------------------------
/* Thumb mode */
1000: ...
1002: blx 2001 ;Call sub-function "subfunc" @0x2000
1004: ...
/* Thumb mode */
subfunc:
2000: push {r4, lr} ;LR = 0x1005 (odd: this was Thumb mode)
...
2010: pop {r4}
2012: pop {r0} ;R0 = LR
2014: bx r0 ;return (and stay in Thumb mode again)
See the ARM7TDMI technical reference manual for details.
When using GNU gcc don't forget to compile your gcc with the feature
'thumb-interworking' and all objects of your project with the command
line option '--mthumb-interwork'.
Sten
Tom Walsh wrote:
> wiese_matthias wrote:
>
>
>>Hi,
>>we are programming a lpc2294 and have problems with the ARM/THUMB mode.
>>We'd like to use the mixed mode (arm & thumb mode) to save time
>>loading the programs from a 16-Bit flash memory. Unfortunately the
>>program get stucked if an interrupts occurs when we are using the
>>mixed mode. With the arm mode everything works fine.
>>Can someone tell us how we can also work in the thumb mode?
>>Thank you!
>>Matthias
>>
>>
>>
>>
>
> I was just reading something about that up at arm.com. Something about
> having interrupt handlers written / compiled in thumb. IIRC, the ARM
> processors start in ARM mode, then you have to "BX" them into thumb
> mode. Same thing with the Interrupts, the interrupts entry is in ARM
> mode of operation, so you have to enter & leave the handlers properly.
>
> IIRC, Chapter 7 explains this: SDT2.50 User Guide
> <http://www.arm.com/pdfs/sdt250usrman.pdf>
>
> I looked at thumb, I'm not ready to mess with interworking yet.
>
> TomW
>
--
/************************************************
Do you need a tiny and efficient real time
operating system (RTOS) with a preemtive
multitasking for LPC2000 or AT91SAM7?
http://nanortos.net-attack.de/
Or some open-source tools and code for LPC2000?
http://www.net-attack.de/
************************************************/Message
Re: [lpc2000] ARM mode
2005-10-17 by Sten
Attachments
- No local attachments were found for this message.