Cortex-M3的低层编程

Cortex-M3的低层编程

 

不论如何,时间宝贵。我们应该以 C 来实现程序的大框架,而本着好钢用在刀刃上的原则来使用汇编,因为只有在不多的特殊场合是非使用汇编语言不可的,它们是:

  1. 无法用 C 写成的函数,如操作特殊功能寄存器,以及实施互斥访问。
  2. 在危急关头执行处理的子程(如,NMI 服务例程)。
  3.  存储器极度受限,只有使用汇编才可能把程序或数据挤进去。
  4.  执行频率非常高的子程,如操作系统的调度程序。
  5. 与处理器体系结构相关的子程,如上下文切换。
  6.  对性能要求极高的应用,如防空炮的火控系统

尽管在使用了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 // 返回主程序(不可省略)
}

在 CM3 中,嵌入式汇编还是比较需要的,因为常常会有访问特殊功能寄存器的时候。
比如,在设置堆栈时,就要使用 MRS/MSR 指令。对于其它不能由编译器产生的指令,比如
WFI/WFE、互斥访问、存储器隔离等指令,也必须用汇编显式给出。

在大多数场合下的情况都比较简单:当主调函数需要传递参数(实参)时,它们
使用R0‐R3。其中R0传递第一个,R1传递第2个……在返回时,把返回值写到R0中。在子程
序中,可以随心所欲地使用R0‐R3,以及R12 。但若
使用R4‐R11,则必须在使用之前先PUSH它们,使用后POP回来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值