5嵌入式C语言程序设计基础

上传人:油条 文档编号:2631540 上传时间:2017-07-26 格式:PPT 页数:62 大小:289KB
返回 下载 相关 举报
5嵌入式C语言程序设计基础_第1页
第1页 / 共62页
5嵌入式C语言程序设计基础_第2页
第2页 / 共62页
5嵌入式C语言程序设计基础_第3页
第3页 / 共62页
5嵌入式C语言程序设计基础_第4页
第4页 / 共62页
5嵌入式C语言程序设计基础_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《5嵌入式C语言程序设计基础》由会员分享,可在线阅读,更多相关《5嵌入式C语言程序设计基础(62页珍藏版)》请在金锄头文库上搜索。

1、,第5讲 嵌入式C语言程序设计基础,5.1 嵌入式C语言的预处理伪指令5.2 嵌入式C语言的基本数据类型 5.3 函数5.4 汇编语言与C/C+的混合编程,5.1 嵌入式C语言的预处理伪指令,1文件包含伪指令 文件包含伪指令可将头文件包含到程序中,头文件中定义的内容有符号常量,复合变量原型、用户定义的变量原型和函数的原型说明等。编译器编译预处理时用文件包含的正文件内容替换到实际程序中。(1)文件包含伪指令的格式# include /*标准头文件*/# include “头文件名.h” /*自定义头文件*/,5.1 嵌入式C语言的预处理伪指令,(2)包含文件伪指令的说明 常在头文件名后用.h作为

2、扩展名,可带或不带路经。 头文件可分为标准头文件和自定义头文件。 尖括号内的头文件为标准头文件,由开发环境或系统提供。 双引号内的头文件为用户自定义头文件。搜索时,首先在当前目录中搜索,其次按环境变量include指定的目录顺序搜索。 搜索到头文件后,就将该伪指令直接用头文件内容替换。,5.1 嵌入式C语言的预处理伪指令,例5.1 标准头文件定义# include # include string.h和stdio.h是标准头文件,按环境变量 include指定的目录顺序搜索string.h和stdio.h。例5.2 用户自定义头文件定义 # include “s3c2410-adc.h” s3

3、c2410-adc.h头文件是用户自定义有关三星s3c2410的ARM处理器的A/D转换器各寄存器。,5.1 嵌入式C语言的预处理伪指令,2宏定义伪指令宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。(1)简单宏格式如下:# define 宏标识符 宏体 宏体是由单词序列组成。宏体超长时,允许使用续行符“”进行续行,续行符和其后的换行符 n 都不会进入宏体。 在定义宏时,应尽量避免使用C语言的关键字和预处理器的预定义宏,以免引起灾难性的后果。 在源文件中,用预处理器伪指令定义过宏标识符之后,就可用宏标识编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便将宏展为宏体。,

4、5.1 嵌入式C语言的预处理伪指令,(2)参数宏格式如下:# define 宏标识符(形式参数表) 宏体 形式参数表为逗号分割的形式参数。 宏体是由单词序列组成。宏体超长时,允许使用续行符“”进行续行,续行符和其后的换行符 n 都不会进入宏体。 使用参数宏时,形式参数表应换为同样个数的实参数表,这一点类似于函数的调用。参数宏与函数的区别在于参数宏的形参数表中没有类型说明符。 预处理器在处理参数宏时使用2遍宏展开。第1遍展开宏体,第2遍对展开后的宏体用实参数替换形式参数。,例5.3 在Linux系统的/include/asm-arm/arch-s3c2410/S3C2410.h头文件中定义了各N

5、and Flash控制寄存器,其源代码如下:#define bNAND_CTL(Nb) _REG(0x4e000000 + (Nb)#define NFCONF bNAND_CTL(0x00)#define NFCMD bNAND_CTL(0x04)#define NFADDR bNAND_CTL(0x08)#define NFDATA bNAND_CTL(0x0c)#define NFSTAT bNAND_CTL(0x10)#define NFECC bNAND_CTL(0x14),5.1 嵌入式C语言的预处理伪指令,5.1 嵌入式C语言的预处理伪指令,例5.4 在Linux下ARM S3C

6、2410X芯片的A/D转换的驱动程序的头文件s3c2410-adc.h中定义了下面三个宏。#define ADC_WRITE(ch, prescale) (ch)16)&0x7) /*获得ADC通道号*/#define ADC_WRITE_GETPRE(data) (data)&0xff) /*获得ADC的预定标值*/,5.1 嵌入式C语言的预处理伪指令,(3)条件宏定义格式如下:格式1:# ifdef 宏标识符 /若标识符已定义 # undef 宏标识符 # define 宏标识符 宏体# else # define 宏标识符 宏体# endif,格式2:# ifndef 宏标识符 /若标识

