ads交互工作-某科技公司arm培训ppt

上传人:繁星 文档编号:88246931 上传时间:2019-04-22 格式:PPT 页数:27 大小:189KB
返回 下载 相关 举报
ads交互工作-某科技公司arm培训ppt_第1页
第1页 / 共27页
ads交互工作-某科技公司arm培训ppt_第2页
第2页 / 共27页
ads交互工作-某科技公司arm培训ppt_第3页
第3页 / 共27页
ads交互工作-某科技公司arm培训ppt_第4页
第4页 / 共27页
ads交互工作-某科技公司arm培训ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《ads交互工作-某科技公司arm培训ppt》由会员分享,可在线阅读,更多相关《ads交互工作-某科技公司arm培训ppt(27页珍藏版)》请在金锄头文库上搜索。

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

2、序头来切换,并调用Thumb 程序,交互指令,交互的实现采用跳转交换指令(BX) 在Thumb状态 BX Rn 在ARM状态 (支持Thumb的内核) BX Rn 其中Rn可以是 (r0r15)中的任何一个. 这将通过拷贝 Rn 到 PC 来实现在 4GB 空间内的一个绝对跳转. 其中Rn 的 Bit-0 表明切换到何种状态.,状态切换,ARM / Thumb 选择位 0 - ARM state 1 - Thumb state,Rn,目的地址,31,31,0,1,0/1,BX,PC,分支交换示例,CODE32 ; Start off in ARM state ADR r0,Into_Thumb

3、+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 b

4、ack to ARM state. : CODE32 ; Assemble subsequent code as ARM. Back_to_ARM :,提纲,交互基础 交互子程序 ARM 5T 架构扩展,无交互子程序,实现一个通常的子程序调用需要如下两步: 保存返回地址到寄存器(LR) 跳转到对应的子程序地址 调用实现通常只需要一个指令: BL func2 返回实现通常只需从 LR 恢复 PC: MOV pc,lr,. . BL func2 . .,: MOV pc,lr,func1,func2,void func1 (void) : func2(); : ,混合的ARM/Thumb子程序,在

5、使用 C / C+ 写程序时,可以自由的编译为 ARM ( 使用armcc/armcpp) 或 Thumb ( 使用tcc/tcpp). 需要一些编译方法来解决在一种状态下的函数调用另一种状态下的函数的问题. 涉及到的问题: BL 不能完成状态切换 需要使用 BX 切换 BX 不能自动保存返回地址到 LR 需要其它方法来解决这个问题 从子程序返回,要使用 BX LR 以便返回先前的状态 BL 在 Thumb 状态下可能设置了 LR 的 lsb (bit-0) 不能使用 MOV PC,LR 返回,因为不能实现状态切换,交互子程序,任何包含使用交互调用函数的 C 模块的编译必须使用 -apcs /

6、interwork 命令行选项. 编译器将使用 BX 实现函数返回来替代 MOV PC,LR. 连接器生成一小段代码(veneers)来改变状态 当发现交互调用时自动加入目标文件 使用 armlink -info veneers 可以看到加入的“ veneers”的大小,: BL :,: BX,: BX,func1,func2,连接程序生成 veneer,(compiled for interworking),ARM 4T架构对交互编译的影响,leaf function使用 BX 返回. Non_leaf function将被交互编译: 在入口处( 调用 BL 之前)压栈保护返回地址 在入口处

7、保护所有函数使用的寄存器 使用 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,汇编程序交互工作和Veneers,连接程序将会自动加入ARM / Thumb交互 veneers到汇编源代码. 主调程序需要: 使用 ar

8、masm -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.,; armasm arm.s AREA Arm,CODE,READONLY IMPORT ThumbSub ENTRY CODE32 A

9、RMProg MOV r0, #1 BL ThumbSub ;call Thumb subroutine MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 ;ARM semihosting SWI END ; armasm thumb.s -apcs /interwork AREA Thumb,CODE,READONLY EXPORT ThumbSub CODE16 ThumbSub MOV r1, #2 BX lr ;return to caller END,汇编程序交互工作 (1),汇编程序交互工作 (2),使用Debugger反汇编代码: ARMPr

10、og 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

11、r1,#2 0x0000809a: 0x4770 : bx lr 交互veeners在下一个字的边界 0x0000809c: 0xe59fc000 : ldr r12,0x80a4 ; =#ThumbSub+0x1 0x000080a0: 0xe12fff1c : bx r12 0x000080a4: 0x00008099 : Literal Pool Value,C / 汇编使用 Veneers交互工作,运行在一种状态下的 C 代码可能调用运行在另一种状态下的汇编程序,反之亦然。 这时的 veneers 由连接程序自动生成。 如果主调函数是 C 函数, 编译时使用 -apcs /interw

12、ork 如果主调函数是汇编函数, 汇编时使用 -apcs /interwork 且返回使用 BX LR 任何使用这些的汇编程序必须符合 ATPCS 标准 ,( e.g. 函数参数传递使用 r0-r3 & r12 不受保护的),非交互的 Thumb 代码,允许Thumb-Thumb调用,交互的Thumb 代码,非交互的 ARM 代码,交互的ARM 代码,允许非交互的调用交互的,不可调用,允许ARM/Thumb 调用,交互调用,最好使用交互选项build所有的程序,连接交互工作的目标代码,为了顺利连接: 必须使用统一的 APCS 标准“built”所有的 C/C+/Asm 文件. 要使用相应的交互

13、工作库 连接程序发现任何的不协调就会给出一个错误: 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

14、 call to arm_function from thumbmain.o(.text) 小心非法的间接调用 (e.g. 函数指针, 动态跳转表) 连接器对这种情况在连接时是不会给出警告的。,使用 CodeWarrior 交互工作,使用 Thumb /ARM 交互工作工程模板 向 ARMDebugRel 目标加入ARM C, C+ & Asm 模块 编译 C 模块使用 armcc -apcs /interwork 编译 C+ 模块使用armcpp -apcs /interwork 编译 ASM 模块使用armasm -32 -apcs /interwork 向 ThumbDebugRel 目

15、标加入Thumb C, C+ & Asm 模块 编译 C 模块使用 tcc -apcs /interwork 编译 C+ 模块使用tcpp -apcs /interwork 编译 ASM 模块使用armasm -16 -apcs /interwork ARMDebugRel 将会被编译连接 (部分连接)成 ThumbDebugRel的一个子目标,提纲,交互工作基础 交互工作子程序 ARM 5T 架构扩展,Architecture 5T Interworking,ARM 5T 架构增加了对交互工作的支持 消除了对veneers的需求 兼容ARM 4T 架构的代码 改良内容包括 新的 BLX 指令 修正了加载 PC 的动作,ARM 调用Thumb子程序 通常切换到 Thumb 状态 32 MB 分支范围 返回地址保存在 LR 中 使用 BX LR 从子程序返回 无条件指令 Thumb 调用ARM子程序 转化为两个16-bit 指令 偏移范围同 Thumb 的 BL 指令 i.e. +/- 4MB 范围 返回地址保存在LR (同时设置LSB),BLX ,: BLX offset :,: BX lr,ARM,Thumb,CPSR T bit = 1,BLX Rm,ARM / Thumb选择位 0 - ARM state

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作范文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号