版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1TM第第8章章 ARM汇编语言与嵌入式汇编语言与嵌入式C混合编程混合编程本章首先简要的介绍了嵌入式本章首先简要的介绍了嵌入式C语言的编程规语言的编程规范,嵌入式开发中常用的位运算与控制位域范,嵌入式开发中常用的位运算与控制位域及在嵌入式及在嵌入式C程序设计中要注意的问题,为读程序设计中要注意的问题,为读者进行嵌入式者进行嵌入式C程序设计打基础。然后介绍在程序设计打基础。然后介绍在ARM汇编语言与嵌入式汇编语言与嵌入式C语言进行相互调用语言进行相互调用的标准(的标准(AAPCS),并以大量的实例说明了),并以大量的实例说明了相互调用应注意的问题。相互调用应注意的问题。2TM2内容提要内容提要n
2、81 嵌入式嵌入式C编程规范编程规范n82 嵌入式嵌入式C程序设计中的位运算程序设计中的位运算n83 嵌入式嵌入式C程序设计中的几点说明程序设计中的几点说明n84 嵌入式嵌入式C程序设计格式程序设计格式n85 过程调用标准过程调用标准ATPCS与与AAPCSn86 ARM汇编语言与嵌入式汇编语言与嵌入式C混合编程混合编程3TM38.1 嵌入式嵌入式C编程规范编程规范n在当前的嵌入式开发中,嵌入式在当前的嵌入式开发中,嵌入式C语言是最语言是最为常见的程序设计语言。为常见的程序设计语言。n优秀的代码还要具备优秀的代码还要具备易读性易读性、易维护性易维护性、具、具有有可移植和高可靠性可移植和高可靠性
3、。4TM48.1.1 嵌入式嵌入式C程序书写规范程序书写规范n排版规则如下:排版规则如下: n(1)程序块要采用)程序块要采用缩进风格缩进风格编写编写 n(2)较)较长的语句长的语句(例如超过(例如超过80个字符)要个字符)要分成多行书分成多行书写写 n(3)循环、判断等语句中若有)循环、判断等语句中若有较长的表达式较长的表达式或语句或语句,则要进行,则要进行适应的划分适应的划分 5TM5n(4)若)若函数或过程中参数较长函数或过程中参数较长,也要进行适,也要进行适当的当的划分划分。n(5)一般)一般不要把多个短语句写在一行不要把多个短语句写在一行中中 n(6)程序块的)程序块的分界符语句的大
4、括号分界符语句的大括号“”与与“”一般独占一行并且在同一列一般独占一行并且在同一列6TM6书写规范示例:书写规范示例:7TM78.1.2 命名规则命名规则n(1)标识符的名称要简明,能够表达出确切的含义标识符的名称要简明,能够表达出确切的含义,可以使用,可以使用完整的单词或通常可以理解的缩写完整的单词或通常可以理解的缩写。n(2)如果在命名中使用特殊约定或缩写,则要进)如果在命名中使用特殊约定或缩写,则要进行注释说明。行注释说明。 n(3)对于变量命名,一般)对于变量命名,一般不取单个字符不取单个字符 ,例如例如i、j、k. n(4)函数名一般以大写字母开头;所有常量名字)函数名一般以大写字母
5、开头;所有常量名字母统一用大写。母统一用大写。8TM88.1.3 注释说明注释说明n注释有助于程序员理解程序的整体结构,也便于以注释有助于程序员理解程序的整体结构,也便于以后程序代码的维护与升级。常用的规则如下:后程序代码的维护与升级。常用的规则如下: n(1)注释语言必须)注释语言必须准确、简洁且容易理解准确、简洁且容易理解;n(2)程序代码)程序代码源文件头部源文件头部应进行注释说明应进行注释说明 ;n(3)函数头部函数头部应进行注释;应进行注释;n(4)程序中所用到的特定含义的)程序中所用到的特定含义的常量、变量常量、变量,在,在声明时都要加以注释声明时都要加以注释 ; 9TM9n(5)
6、对于)对于宏定义、数据结构宏定义、数据结构声明,如果其命声明,如果其命名名不是充分自注释不是充分自注释的,也要加以注释。的,也要加以注释。n(6)如果注释单独占用一行,与其被注释的)如果注释单独占用一行,与其被注释的内容进行相同的缩进方式,一般将注释与其内容进行相同的缩进方式,一般将注释与其上面的代码用空行隔开上面的代码用空行隔开 n(7)程序代码修改时,其)程序代码修改时,其注释也要及时修改注释也要及时修改,一定要保证代码与注释保持一致。,一定要保证代码与注释保持一致。 10TM10命名规则示例:命名规则示例:11TM118.2 嵌入式嵌入式C程序设计中的位运算程序设计中的位运算n在嵌入式程
7、序设计中,在嵌入式程序设计中,位操作位操作是最常用的运是最常用的运算之一,因为在很多情况下要算之一,因为在很多情况下要对寄存器中的对寄存器中的某位或某个管脚进行操作某位或某个管脚进行操作,这些都需要用位,这些都需要用位操作来完成。操作来完成。 12TM128.2.1 按位与操作按位与操作n按位与运算符按位与运算符“&”是把参与运算的两个操作是把参与运算的两个操作数所对应的各个二进制位进行按位相与。数所对应的各个二进制位进行按位相与。n只有当对应的两个二进制位全为只有当对应的两个二进制位全为1时,结果才时,结果才为为1,否则为,否则为0。n参与运算的两个操作数以参与运算的两个操作数以补码形式补码
8、形式出现。出现。13TM13n例如例如7 & 3,补码分别为,补码分别为0000 0111与与0000 0011 按位与运算后结果为按位与运算后结果为0000 0011等于十等于十进制的进制的3。n按位与操作可以实现将特定的位清零,也可按位与操作可以实现将特定的位清零,也可以用于提取出某数的指定位。以用于提取出某数的指定位。 14TM148.2.2按位或操作按位或操作n按位或操作运算符按位或操作运算符“|”是把参与运算的两个是把参与运算的两个操作数对应的各个二进制位进行按位相或。操作数对应的各个二进制位进行按位相或。n对应的两个二进制位中只要有一个为对应的两个二进制位中只要有一个为1,结果,结
9、果就为就为1,当两个对应的二进制位都为,当两个对应的二进制位都为0时,结时,结果位为果位为0。n参与运算的两个操作数均以参与运算的两个操作数均以补码形式补码形式出现。出现。15TM15n例如例如7 | 3,7的补码为的补码为0000 0111,3的补码的补码为为0000 0011,结果为,结果为0000 0111。按位与操。按位与操作可以实现将特定位的置位操作,也可以用作可以实现将特定位的置位操作,也可以用于提取出某数的指定位。于提取出某数的指定位。16TM168.2.3 按位异或操作按位异或操作n按位异或运算符按位异或运算符“”是将参与运算的两个操是将参与运算的两个操作数对应的各个二进制位进
10、行相异或。作数对应的各个二进制位进行相异或。n当对应的两个二进制位当对应的两个二进制位相异相异时,结果位为时,结果位为1,相同时为相同时为0。n参与运算的两个操作数均以参与运算的两个操作数均以补码形式补码形式出现。出现。17TM17n例如例如7 | 3,7的补码为的补码为0000 0111,3的补码的补码为为0000 0011,结果为,结果为0000 0100。18TM18应用举例:应用举例:n通过通过3次异或操作将寄存器次异或操作将寄存器rPDATAE中的内中的内容与变量容与变量tmp的值进行交换。的值进行交换。19TM19nrPDATAE = rPDATAE tmpntmp = tmp r
11、PDATAE nrPDATAE = rPDATAE tmp20TM208.2.4 取反操作取反操作n取反运算符取反运算符“”实现对参与运算的操作数对实现对参与运算的操作数对应的各个二进制位按位求反。取反运算符应的各个二进制位按位求反。取反运算符“”具有右结合性。所有具有右结合性。所有1变为变为0,0变为变为121TM21n。例如。例如(0101 1001) = 1010 0110。在程序。在程序中主要用于将操作数的某位或某些位取反,中主要用于将操作数的某位或某些位取反,为其他操作提供数据准备。为其他操作提供数据准备。 22TM228.2.5 移位操作移位操作n移位操作分为左移操作与右移操作。左
12、移运移位操作分为左移操作与右移操作。左移运算符算符“”实现将实现将“”左边的操作数的各个左边的操作数的各个二进制位向左移动二进制位向左移动“”实现将实现将“”左边的操作数左边的操作数的各个二进制位向右移动的各个二进制位向右移动“”右边操作数右边操作数所指定的位数。所指定的位数。n对于空位的补齐方式,无符号数与有符号数对于空位的补齐方式,无符号数与有符号数是有区别的。对无符号数进行右移时,低位是有区别的。对无符号数进行右移时,低位丢弃,高位用丢弃,高位用0补齐,其值相当于除以:补齐,其值相当于除以:2“右右移位数移位数”次方次方 24TM248.3 嵌入式嵌入式C程序设计中的几点说明程序设计中的
13、几点说明n8.3.1 volatile限制符限制符n8.3.2 地址强制转换与多级指针地址强制转换与多级指针n8.3.3预处理的使用预处理的使用25TM258.3.1 volatile限制符限制符nvolatile的本意为的本意为 “暂态的暂态的”或或.“易变的易变的”,该说明符起到该说明符起到抑制编译器优化抑制编译器优化的作用。的作用。 n如果在声明时用如果在声明时用“volatile”关键进行修饰,关键进行修饰,遇到这个关键字声明的变量,编译器对访问遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提该变量的代码就不再进行优化,从而可以提供供特殊地址的稳定访问特殊地
14、址的稳定访问。 26TM26应用举例:应用举例:n char x = 0, y = 0, z = 0; n /*读取读取I/O空间空间0 x5400000端口的内容存入端口的内容存入x变量变量*/n x = ReadChar(0 x5400000); n y = x;n /*再次读取再次读取I/O空间空间0 x5400000端口的内容存入端口的内容存入x变量变量*/n x = ReadChar (0 x5400000); n z = x;n 很可能被编译器优化为:很可能被编译器优化为:n char x = 0, y = 0, z = 0; n /读取读取I/O空间空间0 x5400000端口的
15、内容存入端口的内容存入x变量变量n x = ReadChar (0 x5400000); n y = x;n z = x;27TM27n 与没优化前的代码相比较,优化后省略了一句与没优化前的代码相比较,优化后省略了一句x = ReadChar (0 x5400000);这可能会带来不确定因素这可能会带来不确定因素,在,在y = x;之后,之后,z = x;之前,之前,0 x5400000端口寄存端口寄存器的内容可能要发生改变。器的内容可能要发生改变。n因此声明时应改为:因此声明时应改为:nvolatile char x ;nchar y = 0, z = 0 ; 28TM28中断服务程序中修改
16、的供其它程序检测中断服务程序中修改的供其它程序检测的变量的问题的变量的问题 nstatic char flg = 0;nmain(void)n.n while (1) n if (flg) n ./程序代码程序代码An n else n ./程序代码程序代码Bnn /* 中断服务程序中断服务程序*/void ISR_INT1(void) flg=1;29TM29n这段代码很可能被编译器优化为:这段代码很可能被编译器优化为:nstatic char flg = 0;nmain(void)n.n while (1) n./程序代码程序代码Bn n解决问题的方法:解决问题的方法:n将声明语句将声明语
17、句static char flg = 0;改为改为volatile static char flg = 0;30TM308.3.2 地址强制转换与多级指针地址强制转换与多级指针 n地址强制转换地址强制转换n在在C程序设计中,绝对地址程序设计中,绝对地址0 x0FA00只是被只是被当成一个整型数,如果要把它当成一个地当成一个整型数,如果要把它当成一个地址来使用就需要进行地址强制转换。址来使用就需要进行地址强制转换。n如定义一个整形指针如定义一个整形指针int *p,然后把绝对地,然后把绝对地址址0 x0FA00转换成一个整形的地址值赋给转换成一个整形的地址值赋给这个整形指针,这个整形指针,p =
18、 (int *)0 x0FA00。 31TM31n因此在嵌入式程序设计中,经常可以可以看因此在嵌入式程序设计中,经常可以可以看到寄存器用如下方式进行定义:到寄存器用如下方式进行定义:n#define rPCONA(*(volatile unsigned *)0 x1D20000)n#define rPDATA (*(volatile unsigned *)0 x1D20004)32TM32n多级指针多级指针地地 址址值值地地 址址地地 址址值值值值地地 址址地地 址址地地 址址指指 针针变变 量量一一 级级 指指 针针二二 级级 指指 针针变变 量量变变 量量一一 级级 指指 针针二二 级级
19、指指 针针三三 级级 指指 针针33TM33分析下列程序代码的执行结果。分析下列程序代码的执行结果。n#includenmain()nint value=100;nint *p1,*p2,*p3;np1 = & value;np2 = &p1;np3 = &p2;nprintf(c=%dn, value);nprintf(*p1=%dn,*p1);nprintf(*p2=%dn,*p2);nprintf(*p3=%dn,*p3);n34TM348.3.3预处理的使用预处理的使用n在源流程序被编译器处理之前在源流程序被编译器处理之前, 编译预处理器编译预处理器首先对源程序中的预处理命令进行展开或
20、处首先对源程序中的预处理命令进行展开或处理。理。n预处理命令书写格式为以预处理命令书写格式为以“#”开头,占单独开头,占单独书写行,语句尾不加分号。书写行,语句尾不加分号。 35TM35n宏定义宏定义(#define)n(1). 不带参数的宏不带参数的宏 n不带参数的宏定义的一般形式为:不带参数的宏定义的一般形式为:n#define 宏名宏名 宏体宏体36TM36n(2).带参数的宏定义带参数的宏定义n带参数的宏定义一般形式为:带参数的宏定义一般形式为:n#define 宏名宏名(参数表参数表) 宏体宏体37TM37(3). 宏定义与函数宏定义与函数38TM38带参宏与函数的区别带参宏与函数的
21、区别 39TM39n文件包含文件包含(#include) n文件包含的功能是使得一个源文件可以将另文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来,它的一般一个源文件的内容全部包含进来,它的一般形式为:形式为:n#include “文件名文件名”/先搜索当前目录,再搜先搜索当前目录,再搜索标准目录,可以指定目录索标准目录,可以指定目录#include/直接按标准目录搜索直接按标准目录搜索40TM40实例解析实例解析n/*头文件头文件test.h */n#define SQR(x) (x)*(x)n#define CUBE(x) (x)*(x)*(x)n#define QUAD
22、(x) (x)*(x)*(x)*(x)41TM41n/*源文件源文件 test.c*/n#include n#include e:qiutietest.h /指定目录,包含头文件指定目录,包含头文件n#define MAX_POWER 10nvoid main()n int n;nprintf(numbert exp2t exp3t exp4n);nprintf(-t-t-t-n);nfor(n=1;n=MAX_POWER;n+)nprintf(%2dt %3dt %4dt %5dn,n,SQR(n),CUBE(n),QUAD(n);n42TM42n程序运行结果程序运行结果 43TM43n条件
23、编译条件编译n(1). 形式形式1:#ifdef 标识符标识符程序段程序段1#else程序段程序段2#endif 44TM44n(2). 形式形式2n#ifndef 标识符标识符程序段程序段1n#else程序段程序段2n#endif 45TM45n(3). 形式形式3n#ifdef 表达式表达式1程序段程序段1n#elif 表达式表达式2程序段程序段2n #elsen 程序段程序段3n#endif 46TM468.4嵌入式嵌入式C程序设计格式程序设计格式n8.4.1 可重入函数可重入函数n8.4.2 中断处理程序中断处理程序n8.4.3 模块化程序设计模块化程序设计 47TM478.4.1 可
24、重入函数可重入函数 n如果某个函数可以被多个任务并发使用,而如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有不会造成数据错误,我们就说这个函数具有可重入性(可重入性(reentrant) 。48TM48n可重入函数可以可重入函数可以使用局部变量使用局部变量,也可以使用,也可以使用全局变量。全局变量。n如果如果使用全局变量使用全局变量,则应通过关中断、信号,则应通过关中断、信号量(即量(即P、V操作)等手段操作)等手段对其加以保护对其加以保护 49TM49示例解析:示例解析: n分析下面的函数是否具有可重入性分析下面的函数是否具有可重入性 nstatic int tm
25、p;nvoid swap(int* a, int* b) nntmp=*a; n*a=*b; n*b=tmp;n50TM50nvoid swap(int* a, int* b) nnint tmp;ntmp=*a; n*a=*b; n*b=tmp;n51TM51在操作系统中,通过信号量机制使得函数具有可重入性:在操作系统中,通过信号量机制使得函数具有可重入性:nstatic int tmp;nvoid swap(int* a, int* b) nn申请信号量操作申请信号量操作ntmp=*a; n*a=*b; n*b=tmp;n释放信号量操作释放信号量操作 n52TM528.4.2 中断处理程序中断处理程序n在编写中断服务程序时需要满足如下要求:在编写中断服务程序时需要满足如下要求:n(1)不能向中断服务程序传递参数;)不能向中断服务程序传递参数;n(2)中断服务程序没有返回值;)中断服务程序没有返回值;n(3)中断服务程序应要尽可能短,来减少中)中断服务程序应要尽可能短,来减少中断服务程序的处理时间,保证实时系统的性断服务程序的处理时间,保证实时系统的性能。能。53TM538.4.3 模块化程序设计模块化程序设计n嵌入式嵌入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学阅读课活动方案5篇
- 第一学期三年级科学教学总结
- 五官门诊实习鉴定(3篇)
- 关于远程培训总结范文
- 小学生演讲稿放飞梦想(31篇)
- DB12-1120-2022 钢铁工业大气污染物排放标准
- 浙江省温州市(2024年-2025年小学五年级语文)人教版小升初真题(上学期)试卷及答案
- 高频电路教案第五章
- 高精度预制装配式混凝土建筑构件生产技术要求编制说明
- 2024年广东省深圳市福田区十校联考中考英语质检试卷(3月份)
- 2022车企私域运营白皮书
- 知识产权法电子文档
- 论文 小学英语学科育人教育的实践探索
- 继承和发扬中国革命道德
- 《品人录》读书笔记思维导图PPT模板下载
- 医疗器械临床试验质量管理规范考核试题及答案
- 淀粉厂安全生产管理制度
- 家禽类完整版
- 学校食堂供货商选择、评价和退出管理制度
- 风电项目施工组织设计方案
- 大金vrv集中控维修手册
评论
0/150
提交评论