27
1 TM T H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D ARM / Thumb 交交交交

ARM / Thumb 交互工作

Embed Size (px)

DESCRIPTION

ARM / Thumb 交互工作. 议程. 交互工作基础 交互子程序 ARM 5T 架构扩展. 交互需求. Thumb 的代码密度和在窄存储器上性能 , 使得它用在很多有大量 C 代码的系统上比较理想 . 然而在很多应用中还是需要在 ARM/Thumb 两种状态之间切换 : 在宽的存储器上 ARM 代码能提供很好的性能 在一个应用中,速度关键的部分用 ARM 代码实现是不错的 一些函数只能用 ARM 指令实现, e.g. 存取 CPSR ( 使能 / 禁止中断和状态的改变) 操作协处理器 异常处理 - PowerPoint PPT Presentation

Citation preview

Page 1: ARM / Thumb  交互工作

1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D

ARM / Thumb 交互工作

Page 2: ARM / Thumb  交互工作

2TM 264v04 ARM / Thumb Interworking with ADS

议程

交互工作基础交互子程序ARM 5T 架构扩展

Page 3: ARM / Thumb  交互工作

3TM 364v04 ARM / Thumb Interworking with ADS

交互需求 Thumb 的代码密度和在窄存储器上性能 ,使得它用在很多有大量 C 代码的系统上比较理想 . 然而在很多应用中还是需要在 ARM/Thumb 两种状态之间切

换 :

在宽的存储器上 ARM 代码能提供很好的性能 在一个应用中,速度关键的部分用 ARM 代码实现是不错的

一些函数只能用 ARM 指令实现, e.g. 存取 CPSR ( 使能 / 禁止中断和状态的改变 ) 操作协处理器

异常处理 异常处理时自动进入 ARM 状态,但系统要求主程序用 Thumb 代码实现

独立的 Thumb 程序也需要一个 ARM 的汇编程序头来切换,并调用 Thumb 程序

Page 4: ARM / Thumb  交互工作

4TM 464v04 ARM / Thumb Interworking with ADS

交互指令 交互的实现采用跳转交换指令 (BX)

在 Thumb 状态BX Rn

在 ARM 状态 ( 支持 Thumb 的内核 )

BX< 条件 > Rn其中 Rn 可以是 (r0~r15) 中的任何一个 .

这将通过拷贝 Rn 到 PC 来实现在 4GB 空间内的一个绝对跳转.

其中 Rn 的 Bit-0 表明切换到何种状态 .

Page 5: ARM / Thumb  交互工作

5TM 564v04 ARM / Thumb Interworking with ADS

状态切换

ARM / Thumb 选择位0 - ARM state

1 - Thumb state

Rn 目的地址

31 01

31 01

0/1

BX

PC

Page 6: ARM / Thumb  交互工作

6TM 664v04 ARM / Thumb Interworking with ADS

分支交换示例CODE32 ; Start off in ARM state ADR r0,Into_Thumb+1; Generate branch target address and set

; bit 0, hence arrive in Thumb state.BX r0 ; Branch exchange to Thumb state. :CODE16 ; Assemble subsequent code as Thumb.

Into_Thumb :ADR r5, Back_to_ARM ; Generate branch target to word aligned

; address - hence bit 0 is clear.BX r5 ; Branch exchange back to ARM state. :CODE32 ; Assemble subsequent code as ARM.

Back_to_ARM :

Page 7: ARM / Thumb  交互工作

7TM 764v04 ARM / Thumb Interworking with ADS

提纲

交互基础 交互子程序

ARM 5T 架构扩展

Page 8: ARM / Thumb  交互工作

8TM 864v04 ARM / Thumb Interworking with ADS

无交互子程序 实现一个通常的子程序调用需要如下两步 :

保存返回地址到寄存器 (LR) 跳转到对应的子程序地址

