ARM体系结构与编程(第2版)_ppt解析.ppt
文本预览下载声明
10.6 ARM编译器中的预定义宏 ARM编译器预定义了一些宏,有些预定义宏对应一定的数值,有些预定义宏没有对应的数值。表10.7列出了这些预定义宏及其有效的场合。 参见教材P337 * 10.7 ARM中的C/C++库 本节介绍ARM C/C++运行时库,这些库为运行C/C++应用程序提供了各种支持。本节主要包括下面4部分内容: ARM中C/C++库的基本概念。 建立一个使用C/C++库的C/C++应用程序。 建立一个不使用C/C++库的C/C++应用程序。 裁减C/C++运行时库,以适应特定的目标运行环境。 * 10.7.1 ARM中的C/C++运行时库概述 1.??ARM中的C/C++运行时库类型 2.??ARM中C/C++库的存放位置 3.??ARM C/C++库的可重入性 4. 使用ARM C/C++库时应注意的事项 * 10.7.2 建立一个包含C/C++运行时库的C/C++应用程序 C/C++应用程序可以使用C/C++运行时库中的函数,这时,C运行时库将会完成下面的功能。 建立C/C++应用程序运行环境,这包括: 建立数据栈。 如果需要,建立数据堆。 初始化需要使用的C/C++运行时库。 运行程序main()。 提供对ISO C标准规定的函数的支持。 捕捉C/C++应用程序运行时产生的错误信息,并根据具体的实施规则进行相应的处理。 C/C++应用程序使用C/C++运行时库的方式有下面几种,本小节介绍前两种,10.7.3小节介绍第3种。 (1) 在semihost环境下使用C/C++运行时库。 (2) 在没有主机支持的环境下,如应用程序位于目标系统的ROM中,使用C/C++运行时库。 (3) C/C++应用程序不使用main(),也不初始化C/C++运行时库。 * 10.7.2 建立一个包含C/C++运行时库的C/C++应用程序 1. 在semihost环境下使用C/C++运行时库 2. 在nonsemihosted环境下使用C/C++运行时库 * 10.7.3 建立不包含C运行时库的应用程序 当应用程序中包含了函数main()时,将会引起对C运行时库的初始化。如果应用程序中不包含函数main(),将不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。本小节将这种不使用C运行时库的C/C++应用程序称为裸机C程序。裸机C程序不能使用下面的功能: 软件的数据栈溢出检查。 低级标准输入/输出stdio。 signal.h中定义的函数signal()及raise()。 atexit()。 alloca()。 * 10.7.3 建立不包含C运行时库的应用程序 1.??C运行时库中的一些支持函数的使用 2. 裸机C程序 重新实现-__rt_raise(),该函数被程序中的错误处理代码使用。 不要定义函数main()。 在编译选项中不要使用软件的数据栈溢出检查选项。 编写一个汇编指令的代码段(veneer),设置相关的寄存器,为运行C程序做好必要的准备。 保证自己编写的用于初始化的代码段得到运行。比如,可以将其放置到复位异常中断的中断处理程序中。 编译程序时,使用编译选项-fpu none。 3. 支持浮点操作的裸机C程序 4. 使用C运行时库中的函数 * 10.7.4 裁减C/C++运行时库以适应特定的目标运行环境 1.??C/C++应用程序初始化C/C++运行时库的过程 将非固定(Nonroot)的执行代码域(Region)从装载地址空间复制到运行地址空间。 将ZI域置零。 跳转到__rt_entry()运行。 2.??C/C++应用程序的退出过程 应用程序可以在正常运行结束后从main()函数中退出,也可以因为错误原因在程序运行中退出。 * 第11章 ARM连接器 11.1 ARM映像文件 ARM中的各种源文件(包括汇编程序、C语言程序以及C++程序)经过ARM编译器编译后,生成ELF格式的目标文件。这些目标文件和相应的C/C++运行时库经过ARM连接器处理后,生成ELF格式的映像文件(Image)。这种ELF格式的映像文件可以被写入嵌入式设备的ROM中。 本节介绍这种ELF格式的映像文件的结构。 * 11.1.1 ARM映像文件的组成 1.??ARM映像文件的组成部分 一个映像文件由一个或多个域组成。 每个域包含一个或多个输出段。 每个输出段包含一个或多个输入段。 各输入段包含了目标文件中的代码和数据。 * 11.1.1 ARM映像文件的组成 2. ARM映像文件各组成部分的地址映射 ARM映像文件各组成部分在存储系统中的地址有两种:一种是在映像文件位于存储器中时(也就是该映像文件开始运行之前)的地址,称为加载时地址;一种是在映像文件运行时的地址,称为
显示全部