- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM嵌入式软件编程经验谈.pdf
本文由王兴妍贡献
TECHNOLOGY IN-DEPTH
ARM嵌入式软件编程经验谈
A R M 系 列 处 理 器 是 R I S C 字的边界)即能正确读取. 但是, 如果该 地 址不是四的倍 数, 那么,
一条L D R指 令返回一个循环移位结果, 而不是执行 真正的未对齐字载入. 循环移位结果取 决 于 该 地 址
向对于字 的 边界 的 偏 移 量 和系统所使用的端序(Endianness). 例如, 如果代码要求从指针指向的地址
0x8006载入数据, 即要载入0x8006, 0x8007, 0x8008和0x8009四字节的内 容. 但是, A R M 处理器上, 在 这
个存取 操作载入了0x8004, 0x8005, 0x8006和 0x8007 字节的内容. 这就是在未对齐的 地址上使用指针存取
所得到的循环移位 A R M编译程序通常将全局变量对齐 结果. 因 而,如 果 想 将 指 针 定 义 到 一 个
指 定 地 址(即 该 地 址 为 非自 然 边 界对 齐),那 么在 定 义该 指 针 时,必须 使 用 __packed限定
符来定义指针: 例如, __packedint*pi;//指针指向一个 非字对齐内存地址 使用了_pac ke d限定符限定之
后, 到自然尺寸边界上, 以便通过使用L D R 和S T R指令有效地存取这些变量.这种 内存访问方式与多数C I
S C(C o m p l e x Instruction Set Computing)体系结构不 同, 在CISC体系结构下, 指令直接存取未 对齐
的数据. 因而, 当需要将代码从CISC 体系结构向 A R M 处理器移植时, 内存 访问的地址对齐问题必须予以
注意. 在 R I S C体系结构下, 存取未对齐数据无论 在代码尺寸或是程序执行效率上, 都将付 出非常大的代
价. 本文将从以下几个方面讨论在A R M ARM编译器将产生字节存取命令(LDRB 或STRB指令)来存取内存, 这
样就不必考 虑指针对齐问题. 所生成的代码是字节存 取的一个序列, 或者取决于编译选项, 跟 变量对齐相
关的移位和屏蔽. 但这会导致 系统性能和代码密度的损失. 1. 未对齐的数据指针 C和C++编程标准规定, 指
向某一数 值得注意的是, 不能使用 __packed 据类型的指针, 必须和该类型的数据地址 对齐方式一致, 所
以A R M编译器期望程 序中的C指针指向存储器中字对齐地址, 因为这可使编译器生成更高效的代码. 比如,
如果定义一个指向i n t数据类 限定的指针来存取存储器映射 的外围寄存器, 因为 ARM 编译 程序可使用多
个存储器存取来 获取数据. 因而, 可能对实际存 取地址附近的位置进行存取, 而 这些附近的位置可能对应
于其 它外部寄存器. 当使用了位字段 (Bitfield)时, ARM程序将访 问整个结构体, 而非指定字段. 型的指
针, 用该指针读取一个字,A R M 编译器将使用L D R指令来完成此操作. 如果读取的地址为四的倍数(即在一
个 体系结构下的程序设计问题. (R e d u c d e d I n s t r u c t i o n S e t Computing)处理器.
很多基于ARM的高 效代码的程序设计策略都源于RISC处理 器. 和很多R I S C处理器一样, R M系列 A 处理器
的内存访问, 也要求数据对齐, 即 存取 字(Word) 数据时要求四字节对 齐, 地址的bi t s[1:0]==0b00;
file:///G|/Documents and Settings/Lch/桌面/wenkuxiazai/Download/计算机/ARM嵌入式软件编程经验谈.txt [2012-3-14 18:44:49]
存取 半 字(Half words) 时要求两字节对齐, 地 址的bit[0]==0b0; 字节(Byte) 存取 数 据 时要求
该 数 据 按 其自然 尺寸 边界 (NaturalSizeBoundary) 定位.
作 者 华清远见科技信息 有限公司
2. 编译器的缺省行为 多数嵌入式应用程序最初都是在原 型环境下开发的. 无论什么样的原型环境 的资源与
最终产品环境都是有差异的. 因 此, 考虑如何将嵌入式应用程序从其所 依赖的开发工具或调试环境中移植到
在 目标硬件上独立运行是非常重要的. 开始编写嵌入式应用程序时, 开发者
可能并不清楚目标硬件的具
文档评论(0)