调用实现通常只需要一个指令 : BL func2 返回实现通常只需从 LR 恢复 PC: MOV pc,lr

.

.

BL func2..

:MOV pc,lr

func1 func2void func1 (void){ :

func2();:

}

Page 9: ARM / Thumb  交互工作

9TM 964v04 ARM / Thumb Interworking with ADS

混合的 ARM/Thumb 子程序 在使用 C / C++ 写程序时,可以自由的编译为 ARM ( 使用 armcc/armcpp) 或 Thumb ( 使用 tcc/tcpp).

需要一些编译方法来解决在一种状态下的函数调用另一种状态下的函数的问题 .

涉及到的问题 : BL 不能完成状态切换

需要使用 BX 切换 BX 不能自动保存返回地址到 LR

需要其它方法来解决这个问题 从子程序返回,要使用 BX LR 以便返回先前的状态

BL 在 Thumb 状态下可能设置了 LR 的 lsb (bit-0) 不能使用 MOV PC,LR 返回,因为不能实现状态切换

Page 10: ARM / Thumb  交互工作

10TM 1064v04 ARM / Thumb Interworking with ADS

交互子程序 任何包含使用交互调用函数的 C 模块的编译必须使用 -apcs /interwork 命令行选项 .

编译器将使用 BX 实现函数返回来替代 MOV PC,LR.

连接器生成一小段代码 (‘veneers’) 来改变状态 当发现交互调用时自动加入目标文件 使用 armlink -info veneers 可以看到加入的“ veneers” 的大小 ,

:BL:

:BX

:BX

func1 func2

连接程序生成 veneer

(compiled for interworking)

Page 11: ARM / Thumb  交互工作

11TM 1164v04 ARM / Thumb Interworking with ADS

ARM 4T 架构对交互编译的影响 leaf function 使用 BX 返回 . Non_leaf function 将被交互编译 :

在入口处 ( 调用 BL 之前 ) 压栈保护返回地址 在入口处保护所有函数使用的寄存器 使用 BX 实现返回操作 ( 替代弹出 PC).

C 源代码 armcc -apcs /interwork tcc -apcs /interwork

void func(void) func func{ STMFD sp!,{r4-r11,lr} PUSH {r4-r7,lr} : : : sub(); BL sub BL sub : : : : LDMFD sp!,{r4-r11,lr} POP {r4-r7}} BX lr POP {r3} BX r3

Page 12: ARM / Thumb  交互工作

12TM 1264v04 ARM / Thumb Interworking with ADS

汇编程序交互工作和 Veneers

连接程序将会自动加入 ARM / Thumb 交互 veneers 到汇编源代码 . 主调程序需要 :

使用 armasm -apcs /interwork 汇编 导出自己的符号 , e.g. EXPORT ThumbSub 使用 BX 实现返回

主调程序使用 BL 指令调用子程序 .

Note: AREA 将包含 :AREA Thumb,CODE,READONLY,INTERWORK

如果如此, armasm 将警告 :INTERWORK area directive is obsolete.Continuing as if -apcs /inter selected.

Page 13: ARM / Thumb  交互工作

13TM 1364v04 ARM / Thumb Interworking with ADS

; armasm arm.sAREA Arm,CODE,READONLYIMPORT ThumbSubENTRYCODE32

ARMProgMOV r0, #1BL ThumbSub ;call Thumb subroutineMOV r0, #0x18LDR r1, =0x20026SWI 0x123456 ;ARM semihosting SWIEND

; armasm thumb.s -apcs /interworkAREA Thumb,CODE,READONLYEXPORT ThumbSubCODE16

ThumbSubMOV r1, #2BX lr ;return to callerEND

汇编程序交互工作 (1)

Page 14: ARM / Thumb  交互工作

14TM 1464v04 ARM / Thumb Interworking with ADS

汇编程序交互工作 (2)

使用 Debugger 反汇编代码 :ARMProg

0x00008080: 0xe3a00001 : mov r0,#1

