微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Thumb指令集之: ARM和Thumb的混合编程

Thumb指令集之: ARM和Thumb的混合编程

时间:08-30 来源:3721RD 点击:

arm_function();

printf("And goodbye from Thumb World\n");

return (0);

}

/*********************

*armsub.c *

**********************/

#include <stdio.h>

void arm_function(void)

{

printf("Hello and Goodbye from ARM world\n");

}

使用下面的命令对程序进行编译连接。

① 编译生成带互交的Thumb代码。

armcc --thumb -c -g --apcs /interwork -o thumbmain.o thumbmain.c

② 编译生成带互交的ARM代码。

armcc -c -g --apcs /interwork -o armsub.o armsub.c

③ 连接目标文件。

armlink thumbmain.o armsub.o -o thumbtoarm.axf

另外,可以使用--info选项使连接器输出由于互交所增加的代码大小。

armlink armsub.o thumbmain.o -o thumbtoarm.axf --info veneers

输出信息如下所示。

Adding Veneers to the image

Adding TA veneer(4 bytes, Inline) for call to'arm_function'from thumbmain.o(.text).

Adding AT veneer (8 bytes, Inline) for call to '__0printf' from armsub.o(.text).

Adding AT veneer (8 bytes, Inline) for call to '__rt_lib_init' from kernel.o(.text).

Adding AT veneer (12 bytes,Long) for call to'__rt_lib_shutdown'from kernel.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '__rt_memclr_w' from stdio.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '__rt_raise' from stdio.o(.text).

Adding TA veneer (8 bytes, Short) for call to '__rt_exit' from exit.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '__user_libspace' from free.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '_fp_init' from lib_init.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '__heap_extend' from malloc.o(.text).

Adding AT veneer (8 bytes, Inline) for call to '__raise' from rt_raise.o(.text).

Adding TA veneer (4 bytes, Inline) for call to '__rt_errno_addr' from ftell.o(.text).

12 Veneer(s) (total 72 bytes) added to the image.

(3)Thumb状态下的功能指针

任何指向Thumb函数(由Thumb指令完成的功能函数并且其返回状态也为Thumb状态)的指针,其最低有效位(LSB)必为1。

当重定位Thumb代码中的地址标号时,连接器将自动设置地址的最低有效位。如果在程序中使用绝对地址,连接器将无法完成该设置。因此,如果在Thumb代码中使用绝对地址时,必须手工设置为其地址加1。

下面的例子显示了Thumb代码的功能指针的使用。

typedef int (*FN)();

myfunc() {

FN fnptrs[] = {

(FN)(0x8084 + 1), // 有效的Thumb地址

(FN)(0x8074) // 无效的Thumb地址

};

FN* myfunctions = fnptrs;

myfunctions[0](); // 调用成功

myfunctions[1](); // 调用失败

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top