资料介绍
RM 系列处理器是 RISC (Reducded InSTructiON Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;存取“字节(Byte)”数据时要求该数据按其自然尺寸边界(Natural Size Boundary)定位。
ARM 编译程序通常将全局变量对齐到自然尺寸边界上,以便通过使用 LDR和 STR 指令有效地存取这些变量。这种内存访问方式与多数 CISC (Complex Instruction Set Computing)体系结构不同,在CISC体系结构下,指令直接存取未对齐的数据。因而,当需要将代码从CISC 体系结构向 ARM 处理器移植时,内存访问的地址对齐问题必须予以注意。在RISC体系结构下,存取未对齐数据无论在代码尺寸或是程序执行效率上,都将付出非常大的代价。
本文将从以下几个方面讨论在ARM体系结构下的程序设计问题。
未对齐的数据指针
C和C++编程标准规定,指向某一数据类型的指针,必须和该类型的数据地址对齐方式一致,所以ARM 编译器期望程序中的 C 指针指向存储器中字对齐地址,因为这可使编译器生成更高效的代码。
比如,如果定义一个指向 int 数据类型的指针,用该指针读取一个字,ARM 编译器将使用LDR 指令来完成此操作。如果读取的地址为四的倍数(即在一个字的边界)即能正确读取。但是,如果该地址不是四的倍数,那么,一条 LDR 指令返回一个循环移位结果,而不是执行真正的未对齐字载入。循环移位结果取决于该地址向对于字的边界的偏移量和系统所使用的端序(Endianness)。例如,如果代码要求从指针指向的地址 0x8006 载入数据,即要载入 0x8006、0x8007、0x8008 和 0x8009 四字节的内容。但是,在 ARM 处理器上,这个存取操作载入了0x8004、0x8005、0x8006 和 0x8007 字节的内容。这就是在未对齐的地址上使用指针存取所得到的循环移位结果。
因而,如果想将指针定义到一个指定地址(即该地址为非自然边界对齐),那么在定义该指针时,必须使用 __packed 限定符来定义指针: 例如,
__packed int *pi; // 指针指向一个非字对其内存地址
使用了_packed限定符限定之后,ARM 编译器将产生字节存取命令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或者取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致系统性能和代码密度的损失。
值得注意的是,不能使用 __packed 限定的指针来存取存储器映射的外围寄存器,因为 ARM 编译程序可使用多个存储器存取来获取数据。因而,可能对实际存取地址附近的位置进行存取,而这些附近的位置可能对应于其它外部寄存器。当使用了位字段(Bitfield)时, ARM 程序将访问整个结构体,而非指定字段。
编译器的缺省行为
多数嵌入式应用程序最初都是在原型环境下开发的。无论什么样的原型环境的资源与最终产品环境都是有差异的。因此,考虑如何将嵌入式应用程序从其所依赖的开发工具或调试环境中移植到在目标硬件上独立运行是非常重要的。
开始编写嵌入式应用程序时,开发者可能并不清楚目标硬件的具体规格。如,目标系统使用了什么样的外围设备、存储器映射情况甚至不能确定处理器的型号。 为在了解这些详细信息前能够继续软件的开发,RVCT 工具提供了很多默认的操作,使用户能编译和调试与目标系统无关的应用程序代码。下面详细介绍介绍这些编译选项,只有深入了解这些编译选项设置,才能使开发更顺利的进行。
调整 C 库使其适应目标硬件
默认情况下,C 库利用semihostig机制来提供设备驱动级的功能,使得主机主机能够用作输入和输出设备。这种机制对于嵌入式开发十分有用,因为用于开发的硬件系统通常没有最终系统的输入和输出设备。
最简单的函数重定向的例子就是用户希望fputc()函数能够将字符从目标系统的串口输出而不是在调试时,将字符从调试器的控制台输出。这时就需要重新实现该函数。下面的例子将fputc() 的输入字符参数重新指向一连续输出函数 sendchar(),将定该例在一个独立的源文件中实现的。这样,fputc() 在依目标而定的输出和 C 库标准输出函数之间充当一个抽象层。
图1 C库函数重定向
ARM 编译程序通常将全局变量对齐到自然尺寸边界上,以便通过使用 LDR和 STR 指令有效地存取这些变量。这种内存访问方式与多数 CISC (Complex Instruction Set Computing)体系结构不同,在CISC体系结构下,指令直接存取未对齐的数据。因而,当需要将代码从CISC 体系结构向 ARM 处理器移植时,内存访问的地址对齐问题必须予以注意。在RISC体系结构下,存取未对齐数据无论在代码尺寸或是程序执行效率上,都将付出非常大的代价。
本文将从以下几个方面讨论在ARM体系结构下的程序设计问题。
未对齐的数据指针
C和C++编程标准规定,指向某一数据类型的指针,必须和该类型的数据地址对齐方式一致,所以ARM 编译器期望程序中的 C 指针指向存储器中字对齐地址,因为这可使编译器生成更高效的代码。
比如,如果定义一个指向 int 数据类型的指针,用该指针读取一个字,ARM 编译器将使用LDR 指令来完成此操作。如果读取的地址为四的倍数(即在一个字的边界)即能正确读取。但是,如果该地址不是四的倍数,那么,一条 LDR 指令返回一个循环移位结果,而不是执行真正的未对齐字载入。循环移位结果取决于该地址向对于字的边界的偏移量和系统所使用的端序(Endianness)。例如,如果代码要求从指针指向的地址 0x8006 载入数据,即要载入 0x8006、0x8007、0x8008 和 0x8009 四字节的内容。但是,在 ARM 处理器上,这个存取操作载入了0x8004、0x8005、0x8006 和 0x8007 字节的内容。这就是在未对齐的地址上使用指针存取所得到的循环移位结果。
因而,如果想将指针定义到一个指定地址(即该地址为非自然边界对齐),那么在定义该指针时,必须使用 __packed 限定符来定义指针: 例如,
__packed int *pi; // 指针指向一个非字对其内存地址
使用了_packed限定符限定之后,ARM 编译器将产生字节存取命令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或者取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致系统性能和代码密度的损失。
值得注意的是,不能使用 __packed 限定的指针来存取存储器映射的外围寄存器,因为 ARM 编译程序可使用多个存储器存取来获取数据。因而,可能对实际存取地址附近的位置进行存取,而这些附近的位置可能对应于其它外部寄存器。当使用了位字段(Bitfield)时, ARM 程序将访问整个结构体,而非指定字段。
编译器的缺省行为
多数嵌入式应用程序最初都是在原型环境下开发的。无论什么样的原型环境的资源与最终产品环境都是有差异的。因此,考虑如何将嵌入式应用程序从其所依赖的开发工具或调试环境中移植到在目标硬件上独立运行是非常重要的。
开始编写嵌入式应用程序时,开发者可能并不清楚目标硬件的具体规格。如,目标系统使用了什么样的外围设备、存储器映射情况甚至不能确定处理器的型号。 为在了解这些详细信息前能够继续软件的开发,RVCT 工具提供了很多默认的操作,使用户能编译和调试与目标系统无关的应用程序代码。下面详细介绍介绍这些编译选项,只有深入了解这些编译选项设置,才能使开发更顺利的进行。
调整 C 库使其适应目标硬件
默认情况下,C 库利用semihostig机制来提供设备驱动级的功能,使得主机主机能够用作输入和输出设备。这种机制对于嵌入式开发十分有用,因为用于开发的硬件系统通常没有最终系统的输入和输出设备。
最简单的函数重定向的例子就是用户希望fputc()函数能够将字符从目标系统的串口输出而不是在调试时,将字符从调试器的控制台输出。这时就需要重新实现该函数。下面的例子将fputc() 的输入字符参数重新指向一连续输出函数 sendchar(),将定该例在一个独立的源文件中实现的。这样,fputc() 在依目标而定的输出和 C 库标准输出函数之间充当一个抽象层。
图1 C库函数重定向
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- ARM体系结构与编程PDF电子书教材 34次下载
- ARM体系结构和应用系统设计示例 4次下载
- 解读ARM体系结构命名规则 4次下载
- ARM7体系结构 29次下载
- 第2章 多核ARM体系结构 0次下载
- ARM体系结构讲解 3次下载
- ARM_SoC体系结构讲解 3次下载
- ARM体系结构(2).PPT课件 9次下载
- ARM体系结构(1)PPT课件 0次下载
- 105ARM体系结构-编程模型_EXTI 7次下载
- ARM体系结构入门 492次下载
- ARM体系结构与编程_杜春雷 0次下载
- ARM体系结构与编程
- ARM SoC体系结构(中文版) 0次下载
- ARM微处理器体系结构
- 嵌入式微处理器的体系结构 601次阅读
- 浅谈项目中的程序设计思路与步骤 972次阅读
- 一手掌握计算机体系结构核心内容 1692次阅读
- 米尔科技ARM体系结构与编程介绍 1884次阅读
- 米尔科技ARM处理器体系架构介绍 4491次阅读
- 基于OpenMP的电磁场FDTD并行方法的程序设计 1167次阅读
- 浅析自然语言处理知识体系结构 4947次阅读
- 51单片机的中断体系结构_中断的响应过程 1.9w次阅读
- 一个简化的PCIe总线体系结构 5414次阅读
- ARM处理器:“冯·诺依曼”体系结构和“哈佛”体系结构 3.4w次阅读
- 浅谈ARM处理器的特点和体系结构 1.7w次阅读
- 学习ARM + Linux之前要讲解用ADS或RealViewMDK去调试ARM开发板的原因 5810次阅读
- 51单片机体系结构初步分析 2670次阅读
- 新手必看,关于ARM的22个常用概念 6243次阅读
- 一种基于B/S结构与C/S结构结合的新体系结构 1236次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1490次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 92次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 10次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7蓝牙设备在嵌入式领域的广泛应用
- 0.63 MB | 3次下载 | 免费
- 89天练会电子电路识图
- 5.91 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多