0x00008084: 0xeb000004 : bl 0x809c ; (ThumbSub + 0x4)

0x00008088: 0xe3a00018 : mov r0,#0x18

0x0000808c: 0xe59f1000 : ldr r1,0x8094 ; =#0x00020026

0x00008090: 0xef123456 : swi 0x123456

0x00008094: 0x00020026 : Literal Pool Value

ThumbSub

0x00008098: 0x2102 : mov r1,#2

0x0000809a: 0x4770 : bx lr

交互 veeners 在下一个字的边界0x0000809c: 0xe59fc000 : ldr r12,0x80a4 ; =#ThumbSub+0x10x000080a0: 0xe12fff1c : bx r120x000080a4: 0x00008099 : Literal Pool Value

Page 15: ARM / Thumb  交互工作

15TM 1564v04 ARM / Thumb Interworking with ADS

C / 汇编使用 Veneers 交互工作 运行在一种状态下的 C 代码可能调用运行在另一种状态下的汇编程序,反之亦然。 这时的 veneers 由连接程序自动生成。

如果主调函数是 C 函数, 编译时使用 -apcs /interwork

如果主调函数是汇编函数 , 汇编时使用 -apcs /interwork 且返回使用 BX LR

任何使用这些的汇编程序必须符合 ATPCS 标准 ,( e.g. 函数参数传递使用 r0-r3 & r12 不受保护的)

Page 16: ARM / Thumb  交互工作

16TM 1664v04 ARM / Thumb Interworking with ADS

非交互的 Thumb 代码

允许 Thumb-Thumb 调用

交互的Thumb 代码

非交互的 ARM 代码

允许 ARM-ARM 调用

交互的ARM 代码

允许非交互的调用交互的

不可调用

允许 ARM/Thumb 调用

交互调用 最好使用交互选项 build 所有的程序

Page 17: ARM / Thumb  交互工作

17TM 1764v04 ARM / Thumb Interworking with ADS

连接交互工作的目标代码 为了顺利连接 :

必须使用统一的 APCS 标准“ built” 所有的 C/C++/Asm 文件 . 要使用相应的交互工作库

连接程序发现任何的不协调就会给出一个错误 :Invalid call from THUMB code in thumbmain.o(.text)to ARM symbol arm_function.

修正编译器 / 汇编器的配置 (e.g. 加上 -apcs/interwork) ,然后重新连编。 连接时使用‘ -info veneers’ 来得到增加的 veneers 的概况 , e.g.:

Adding AT veneer (12 bytes) for call to '_printf’from Thumb_to_ARM.o(.text)

Adding TA veneer (12 bytes) for call to 'arm_function’from thumbmain.o(.text)

小心非法的间接调用 (e.g. 函数指针 , 动态跳转表 ) – 连接器对这种情况在连接时是不会给出警告的。

Page 18: ARM / Thumb  交互工作

18TM 1864v04 ARM / Thumb Interworking with ADS

使用 CodeWarrior 交互工作 使用 Thumb /ARM 交互工作工程模板 向 ARMDebugRel 目标加入 ARM C, C++ & Asm 模块

编译 C 模块使用 ‘ armcc -apcs /interwork’ 编译 C++ 模块使用‘ armcpp -apcs /interwork’ 编译 ASM 模块使用‘ armasm -32 -apcs /interwork’

向 ThumbDebugRel 目标加入 Thumb C, C++ & Asm 模块 编译 C 模块使用 ‘ tcc -apcs /interwork’ 编译 C++ 模块使用‘ tcpp -apcs /interwork’ 编译 ASM 模块使用‘ armasm -16 -apcs /interwork’

ARMDebugRel 将会被编译连接 ( 部分连接 ) 成 ThumbDebugRel 的一个子目标

Page 19: ARM / Thumb  交互工作

19TM 1964v04 ARM / Thumb Interworking with ADS

