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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章嵌入式C语言程序设计基础5.1嵌入式C语言的预处理伪指令5.2嵌入式C语言的基本数据类型5.3程序的控制结构5.4函数5.5数组5.6指针5.7构造数据类型5.8汇编语言与C/C++的混合编程5.9嵌入式Linux下C语言编程——文件的操作5.1嵌入式C语言的预处理伪指令1.文件包含伪指令文件包含伪指令可将头文件包含到程序中,头文件中定义的内容符号常量,复合变量原型、用户定义的变量原型和函数的原型说明等。编译器编译预处理时用文件包含的正文件内容替换到实际程序中。(1)文件包含伪指令的格式#include头文件名.h;标准头文件#include“头文件名.h”;自定义头文件#include宏标识符5.1嵌入式C语言的预处理伪指令(2)包含文件伪指令的说明●常在头文件名后用.h作为扩展名,可带或不带路经。●头文件可分为标准头文件和自定义头文件。●尖括号内的头文件为标准头文件,由开发环境或系统提供。●双引号内的头文件为用户自定义头文件。搜索时,首先在当前目录中搜索,其次按环境变量include指定的目录顺序搜索。●搜索到头文件后,就将该伪指令直接用头文件内容替换。5.1嵌入式C语言的预处理伪指令例5.1标准头文件定义#includestring.h#includestdio.hstring.h和stdio.h是标准头文件,按环境变量include指定的目录顺序搜索string.h和stdio.h。例5.2用户自定义头文件定义#include“s3c2410-adc.h”s3c2410-adc.h头文件是用户自定义有关三星s3c2410的ARM处理器的A/D转换器各寄存器。5.1嵌入式C语言的预处理伪指令2.宏定义伪指令宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。(1)简单宏格式如下:#define宏标识符宏体●宏体是由单词序列组成。宏体超长时,允许使用续行符“\”进行续行,续行符和其后的换行符\n都不会进入宏体。●在定义宏时,应尽量避免使用C语言的关键字和预处理器的预定义宏,以免引起灾难性的后果。●在源文件中,用预处理器伪指令定义过宏标识符之后,就可用宏标识编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便将宏展为宏体。5.1嵌入式C语言的预处理伪指令(2)参数宏格式如下:#define宏标识符(形式参数表)宏体形式参数表为逗号分割的形式参数。●宏体是由单词序列组成。宏体超长时,允许使用续行符“\”进行续行,续行符和其后的换行符\n都不会进入宏体。●使用参数宏时,形式参数表应换为同样个数的实参数表,这一点类似于函数的调用。参数宏与函数的区别在于参数宏的形参数表中没有类型说明符。●预处理器在处理参数宏时使用2遍宏展开。第1遍展开宏体,第2遍对展开后的宏体用实参数替换形式参数。例5.3在Linux系统的/include/asm-arm/arch-s3c2410/S3C2410.h头文件中定义了各NandFlash控制寄存器,其源代码如下:#definebNAND_CTL(Nb)__REG(0x4e000000+(Nb))#defineNFCONFbNAND_CTL(0x00)#defineNFCMDbNAND_CTL(0x04)#defineNFADDRbNAND_CTL(0x08)#defineNFDATAbNAND_CTL(0x0c)#defineNFSTATbNAND_CTL(0x10)#defineNFECCbNAND_CTL(0x14)5.1嵌入式C语言的预处理伪指令5.1嵌入式C语言的预处理伪指令例5.4在Linux下ARMS3C2410X芯片的A/D转换的驱动程序的头文件s3c2410-adc.h中定义了下面三个宏。#defineADC_WRITE(ch,prescale)((ch)16|(prescale))/*ADC通道号与预标值合成一个字*/#defineADC_WRITE_GETCH(data)(((data)16)&0x7)/*获得ADC通道号*/#defineADC_WRITE_GETPRE(data)((data)&0xff)/*获得ADC的预定标值*/例5.5在Linux下ARMS3C2410X芯片的A/D转换的驱动程序实现代码s3c2410-adc.c中的系统资源和宏定义。#defineDEVICE_NAMEs3c2410-adc“/*定义ADC设备的名字*/#defineADCRAW_MINOR1staticintadcMajor=0;/*定义ADC设备的主设备号*/typedefstruct{structsemaphorelock;/*内核信号量,当多个用户程序同时访问一个ADC控制器时,用lock进行同步*/wait_queue_head_twait;/*等待队列*/intchannel;/*ADC通道号*/intprescale;/*预定标值*/}ADC_DEV;5.1嵌入式C语言的预处理伪指令staticADC_DEVadcdev;#defineSTART_ADC_AIN(ch,prescale)\do{ADCCON=PRESCALE_EN|PRSCVL(prescale)|ADC_INPUT((ch));\ADCCON|=ADC_START;\}while(0)/*设置S3C2410X的ADC的通道为ch、预定标值为prescale*///PRESCALE_EN宏对应ARMS3C2410X芯片的A/D转换控制寄存器的第14位PRSCEMN,即A/D转换器预标器使能;//PRSCVL宏对应ARMS3C2410X芯片的A/D转换控制寄存器的第6位,设置预定标值;//ADC_INPUT宏对应ARMS3C2410X芯片的A/D转换控制寄存器的第3~5位,选择通道号;//ADCCON|=ADC_START;ADCCON0为置1,准备采集数据5.1嵌入式C语言的预处理伪指令5.1嵌入式C语言的预处理伪指令(3)条件宏定义格式如下:格式1:#ifdef宏标识符#undef宏标识符#define宏标识符宏体#else#define宏标识符宏体#endif格式2:#ifndef宏标识符#define宏标识符宏体#else#undef宏标识符#define宏标识符宏体#endif其中:格式1是测试存在,格式2是测试不存在。else可有,也可没有。5.1嵌入式C语言的预处理伪指令5.1嵌入式C语言的预处理伪指令(4)宏释放用于释放原先定义的宏标识符。经释放后的宏标识符可再次用于定义其他宏体。格式如下:#undef宏标识符例5.6#defineSIZE512…buf=SIZE*blks/*宏扩展为buf=512*blks;*/…undefSIZE#defineSIZE128…buf=SIZE*blks/*宏扩展为buf=128*blks;*/5.1嵌入式C语言的预处理伪指令3.条件编译伪指令格式如下:#if(条件表达式1)…#elif(条件表达式2)…#elif(条件表达式3)…#elif(条件表达式n)…#else…#endif5.1嵌入式C语言的预处理伪指令例5.7#if_B0SIZE==B0SIZE_BYTEtypedefunsignedcharPB0SIZE;#elif_B0SIZE==B0SIZE_SHORTtypedefunsignedshortPB0SIZE;#elif_B0SIZE==B0SIZE_WORDtypedefunsignedlongPB0SIZE;#endif5.2嵌入式C语言的基本数据类型5.2.1数据类型与表达式5.2嵌入式C语言的基本数据类型(1)类型修饰符5.2嵌入式C语言的基本数据类型(2)C语言有两个用于控制访问和修改变量方式的修饰符,分别是常量(const)和易变量(volatile)。带const修饰符定义出的常量在程序运行过程中始终保持不变。例如:constintnum;例如:constintnum=100;volatile修饰符用于提醒编译程序,该变量的值可以不通过程序中明确定义的方法来改变。const和volatile可以同时使用。例如,假设0x30是一个只随外部条件而变化的口地址值,那么就恰好需要用下述说明来避免偶然因素所产生的副作用的影响。constvolatileunsignedchar*port=0x30;5.2嵌入式C语言的基本数据类型2.构造数据类型数组是一组连续、有序的存放在一起的具有相同类型的数据。结构体是将不同类型的数据按一定顺序存放在一起的数据结构。共用体是将不同类型的数据都存放在同一起始地址的内存单元中,共用一段内存以节省内存单元。枚举是只有几种可能的值,将其一一列举出来。实际是用符号来表示若干个可取的整型值,它是整型的一个子集。5.2嵌入式C语言的基本数据类型3.指针类型指针可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于一个的值;能直接处理内存地址等。指针类型迥异于前述各种数据类型,不管是简单类型的数据,还是构造类型数据,均是代表数据的,而指针类型是代表地址的。5.2嵌入式C语言的基本数据类型5.2.2常量1.数值常量(1)整型常量也称为整型常数或整数。C整型常量按进制分可分为十进制整数,八进制整数和十六进制整数。(2)实型常量实型常量有单精度实型常量和双精度实型常量。可用小数形式或指数形式表示。(3)字符常量5.2嵌入式C语言的基本数据类型5.2嵌入式C语言的基本数据类型2.字符串常量字符串常量简称字符串,是用一对双引号括起来的字符序列。例如“China”就是一个字符串常量。若数字被定义为字符型之后就不能参与数值运算,如`5`和5是不同的。`5`是字符常量,不能直接参与运算,而只能以其ASCII码值(0x35)来参与运算。5.2嵌入式C语言的基本数据类型3.符号常量(1宏定义命令#define的一般形式是:#define宏名字符串用来终止宏名作用域命令#undef的一般形式是:#undef例5.8:#definePI3.14159/*定义PI为常量,其值是3.14159*/main(){…}#undefPI/*终止宏名PI的作用域*/f1()5.2嵌入式C语言的基本数据类型(2它不是进行简单的字符串替换,还要进行参数替换。其定义的一般形式为:#define宏名(参数表)其中字符串中包括参数表中所指定的参数。在使用时,要将程序中宏名后的实际参数代入字符串中参数的位置。例如:#defineS(a,b)a*b…area=S(3,2);经编译预处理,area=3*2;5.2嵌入式C语言的基本数据类型说明:(1)宏名和参数表左括号之间不能有空格,否则按不带参宏替换了。(2)字符串中应注意括号的使用,以保证运算次序。如上例改成area=S(1+2,2);area=1+2*2;这就不合要求了。此时,可改写成#defineS(a,b)(a)*(b)…area=S(1+2,2)经展开后变成area=(1+2)*(2);就不会出现错误了。5.2嵌入式C语言的基本数据类型5.2.3变量1.变量的定义变量定义的一般形式如下:[存储类型]类型说明符[修饰符]标识符[=初值][,标识符[=初值]]…;变量的定义由5部分组成,方括号中的可有可无,变量定义的具体情况而定。5.2嵌入式C语言的基本数据类型(1)类型说明符●对于数字与字符,其常用的类型主要有8种:char、unsignedchar、int、unsigned、long、unsignedlong、float、double。●void类型(抽象型),在具体化时可用类型强制来指定类型说明符中的任意一类。●通过typedef定义的类型别名。为了增加程序的可读性和移植程序时的方便,C语言允许用户为C语言固有的类型用typedef起别名。格式如下:typedefC固有的简单类型或复合类型别名标识符;用别名代替原来的类型,在说明中用作类型说明符。别名一般用大写字符,例如:ty

1 / 117
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功