网站大量收购独家精品文档,联系QQ:2885784924

CortexM的低层编程.pptVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CortexM的低层编程

Cortex-M3的低层编程 ?? 概览 ?? 汇编与 C 的接口 ?? 典型的开发流程 ?? 第一步工作 ?? 与外界互动 ?? 使用数据存储器 ?? 使用互斥访问实现互斥锁操作 ?? 使用位带实现互斥锁操作 ?? 使用位段提取与查表跳转 概览 汇编与C 的接口 典型的开发流程 第一步工作 与外界互动 * * 在CM3 上编程,既可以使用C 也可以使用汇编。可能还有其它语言的编译器,但是大多数人还是会在C 与汇编的世界里游弋。C 与汇编都有尺短寸长,不能互相取代。使用C 能开发大型程序,而汇编则用于执行特种任务。 在使用不同的工具链和芯片时,有大量的用法和用量都随之不同。因此,本书不会深入讲解怎样精通一个具体的工具链,也不会大谈如何把程序烧到板子上。在第19 章和第20章会提到一些入门知识,具体内容还需查阅相关的文献和在线帮助文档。 使用汇编 如果工程比较小,使用纯汇编常常是可行的,而且你能随心欲地优化和控制程序。不过,你的开发周期会变长。尤其是当工程变大,需要处理比较复杂的数据结构,以及要管理函数库时,你将发现汇编会使工作量激增。各种地址和间接引用千头万绪;bug 劈头盖脸;甚至好几天都改不完,简直就是自虐。当然,如果你想成为系统开发的大虾,就必须以“我不下地狱谁下地狱”的决心,去勇敢面对,后天下乐而乐。 不论如何,时间宝贵。我们应该以C 来实现程序的大框架,而本着好钢用在刀刃上的原则来使用汇编,因为只有在不多的特殊场合是非使用汇编语言不可的,它们是: ?? 无法用 C 写成的函数,如操作特殊功能寄存器,以及实施互斥访问。 ?? 在危急关头执行处理的子程(如,NMI 服务例程)。 ?? 存储器极度受限,只有使用汇编才可能把程序或数据挤进去。 ?? 执行频率非常高的子程,如操作系统的调度程序。 ?? 与处理器体系结构相关的子程,如上下文切换。 ?? 对性能要求极高的应用,如防空炮的火控系统。 使用C 用C写的程序可以移植,并且操作复杂数据结构时远远比汇编方便。但因为C是一种通用语言——至少是低等高级语言,它并不指定如何初始化具体的处理器(用于在main执行前准备好执行环境)。在解决这个问题时,不同的工具链都有自己的一套,因此最聪明的办法就是看一看工具链附带的示例程序。如果使用RealView开发套件(RVDS)或者KEIL 的RealView微控制器开发套件(RVMDK),则编译器和汇编器是ARM提供的,而且它们中都附带了很多示例。如果使用了GNU的工具链,则第19章以CodeSourcery GNU工具链为例,给出一个简单的示例(其它示例可以网上找)。 尽管在使用了C后,大大加速了开发,但是底层的系统控制往往还需要汇编代码。很多编译器都允许你直接在C代码中插汇编,称为“内联汇编”;另外还允许你写独立的汇编模块,与编译后的C模块一起连接。以往,使用内联汇编的作法比较多,但是在ARM编译器中,不支持对Thumb‐2指令的内联汇编。取而代之的,是从RealView C编译器的3.0版开始,新增了所谓“嵌入式汇编”的功能,它支持Thumb‐2指令。它让你可以在C程序中插入使用汇编语言编写的函数, 例如: __asm void SetFaultMask(unsigned int new_value) { //在这里使用汇编代码实现本函数 MSR FAULTMASK, new_value // 把new_value写入FAULTMASK中 BX LR // 返回主程序(不可省略) } RealView C 编译器对嵌入式汇编的详细论述,在《RVCT 3.0 Compiler and Library Guide(Ref6)》中给出。 在CM3 中,嵌入式汇编还是比较需要的,因为常常会有访问特殊功能寄存器的时候。比如,在设置堆栈时,就要使用MRS/MSR 指令。对于其它不能由编译器产生的指令,比如WFI/WFE、互斥访问、存储器隔离等指令,也必须用汇编显式给出。 在以前的ARM 处理器中,因为支持ARM/Thumb 双重状态,往往需要所谓的“interworking”,且不同的源文件可能需要编译成不同状态下的代码。在CM3 中不再有此需求,因为只使用了Thumb 状态,从而工程管理清爽多了。 当使用C 开发程序时,推荐你开启CM3 的双字对齐管理机制(在NVIC 配置与控制寄存器中,把STKALIGN 置位),代码形如: #define NVIC_CCR ((volatile unsigned long *)(0xE000ED14)) *NVIC_CCR = *NVIC_CCR | 0x200; //设置STKALIGN位 这是用于确保系统能严格遵守AAPCS 过程调用标准,个中细节请参阅第12 章。 在很多情况下,都需要让C 程序

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档