提纲

交互工作基础交互工作子程序

ARM 5T 架构扩展

Page 20: ARM / Thumb  交互工作

20TM 2064v04 ARM / Thumb Interworking with ADS

Architecture 5T Interworking

ARM 5T 架构增加了对交互工作的支持 消除了对 veneers 的需求 兼容 ARM 4T 架构的代码

改良内容包括 新的 BLX 指令 修正了加载 PC 的动作

Page 21: ARM / Thumb  交互工作

21TM 2164v04 ARM / Thumb Interworking with ADS

ARM 调用 Thumb 子程序

通常切换到 Thumb 状态 32 MB 分支范围 返回地址保存在 LR 中

使用 BX LR 从子程序返回 无条件指令

Thumb 调用 ARM 子程序 转化为两个 16-bit 指令 偏移范围同 Thumb 的 BL 指令

i.e. +/- 4MB 范围 返回地址保存在 LR ( 同时设置 LSB)

BLX <offset>

:BLX offset

: :BX lr

ARM Thumb

CPSR T bit = 1

Page 22: ARM / Thumb  交互工作

22TM 2264v04 ARM / Thumb Interworking with ADS

BLX Rm

ARM / Thumb 选择位0 - ARM state

1 - Thumb state

Rm 目的地址

31 01

31 01

0/1

0

BLX Rm

和标准的 BX 指令相同,除了保存返回地址到 Lr 中 ARM 版本下可条件执行 Thumb 版本下

单一的 16-bit 指令 LR 的 LSB 将被设置

使用 BX LR 从子程序返回

PC

Page 23: ARM / Thumb  交互工作

23TM 2364v04 ARM / Thumb Interworking with ADS

LDM {cond} <addressing mode> Rn, {…,PC} 增加了对交互的支持表 v4T behaviour with extra support for interworking 如果 PC 是一个加载寄存器那么

加载值的 bit[0] 将被写入 CPSR 的 T-bit ( 这将可能导致一状态切换 )

用作恢复寄存器同时从子程序返回

用来替换 LDMFD sp!,{...,LR} + BX LR Thumb POP {…,PC} 有同样的功能 LDR PC, [Rn,...] 同样依据加载值的 0-bit 来设置 CPSR 的 T-bit

可以用作跳转表 没有相当的 Thumb 指令

LDMFD sp!,{…,PC} 0...0 0010 1110 110 1PC =

CPSR = cond T mode

送数到 PC

Page 24: ARM / Thumb  交互工作

24TM 2464v04 ARM / Thumb Interworking with ADS

ARM 5T 架构对交互编译的影响 叶函数简单使用 BX 来返回 .

非叶函数被编译成交互格式 : 在入口处 ( 调用 BL 之前 ) 压栈保护返回地址 在入口处保护所有函数使用的寄存器 弹出 PC 来实现返回(可能导致状态切换) .

C source code armcc -cpu 5T -apcs /inter tcc -cpu 5T -apcs /inter

void func(void) func func{ STMFD sp!,{r4-r11,lr} PUSH {r4-r7,lr} : : : sub(); BL sub BL sub : : :} LDMFD sp!,{r4-r11,pc} POP {r4-r7,pc}

连接程序将根据需要修正 BX 为 BLX

Page 25: ARM / Thumb  交互工作

25TM 2564v04 ARM / Thumb Interworking with ADS

更详细的资料 ...

ADS Developer Guide, Chapter 4,

Interworking ARM and Thumb

Page 26: ARM / Thumb  交互工作

26TM 2664v04 ARM / Thumb Interworking with ADS

Quiz

1) What determines whether a state change occurs when a BX instruction is executed?

2) What are the difference between a BX and a BL instruction?

3) What must you do to interwork C functions?

4) What must you do to interwork assembler functions?

5) What advantage do the Architecture 5T BLX instructions give ?

Page 27: ARM / Thumb  交互工作