第8章 ARM汇编语言与嵌入式C混合编程(1)

上传人:飞*** 文档编号:6447569 上传时间:2017-08-08 格式:PPT 页数:54 大小:261KB
返回 下载 相关 举报
第8章 ARM汇编语言与嵌入式C混合编程(1)_第1页
第1页 / 共54页
第8章 ARM汇编语言与嵌入式C混合编程(1)_第2页
第2页 / 共54页
第8章 ARM汇编语言与嵌入式C混合编程(1)_第3页
第3页 / 共54页
第8章 ARM汇编语言与嵌入式C混合编程(1)_第4页
第4页 / 共54页
第8章 ARM汇编语言与嵌入式C混合编程(1)_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《第8章 ARM汇编语言与嵌入式C混合编程(1)》由会员分享,可在线阅读,更多相关《第8章 ARM汇编语言与嵌入式C混合编程(1)(54页珍藏版)》请在金锄头文库上搜索。

1、配套教材:ARM嵌入式系统结构与编程,邱铁 编著,清华大学出版社,2009,3,ARM嵌入式系统结构与编程,第8章 ARM汇编语言与嵌入式C混合编程,本章首先简要的介绍了嵌入式C语言的编程规范,嵌入式开发中常用的位运算与控制位域及在嵌入式C程序设计中要注意的问题,为读者进行嵌入式C程序设计打基础。然后介绍在ARM汇编语言与嵌入式C语言进行相互调用的标准(AAPCS),并以大量的实例说明了相互调用应注意的问题。,内容提要,81 嵌入式C编程规范82 嵌入式C程序设计中的位运算83 嵌入式C程序设计中的几点说明84 嵌入式C程序设计格式85 过程调用标准ATPCS与AAPCS86 ARM汇编语言与

2、嵌入式C混合编程,8.1 嵌入式C编程规范,在当前的嵌入式开发中,嵌入式C语言是最为常见的程序设计语言,对于程序员来说,能够完成相应功能的代码并不一定是优秀的代码。优秀的代码还要具备易读性、易维护性、具有可移植和高可靠性。,8.1.1 嵌入式C程序书写规范,排版规则如下: (1)程序块要采用缩进风格编写 (2)较长的语句(例如超过80个字符)要分成多行书写 (3)循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分 (4)若函数或过程中参数较长,也要进行适当的划分。(5)一般不要把多个短语句写在一行中 (6)程序块的分界符语句的大括号“”与“”一般独占一行并且在同一列,书写规范示例:,

3、8.1.2 命名规则,(1)标识符的名称要简明,能够表达出确切的含义,可以使用完整的单词或通常可以理解的缩写。(2)如果在命名中使用特殊约定或缩写,则要进行注释说明。 (3)对于变量命名,一般不取单个字符 ,例如i、j、k. (4)函数名一般以大写字母开头;所有常量名字母统一用大写。,8.1.3 注释说明,注释有助于程序员理解程序的整体结构,也便于以后程序代码的维护与升级。常用的规则如下: (1)注释语言必须准确、简洁且容易理解;(2)程序代码源文件头部应进行注释说明 ;(3)函数头部应进行注释;(4)程序中所用到的特定含义的常量、变量,在声明时都要加以注释 ;,(5)对于宏定义、数据结构声明

4、,如果其命名不是充分自注释的,也要加以注释。(6)如果注释单独占用一行,与其被注释的内容进行相同的缩进方式,一般将注释与其上面的代码用空行隔开 (7)程序代码修改时,其注释也要及时修改,一定要保证代码与注释保持一致。,命名规则示例:,8.2 嵌入式C程序设计中的位运算,在嵌入式程序设计中,位操作是最常用的运算之一,因为在很多情况下要对寄存器中的某位或某个管脚进行操作,这些都需要用位操作来完成。,8.2.1 按位与操作,按位与运算符“&”是把参与运算的两个操作数所对应的各个二进制位进行按位相与。只有当对应的两个二进制位全为1时,结果才为1,否则为0。参与运算的两个操作数以补码形式出现。,例如7

5、& 3,补码分别为0000 0111与0000 0011 按位与运算后结果为0000 0011等于十进制的3。按位与操作可以实现将特定的位清零,也可以用于提取出某数的指定位。,8.2.2按位或操作,按位或操作运算符“|”是把参与运算的两个操作数对应的各个二进制位进行按位相或。对应的两个二进制位中只要有一个为1,结果就为1,当两个对应的二进制位都为0时,结果位为0。参与运算的两个操作数均以补码形式出现。,例如7 | 3,7的补码为0000 0111,3的补码为0000 0011,结果为0000 0111。按位与操作可以实现将特定位的置位操作,也可以用于提取出某数的指定位。,8.2.3 按位异或操

6、作,按位异或运算符“”是将参与运算的两个操作数对应的各个二进制位进行相异或,当对应的两个二进制位相异时,结果位为1,相同时为0。参与运算的两个操作数均以补码形式出现。,例如7 | 3,7的补码为0000 0111,3的补码为0000 0011,结果为0000 0100。,应用举例:,通过3次异或操作将寄存器rPDATAE中的内容与变量tmp的值进行交换。,rPDATAE = rPDATAE tmptmp = tmp rPDATAE rPDATAE = rPDATAE tmp,8.2.4 取反操作,取反运算符“”实现对参与运算的操作数对应的各个二进制位按位求反。取反运算符“”具有右结合性。所有1

