ARM汇编语言与嵌入式C混合编程ppt课件.ppt
《ARM汇编语言与嵌入式C混合编程ppt课件.ppt》由会员分享,可在线阅读,更多相关《ARM汇编语言与嵌入式C混合编程ppt课件.ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1TM第第8章章 ARM汇编语言与嵌入式汇编语言与嵌入式C混合编程混合编程本章首先简要的介绍了嵌入式本章首先简要的介绍了嵌入式C语言的编程规语言的编程规范,嵌入式开发中常用的位运算与控制位域范,嵌入式开发中常用的位运算与控制位域及在嵌入式及在嵌入式C程序设计中要注意的问题,为读程序设计中要注意的问题,为读者进行嵌入式者进行嵌入式C程序设计打基础。然后介绍在程序设计打基础。然后介绍在ARM汇编语言与嵌入式汇编语言与嵌入式C语言进行相互调用语言进行相互调用的标准(的标准(AAPCS),并以大量的实例说明了),并以大量的实例说明了相互调用应注意的问题。相互调用应注意的问题。2TM2内容提要内容提要8
2、.1 嵌入式嵌入式C编程规范编程规范8.2 嵌入式嵌入式C程序设计中的位运算程序设计中的位运算8.3 嵌入式嵌入式C程序设计中的几点说明程序设计中的几点说明8.4 嵌入式嵌入式C程序设计格式程序设计格式8.5 过程调用标准过程调用标准ATPCS与与AAPCS8.6 ARM汇编语言与嵌入式汇编语言与嵌入式C混合编程混合编程3TM38.1 嵌入式嵌入式C编程规范编程规范1、树立良好的编程习惯和编程思路、树立良好的编程习惯和编程思路 ,摒弃那些可能存在风险,摒弃那些可能存在风险的编程行为。保证编写出安全健壮的代码,进而保证嵌的编程行为。保证编写出安全健壮的代码,进而保证嵌 入入式产品的安全性、可靠性
3、。式产品的安全性、可靠性。 2、使编写的代码更加容易阅读、容易理解而且容易维护。、使编写的代码更加容易阅读、容易理解而且容易维护。 3、良好的编程风格是提高程序可靠性非常重要的手段,也是、良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础。大型项目多人合作开发的技术基础。 4、遵循良好的共同的编码规范,也是提高编码能力,保证软、遵循良好的共同的编码规范,也是提高编码能力,保证软件工程这个阶段质量的一个重要手段。同时也是衡量一个组件工程这个阶段质量的一个重要手段。同时也是衡量一个组织软件开发能力的一个重要指标。织软件开发能力的一个重要指标。4TM4 源代码的源代码的
4、C 程序文件可以分为两类:源文件和头文件。源文件程序文件可以分为两类:源文件和头文件。源文件和头文件中包含的内容是不同的。和头文件中包含的内容是不同的。 n只在本文件内部使用的(对外部隐藏的)类型;只在本文件内部使用的(对外部隐藏的)类型;n 只在本文件内部使用的(对外部隐藏的)常量;只在本文件内部使用的(对外部隐藏的)常量;n只在本文件内部使用的(对外部隐藏的)宏定义;只在本文件内部使用的(对外部隐藏的)宏定义;n全局变量和文件级(全局变量和文件级(static)变量的定义;)变量的定义;n函数原型声明和函数定义;函数原型声明和函数定义;n包含文件部分,文件头的说明,函数头的说明。包含文件部
5、分,文件头的说明,函数头的说明。5TM5头文件中包含如下内容:头文件中包含如下内容:n 提供给外部参照的类型;提供给外部参照的类型;n 提供给外部参照常量;提供给外部参照常量;n 提供给外部参照宏定义;提供给外部参照宏定义;n提供给外部参照(全局)函数原型声明;提供给外部参照(全局)函数原型声明;n提供给外部参照全局变量的外部声明;提供给外部参照全局变量的外部声明;n 包含文件部分,文件头的说明。包含文件部分,文件头的说明。 但头文件中不要但头文件中不要定义变量。定义变量。6TM6排版规则如下:排版规则如下: na. 代码缩进空格数为4个。若是可能,尽量用空格来代替Tab键, nb. 较长的语
6、句要分2行来书写,并用符号隔开。 uncrc=calcCRC16(Packet.p,unlen); if(UINT8) uncrc != Packet.down_ser.mCrc0 |(UINT8)(uncrc8)!= Packet.down_ser.mCrc1) BELL(ON); 7TM7nc. 函数代码的参数过长,分多行来书写。函数代码的参数过长,分多行来书写。 void UARTSendAndRecv(UINT8 *ucSendBuf, UINT8 ucSendLength, UINT8 *ucRecvBuf, UINT8 ucRecvLength) nd. if、do、while、s
7、witch、for、case、default等关键字,必须加上大等关键字,必须加上大括号括号。 if(bSendEnd) BELL(ON); 8TM89TM9n方法二:方法二: n 局部变量以小写字母命名;局部变量以小写字母命名; n 全局变量以首字母大写方式命名;全局变量以首字母大写方式命名; n 定义类型和宏定义常数以大写字母命名;定义类型和宏定义常数以大写字母命名; n 变量的作用域越大,它的名字所带有的信息就应该越多。变量的作用域越大,它的名字所带有的信息就应该越多。 n 局部变量:局部变量: int student_age; n 全局变量:全局变量: int StudentAge;
8、n 宏定义常数:宏定义常数:#define STUDENT_NUM 10 n 类型定义:类型定义: typedef INT16S int; 10TM10n全局变量和全局函数的命名一定要详细,不惜多用几个单词全局变量和全局函数的命名一定要详细,不惜多用几个单词,例如函数,例如函数UARTPrintfStringForLCD, n用于编译开关的文件头,必须加上当前文件名称,防止编译用于编译开关的文件头,必须加上当前文件名称,防止编译时产生冲突。时产生冲突。 n例如在例如在UARTInterface.h 头文件中,必须加上以下内容头文件中,必须加上以下内容 #ifndef _UARTINTERFAC
9、E_H_ #define _UARTINTERFACE_H_ extern void UARTPrintfString(CONST INT8* str); extern void UARTSendNBytes(UINT8 *ucSendBytes,UINT8 ucLen); /其他外部声明的代码其他外部声明的代码 #endif 11TM118.2 嵌入式嵌入式C程序设计中的位运算程序设计中的位运算位运算符位运算符描述描述位运算符位运算符描述描述&按位与按位与取反取反|按位或按位或右移右移12TM128.2.1 按位与操作按位与操作n按位与运算符按位与运算符“&”是把参与运算的两个操作是把参与运
10、算的两个操作数所对应的各个二进制位进行按位相与。只数所对应的各个二进制位进行按位相与。只有当对应的两个二进制位全为有当对应的两个二进制位全为1时,结果才为时,结果才为1,否则为,否则为0。参与运算的两个操作数以补码。参与运算的两个操作数以补码形式出现。形式出现。13TM138.2.2按位或操作按位或操作n按位或操作运算符按位或操作运算符“|”是把参与运算的两个是把参与运算的两个操作数对应的各个二进制位进行按位相或。操作数对应的各个二进制位进行按位相或。对应的两个二进制位中只要有一个为对应的两个二进制位中只要有一个为1,结果,结果就为就为1,当两个对应的二进制位都为,当两个对应的二进制位都为0时
11、,结时,结果位为果位为0。参与运算的两个操作数均以补码形。参与运算的两个操作数均以补码形式出现。式出现。14TM148.2.3 按位异或操作按位异或操作n按位异或运算符按位异或运算符“”是将参与运算的两个操是将参与运算的两个操作数对应的各个二进制位进行相异或,当对作数对应的各个二进制位进行相异或,当对应的两个二进制位相异时,结果位为应的两个二进制位相异时,结果位为1,相同,相同时为时为0。参与运算的两个操作数均以补码形式。参与运算的两个操作数均以补码形式出现。出现。15TM158.2.4 取反操作取反操作n取反运算符取反运算符“”实现对参与运算的操作数对实现对参与运算的操作数对应的各个二进制位
12、按位求反。取反运算符应的各个二进制位按位求反。取反运算符“”具有右结合性。所有具有右结合性。所有1变为变为0,0变为变为116TM168.2.5 移位操作移位操作n移位操作分为左移操作与右移操作。左移运移位操作分为左移操作与右移操作。左移运算符算符“”实现将实现将“”左边的操作数的各个左边的操作数的各个二进制位向左移动二进制位向左移动“”实现将实现将“”左边的操作数左边的操作数的各个二进制位向右移动的各个二进制位向右移动“”右边操作数右边操作数所指定的位数。对于空位的补齐方式,无符所指定的位数。对于空位的补齐方式,无符号数与有符号数是有区别的。对无符号数进号数与有符号数是有区别的。对无符号数进
13、行右移时,低位丢弃,高位用行右移时,低位丢弃,高位用0补齐,其值相补齐,其值相当于除以:当于除以:2“右移位数右移位数”次方次方 18TM18 左移操作常常应用与将特定的位置左移操作常常应用与将特定的位置1,这样可,这样可读性更好读性更好 例如例如 #define BIT_UTXD1 (0 x12) #define BIT_UTXD0 (0 x13)19TM198.3 嵌入式嵌入式C程序设计中的几点说明程序设计中的几点说明n8.3.1 volatile限制符限制符n8.3.2 地址强制转换与多级指针地址强制转换与多级指针n8.3.3预处理的使用预处理的使用20TM208.3.1 volatil
14、e限制符限制符nvolatile的本意为的本意为 “暂态的暂态的”或或“易变的易变的”,该说明符起到,该说明符起到抑制编译器优化抑制编译器优化的作用。的作用。 n如果在声明时用如果在声明时用“volatile”关键进行修饰,关键进行修饰,遇到这个关键字声明的变量,编译器对访问遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提该变量的代码就不再进行优化,从而可以提供供特殊地址的稳定访问特殊地址的稳定访问。 21TM21应用说明应用说明n存储器映射的硬件寄存器通常也要加存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能具有不同说明,因为每次对它
15、的读写都可能具有不同的意义。的意义。n中断服务程序中修改的供其他程序检测的变中断服务程序中修改的供其他程序检测的变量需要加量需要加volatile。n多任务环境下各任务间共享的标志应该加多任务环境下各任务间共享的标志应该加volatile进行说明。进行说明。22TM22应用举例:应用举例:n硬件端口寄存器读取问题硬件端口寄存器读取问题char x=0,y=0,z=0;x=ReadChar(0 x5400000);y=x;x=ReadChar(0 x5400000);z=x;23TM23n中断服务程序中修改的供其他程序中断服务程序中修改的供其他程序检测的变量的问题检测的变量的问题static c
16、har flg=0;main(void) while(1) if (flg) /程序代码程序代码A else /程序代码程序代码B 中断服务程序中断服务程序void ISR_INT1(void) flg=1;编译器优化编译器优化static char flg=0;main(void) while(1) /程序代码B 24TM248.3.2 地址强制转换与多级指针地址强制转换与多级指针 n地址强制转换地址强制转换n在在C程序设计中,绝对地址程序设计中,绝对地址0 x0FA00只是被只是被当成一个整型数,如果要把它当成一个地当成一个整型数,如果要把它当成一个地址来使用就需要进行地址强制转换。址来使
17、用就需要进行地址强制转换。n如定义一个整型指针如定义一个整型指针int *p,然后把绝对地,然后把绝对地址址0 x0FA00转换成一个整型的地址值赋给转换成一个整型的地址值赋给这个整型指针,这个整型指针,p = (int *)0 x0FA00。 25TM25n因此在嵌入式程序设计中,经常可以可以看因此在嵌入式程序设计中,经常可以可以看到寄存器用如下方式进行定义:到寄存器用如下方式进行定义:n#define rPCONA(*(volatile unsigned *)0 x1D20000)n#define rPDATA (*(volatile unsigned *)0 x1D20004)26TM2
18、6n多级指针多级指针地地 址址值值地地 址址地地 址址值值值值地地 址址地地 址址地地 址址指指 针针变变 量量一一 级级 指指 针针二二 级级 指指 针针变变 量量变变 量量一一 级级 指指 针针二二 级级 指指 针针三三 级级 指指 针针27TM27#includemain()int value=100;int *p1,*p2,*p3;p1=&value;p2=&p1;p3=&p2;printf(“value=%dn”,value);printf(“value=%dn”,*p1);printf(“value=%dn”,*p2);printf(“value=%dn”,*p3);28TM288
19、.3.3预处理的使用预处理的使用n在源流程序被编译器处理之前在源流程序被编译器处理之前, 编译预处理器编译预处理器首先对源程序中的预处理命令进行展开或处首先对源程序中的预处理命令进行展开或处理。理。n预处理命令书写格式为以预处理命令书写格式为以“#”开头,占单独开头,占单独书写行,语句尾不加分号。书写行,语句尾不加分号。 29TM29n宏定义宏定义(#define)n(1). 不带参数的宏不带参数的宏 n不带参数的宏定义的一般形式为:不带参数的宏定义的一般形式为:n#define 宏名宏名 宏体宏体30TM30n(2).带参数的宏定义带参数的宏定义n带参数的宏定义一般形式为:带参数的宏定义一般
20、形式为:n#define 宏名宏名(参数表参数表) 宏体宏体31TM31(3). 宏定义与函数宏定义与函数32TM32带参宏与函数的区别带参宏与函数的区别 带参宏带参宏函数函数处理时间处理时间编译时被展开编译时被展开程序运行时被处理程序运行时被处理参数类型参数类型无需定义参数类型无需定义参数类型要定义实参,形参数据类型要定义实参,形参数据类型处理过程处理过程不分配内存不分配内存只是进行简单的字符替换只是进行简单的字符替换分配内存单元分配内存单元先求出实参值,再传入形参先求出实参值,再传入形参运行速度运行速度不占运行时间不占运行时间调用和返回占时间调用和返回占时间代码长度代码长度没展开一次都使代
21、码长度增长,没展开一次都使代码长度增长,使用宏次数越多时,宏展开后使用宏次数越多时,宏展开后源程序变长源程序变长函数调用不使代码变长函数调用不使代码变长返回值返回值没有返回值没有返回值可以得到返回值可以得到返回值33TM33n文件包含文件包含(#include) n文件包含的功能是使得一个源文件可以将另文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来,它的一般一个源文件的内容全部包含进来,它的一般形式为:形式为:n#include “文件名文件名”/先搜索当前目录,再搜先搜索当前目录,再搜索标准目录,可以指定目录索标准目录,可以指定目录#include/直接按标准目录搜索直接
22、按标准目录搜索34TM34n/*头文件头文件test.h */n#define SQR(x) (x)*(x)n#define CUBE(x) (x)*(x)*(x)n#define QUAD(x) (x)*(x)*(x)*(x)35TM351./*源文件源文件 test.c*/2.#include 3.#include e:qiutietest.h /指定目录,包含头文件指定目录,包含头文件4.#define MAX_POWER 105.void main()6. int n;7.printf(numbert exp2t exp3t exp4n);8.printf(-t-t-t-n);9.fo
23、r(n=1;n=MAX_POWER;n+)10.printf(%2dt %3dt %4dt %5dn,n,SQR(n),CUBE(n),QUAD(n);11.36TM36n程序运行结果程序运行结果 37TM37n条件编译条件编译n(1). 形式形式1:#ifdef 标识符标识符程序段程序段1#else程序段程序段2#endif 38TM38n(2). 形式形式2n#ifndef 标识符标识符n程序段程序段1n#elsen程序段程序段2n#endif 39TM39n(3). 形式形式3n#ifdef 表达式表达式1程序段程序段1n#elif 表达式表达式2程序段程序段2n #elsen 程序段程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 汇编语言 嵌入式 混合 编程 ppt 课件
限制150内