版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 C及汇编混合编程,目录,1.1 C/C+中内嵌汇编指令,语法格式 在ARM C语言程序中,使用关键字_asm来标识一段汇 编指令程序。 _asm 汇编语言程序 汇编语言程序 其中:如果一行中有多个汇编指令,指令之间使用分号(;)分开。 在一条指令占多行,要使用续行符号().,1.2 C/C+中内嵌汇编指令举例,#include _asm void my_strcpy(const char src, char *dst) loop LDRB r2, r0, #1 STRB r2, r1, #1 CMP r2, #0 BNE loop BX lr ,int main(void) const
2、 char *a = Hello world!; char b20; my_strcpy (a, b); printf(Original string: %sn, a); printf(Copied string: %sn, b); return 0; ,2.1 汇编程序中访问C程序变量,在C程序中声明的全局变量可以被汇编程序通过地址间接访问。具体访问方法如下: 使用IMPORT伪指令声明这个全局变量。 使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。 根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。 A
3、REA test,CODE,READONLY EXPORT asmsub IMPORT c_var;声明外部变量c_var asmsub LDR R1,=glovbvar;装载变量地址 LDR R0,R1 ;读出数据 ADD R0,R0,#1;加1 操作 STR R0,R1;保存变量值 MOV PC, LR END,3.1 寄存器的使用规则,子程序间通过寄存器R0R3来传递参数。 在子程序中,使用寄存器R4R11来保存局部变量。 寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。 寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时
4、的值和退出子程序时的值必须相等。 寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。 寄存器R15是程序计数器,记作PC,3.2 参数传递规则,参数不超过4个时,可以使用寄存器R0R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。 结果为一个32位整数时,可以通过寄存器R0返回 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。,3.3 C调用汇编程序,汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递。 在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。 在C 语言程序中使用extern 关键字声明外部函数
5、(声明要调用的汇编子程序),即可调用此汇编子程序。,3.3 C调用汇编程序举例,#include extern void strcopy(char *d,const char *s) int main(void) const char *srcstr=“First string-source”; char dstsrt =“Second string-destination”; printf(“Before copying:n”); printf(“%sn %sn,”srcstr,dststr); strcopy(dststr,srcstr); printf(“After copying:n”
6、) printf(“%sn %sn,”srcstr,dststr); return(0); ,AREA SCopy, CODE, READONLY EXPORT strcopy strcopy LDRB R2,R1,#1 STRB R2,R0,#1 CMP r2,#0 BNE strcopy MOV pc,lr END,3.4 汇编调用C程序,汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递. 在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数. 在调用C 程序时,要正确设置入口参数,然后使用BL 调用.,3.4 汇编调用C程序,/*函数sum5()返回5 个整数
7、的和*/ int sum5(int a,lit b, int c,int d,int e) return(a+b+c+d+e); ,AREA test, CODE,READONLY IMPORT sum5 CALLSUM STMFD SP! LR ADD R1,R0,R0 ADD R2,R1,R0 ADD R3,R1,R2, STR R3,SP,# -4! ADD R3,R1,R1 BL sum5 ADD SP,SP#4 LDMFD SP,PC END,4.1 嵌入式C编程,C语言的优点是运行速度快、编译效率高、移植性好和可读性强。C语言支持模块化程序设计,支持自顶向下的结构化程序设计方法。因
8、此在嵌入式程序设计中经常会用到C语言程序设计。 嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C语言程序设计,因此必须符合C语言基本语法,只是它是面向嵌入式的应用而设计的程序。,4.2 嵌入式C编程预处理,1、文件包含伪指令 格式: #include ;标准头文件 #include“头文件名.h” ;自定义头文件 2、宏定义伪指令 格式: # define 宏标识符 宏体 例: #define U32 unsigned int #define U16 unsigned short #define S32 int #define S16 shor
9、t int #define U8 unsigned char #define S8 char,4.3 嵌入式C编程register,当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。 例: /* 求1+2+3+.+n的值 */WORD Addition(BYTE n)register i,s=
10、0; for(i=1;i=n;i+)s=s+i;return s;,4.4 嵌入式C编程位操作,使用C语言的位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作,因而,灵活的位操作可以有效地提高程序运行的效率 。 C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的(,4.5 嵌入式C编程数据指针,在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C+以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调
11、试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况: 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址; 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单 元(称为mail box)书写内容以在对方CPU产生中断; 读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。 例: 1、int *p = (unsigned short *)0 x48000050 ; *p=0 xABCD; 2、#define rGPACON (*(volatile unsigned *)0 x56000000); r
12、GPACON0 x12345678;,4.6 嵌入式C编程volatile,一般这个修饰符用来告知编译器,被修饰的变量是个“易变的”变量(volatile的本意是“易变的”),防止编译器进行优化。将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化。 用法 1、中断服务程序中修改的供其它程序检测的变量需要加volatile。 2、多任务环境下各任务间共享的标志应该加volatile。 3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。,4.6 嵌入式C编程volatile,int f(volatile int *p) retur
13、n (*p = *p); ,f LDR r1, r0 LDR r0, r0 CMP r1, r0 MOVNE r0, #0 MOVEQ r0, #1 BX lr,int f(int *p) return (*p = *p); ,f MOV r0, #1 BX lr,4.7 嵌入式C编程_inline,Inlining can improve performance, at the expense of a larger image Body of inlined function inserted directly into the calling code wherever it is ca
14、lled Only possible if the caller and callee are in the same compilation unit The compiler can inline functions automatically Inlining can be disabled with -no_inline Factors that influence auto-inlining include Whether a function is marked with _inline Optimization level and -Otime / -Ospace How man
15、y times a function is called Size of the function Whether the function has external or static linkage To force a function to be inlined in all cases, either use -forceinline with _inline or use _forceinline Any (non-static) function that gets auto-inlined has an out-of-line version generated too (another reason to use static) Increases code size More comp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 九年级物理下册《磁现象 磁场》教案版
- 3S技术解析民勤绿洲景观演变:规律、驱动与保护策略
- 3D图形引擎中雾化渲染技术的深度剖析与实践
- 3-PCR并联机构工作空间与轨迹规划:理论、方法及多领域应用的深度剖析
- 21世纪以来印度学位管理机制变革:历程、动因与展望
- 2007年汉语新词语:语言演变与社会镜像
- 车库补风系统监理实施细则
- 危险化学品运输企业班组安全活动制度
- 外科手术部位预防与控制试题及答案
- 体育馆项目加固改造工程验收施工方案
- 江苏无锡市2025-2026学年高二下学期期末考试化学试题含答案
- 2026中铁装配式建筑科技有限公司招聘65人笔试历年典型考点题库附带答案详解
- 2025工贸企业董事长安全生产责任制培训
- 火力发电厂典型事故案例汇编
- 保证药品信息来源合法、真实、安全的管理措施、情况说明及相关证明资料
- 2026年湖南事业单位招聘(公基)笔试真题及答案
- 关键岗位考核制度细则
- 福建省厅警用地理信息系统(PGIS2.0)建设方案V1.1
- 华为公司质量管理
- 2025四川遂宁发展投资集团有限公司招聘8人笔试参考题库附答案
- JG/T 324-2011建筑幕墙用陶板
评论
0/150
提交评论