7、变为0,0变为1,。例如(0101 1001) = 1010 0110。在程序中主要用于将操作数的某位或某些位取反,为其他操作提供数据准备。,8.2.5 移位操作,移位操作分为左移操作与右移操作。左移运算符“”实现将“”左边的操作数的各个二进制位向左移动“”实现将“”左边的操作数的各个二进制位向右移动“”右边操作数所指定的位数。对于空位的补齐方式,无符号数与有符号数是有区别的。对无符号数进行右移时,低位丢弃,高位用0补齐,其值相当于除以:2“右移位数”次方,8.3 嵌入式C程序设计中的几点说明,8.3.1 volatile限制符8.3.2 地址强制转换与多级指针8.3.3预处理的使用,8.3.

8、1 volatile限制符,volatile的本意为 “暂态的”或.“易变的”,该说明符起到抑制编译器优化的作用。 如果在声明时用“volatile”关键进行修饰,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供特殊地址的稳定访问。,应用举例:,见教材ARM嵌入式系统结构与编程 193页例8.4,8.3.2 地址强制转换与多级指针,地址强制转换在C程序设计中,绝对地址0x0FA00只是被当成一个整型数,如果要把它当成一个地址来使用就需要进行地址强制转换。如定义一个整形指针int *p,然后把绝对地址0x0FA00转换成一个整形的地址值赋给这个整形指针,p = (i

9、nt *)0x0FA00。,因此在嵌入式程序设计中,经常可以可以看到寄存器用如下方式进行定义:#define rPCONA(*(volatile unsigned *)0x1D20000)#define rPDATA(*(volatile unsigned *)0x1D20004),多级指针,8.3.3预处理的使用,在源流程序被编译器处理之前, 编译预处理器首先对源程序中的预处理命令进行展开或处理。预处理命令书写格式为以“#”开头,占单独书写行,语句尾不加分号。,宏定义(#define)(1). 不带参数的宏 不带参数的宏定义的一般形式为:#define 宏名 宏体,(2).带参数的宏定义带参

10、数的宏定义一般形式为:#define 宏名(参数表) 宏体,(3). 宏定义与函数,带参宏与函数的区别,文件包含(#include) 文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来,它的一般形式为:#include “文件名”/先搜索当前目录,再搜索标准目录,可以指定目录#include/直接按标准目录搜索,应用举例见教材ARM嵌入式系统结构与编程第198页例8-9,/*头文件test.h */#define SQR(x) (x)*(x)#define CUBE(x) (x)*(x)*(x)#define QUAD(x) (x)*(x)*(x)*(x),/*源文件 test

11、.c*/#include #include e:qiutietest.h /指定目录,包含头文件#define MAX_POWER 10void main() int n;printf(numbert exp2t exp3t exp4n);printf(-t-t-t-n);for(n=1;n=MAX_POWER;n+)printf(%2dt %3dt %4dt %5dn,n,SQR(n),CUBE(n),QUAD(n);,程序运行结果,条件编译(1). 形式1:,#ifdef 标识符程序段1#else程序段2#endif,(2). 形式2#ifndef 标识符程序段1#else程序段2#end

12、if,(3). 形式3#ifdef 表达式1程序段1#elif 表达式2程序段2 #else 程序段3#endif,8.4嵌入式C程序设计格式,8.4.1 可重入函数8.4.2 中断处理程序8.4.3 模块化程序设计,8.4.1 可重入函数,如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有可重入性(reentrant) 。,可重入函数可以使用局部变量,也可以使用全局变量。如果使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护,示例解析:,分析下面的函数是否具有可重入性 static int tmp;void swap(int* a, int* b

13、) tmp=*a; *a=*b; *b=tmp;,void swap(int* a, int* b) int tmp;tmp=*a; *a=*b; *b=tmp;,在操作系统中,通过信号量机制使得函数具有可重入性:static int tmp;void swap(int* a, int* b) 申请信号量操作tmp=*a; *a=*b; *b=tmp;释放信号量操作 ,8.4.2 中断处理程序,在编写中断服务程序时需要满足如下要求:(1)不能向中断服务程序传递参数;(2)中断服务程序没有返回值;(3)中断服务程序应要尽可能短,来减少中断服务程序的处理时间,保证实时系统的性能。,8.4.3 模块化程序设计,嵌入式C程序设计主要采用模块化设计方法,将系统内的任务进行合理的划分,将具有同一属性或相同类别的代码归为一类组成模块,每个模块的功能相对独立。将整个软件系统分为多个模块,编程思路就会很清晰。,嵌入式系统软件模块划分,示例解析,应用举例见教材ARM嵌入式系统结构与编程第202页例8-14,第8章 ARM汇编语言与嵌入式C混合编程,上半部完,下半部内容提示,85 过程调用标准ATPCS与AAPCS86 ARM汇编语言与嵌入式C混合编程,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号