7、符未定义 # define 宏标识符 宏体# else # undef 宏标识符# define 宏标识符 宏体# endif其中: 格式1是测试存在,格式2是测试不存在。 else可有,也可没有。,5.1 嵌入式C语言的预处理伪指令,5.1 嵌入式C语言的预处理伪指令,(4)宏释放用于释放原先定义的宏标识符。经释放后的宏标识符可再次用于定义其他宏体。格式如下:# undef 宏标识符例5.6 #define SIZE 512 buf=SIZE*blks /*宏扩展为buf=512*blks; */#undef SIZE #define SIZE 128buf=SIZE*blks /*宏扩展为

8、buf=128*blks; */,5.1 嵌入式C语言的预处理伪指令,3条件编译伪指令格式如下:# if(条件表达式1) # elif (条件表达式2) # elif (条件表达式3)# elif (条件表达式n)# else# endif,5.1 嵌入式C语言的预处理伪指令,例5.7 # if _B0SIZE=B0SIZE_BYTEtypedef unsigned char PB0SIZE;# elif _B0SIZE=B0SIZE_SHORTtypedef unsigned short PB0SIZE;# elif _B0SIZE=B0SIZE_WORDtypedef unsigned l

9、ong PB0SIZE;# endif,5.1 嵌入式C语言的预处理伪指令5.2 嵌入式C语言的基本数据类型 5.3 函数5.4 汇编语言与C/C+的混合编程,5.2嵌入式C语言的基本数据类型,5.2.1 数据类型与表达式,5.2 嵌入式C语言的基本数据类型,(1) 类型修饰符,5.2 嵌入式C语言的基本数据类型,(2) 访问修饰符C语言有两个用于控制访问和修改变量方式的修饰符,分别是常量(const)和易变量(volatile)。带const修饰符定义出的常量在程序运行过程中始终保持不变。例如: const int num;例如: const int num=100;,5.2 嵌入式C语言的

10、基本数据类型,(2) 访问修饰符C语言有两个用于控制访问和修改变量方式的修饰符,分别是常量(const)和易变量(volatile)。volatile修饰符用于提醒编译程序,该变量的值可以不通过程序中明确定义的方法来改变,而是从内存中读取最新数据(抑制编译器优化)。例如: volatile int num=0;/num的值由内存中实际数据决定,初始值不一定为0,#includechar a = A; / global void msg() printf(Hellon); ,5.2 嵌入式C语言的基本数据类型,int main(void) extern char a; / printf(%c ,

11、 a); (void)msg(); return 0;,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突.,static的作用有2条:(1)隐藏; (2)赋初始值一次有效,fun(int a) int b=0; static int c=3; b+; c+; return(a+b+c);,5.2 嵌入式C语言的基本数据类型,main() int i; int

12、a=5 for(i=0;i3;i+) printf(%d,fun(a);运行结果为:10、11、12,第一次计算:a=5,b=1,c=4输出:10第二次计算:a=5,b=1,c=5输出:11第三次计算:a=5,b=1,c=6输出:12这里因为b是局部变量,所以每次调用都被重新置为0,而c为静态局部变量,所以只赋一次初值。,/赋初值,一次有效,static的作用有2条:(1)隐藏; (2)赋初始值一次有效,#includeintfun(void)staticintcount=10;/赋初值,一次有效returncount-;intcount=1;intmain(void)printf(globa

13、lttlocalstaticn);for(;count=10;+count)printf(%dtt%dn,count,fun();return0;,5.2 嵌入式C语言的基本数据类型,(1)隐藏+(2)赋初值一次有效,5.2 嵌入式C语言的基本数据类型,3. 位运算符,5.1 嵌入式C语言的预处理伪指令5.2 嵌入式C语言的基本数据类型 5.3 函数5.4 汇编语言与C/C+的混合编程,5.3 函数,内联函数(相当于宏)内联函数与一般函数不同的是,它不是在调用时发生转移,而是在编译时将函数体嵌入在每一个调用语句处。这样就相对节省了参数传递、系统栈的保护与恢复等的开销。 内联函数的定义形式为: (含类型说明的形参表)函数体,内联函数(相当于宏),例5.12 内联函数例题。 #include #include inline int max(int a,int b) if(ab) return a;else return b;,void main()int a,b,c,d;a=210;b=150;c=20;d=max(a,b);d=max(d,c);/编译时两个调用处均被替换为max函数体语句printf(The biggest of %d %d %d is %d, a,b,c,d),

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

当前位置:首页 > 行业资料 > 其它行业文档

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