Cortex-M3中C与汇编的交互
以下内容摘自《ARM Cortex-M3权威指南》
概览
在CM3 上编程,既可以使用C 也可以使用汇编。可能还有其它语言的编译器,但是大多数人还是会在C 与汇编的世界里游弋。C 与汇编都有尺短寸长,不能互相取代。使用C 能开发大型程序,而汇编则用于执行特种任务。
什么时候使用汇编?
如果工程比较小,使用纯汇编常常是可行的,而且你能随心欲地优化和控制程序。不过,你的开发周期会变长。尤其是当工程变大,需要处理比较复杂的数据结构,以及要管理函数库时,你将发现汇编会使工作量激增。各种地址和间接引用千头万绪;bug 劈头盖脸;甚至好几天都改不完,简直就是自虐。当然,如果你想成为系统开发的大虾,就必须以“我不下地狱谁下地狱”的决心,去勇敢面对,后天下乐而乐。
不论如何,时间宝贵。我们应该以C 来实现程序的大框架,而本着好钢用在刀刃上的原则来使用汇编,因为只有在不多的特殊场合是非使用汇编语言不可的,它们是:
无法用 C 写成的函数,如操作特殊功能寄存器,以及实施互斥访问。
在危急关头执行处理的子程(如,NMI 服务例程)。
存储器极度受限,只有使用汇编才可能把程序或数据挤进去。
执行频率非常高的子程,如操作系统的调度程序。
与处理器体系结构相关的子程,如上下文切换。
对性能要求极高的应用,如防空炮的火控系统
C中如何嵌入汇编?
尽管在使用了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)》中给出。
汇编与C 的接口
在很多情况下,都需要让C 程序模块与汇编程序模块互相交互,它们包括:
在 C 代码中使用了嵌入式汇编(或者是在GNU 工具下,使用了内联汇编)
C 程序呼叫了汇编程序,这些汇编程序是在独立的汇编源文件中实现的
汇编程序调用了C程序
在这些情况下,必须知晓参数是如何传递的,以及值是如何返回的,才能在主调函数与子程序之间协同工作。这些交互的机制在ARM中有明确的规定,由文档《ARM Architecture Procedure Call Standard(AAPCS, Ref5)》给出。
不过,在大多数场合下的情况都比较简单:当主调函数需要传递参数(实参)时,它们使用R0‐R3。其中R0传递第一个,R1传递第2个……在返回时,把返回值写到R0中。在子程序中,可以随心所欲地使用R0‐R3,以及R12(回顾第9章,想想为什么会PUSH它们)。但若使用R4‐R11,则必须在使用之前先PUSH它们,使用后POP回来。
可见,汇编程序使用R0‐R3, R12时会很舒服。但是如果换个立场——汇编要呼叫C函数,则考虑问题的方式就有所不同:必须意识到子程序可以随心所欲地改写R0‐R3, R12,却决不会改变R4‐R11。因此,如果在调用后还需要使用R0‐R3,R12,则在调用之前,必须先PUSH,从C函数返回后再POP它们,对R4‐R11则不用操心。在本章的示例程序中,绝大多数只是调用汇编子程序,它们只影响少量寄存器,或者会在返回前恢复寄存器的内容,所以往往没有严格遵守AAPCS。这主要是为了突出其它重点,简化程序,请读者不要钻牛角尖。
Cortex-M3中C与汇编的交互的更多相关文章
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- Android中webView和网页的交互
Android中webView和网页的交互 Android中webView跟网页的交互式通过JavaScript进行的.具体步骤: 1.创建JavaScript,在点击的时候调用JavaScript ...
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...
- 如何使用Web3在浏览器中与智能合约进行交互
2018-4-20 技术文章 Web3.js是以太坊官方的Javascript API,可以帮助智能合约开发者使用HTTP或者IPC与本地的或者远程的以太坊节点交互.实际上就是一个库的集合,主要包括下 ...
随机推荐
- percona-toolkit中在线ddl
percona-toolkit中在线ddl percona-toolkit工具提供了一组用于mysql操作的工具,比如主从复制,在线更改mysql表ddl等 一.安装1.安装perl(略)2.BI&a ...
- [bzoj1072] [SCOI2007]排列perm
有一种暴力算法就是直接枚举. 正解就是状压dp 令f[i][j]:i:使用的数位的状态j:当前的模数 边界:f[0][0] = 1; f[i|1<<k][j*10+k % n] += f[ ...
- centos7 添加svn
预期目的: 1.仓库放在 /var/svn/ 目录下,并且仓库名为 project 2.创建用户组lsgogroup,该组下添加两个成员lsgoweb1.lsgoweb2,密码直接用用户名,两用户可以 ...
- iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)
这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...
- 【LINUX】VI相关命令
任何用户最常做的事要数创建和编辑文件,包括文档.报告和文字,vi(Visual Editor)是一个有效而相对简单的全荧幕编辑,使用vi,只要记著少量基本指令,就可以开始起步,再学习其他更复杂的指令, ...
- JMeter学习-030-JMeter性能测试常用之事务控制器实例
通常进行性能测试时,我们一般仅考虑主要的数据返回,不考虑页面渲染所需要的数据(例如:css.js.图片等).但当我们需要衡量打开一个页面(页面渲染完成)的性能时,我们就需要考虑完成页面渲染所需要的图片 ...
- CMake undefined reference to `QTcpServer::QTcpServer(QObject*)'的解决
1. 这是因为工程link不到network的库,因此除了要包含头文件 #include 之外,还需要在.pro文件中加入: QT += network 2. 对于CMake,需添加Net ...
- SpringMVC操作指南-MVC-搭建SpringMVC项目结构(基于Java API和注解)
- GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台
在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...
- 无题 MVC
1. MVC 里controller 返回匿名类型, 在View里是访问不了匿名类型的字段,因为它是Internal Private, 必须定义强类型 2. 扩展view的方法 public stat ...