第5章 嵌入式C语言程序设计基础_第1页
第5章 嵌入式C语言程序设计基础_第2页
第5章 嵌入式C语言程序设计基础_第3页
第5章 嵌入式C语言程序设计基础_第4页
第5章 嵌入式C语言程序设计基础_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第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; 标准头文件# include“头文件名. h”自定义头文件# include宏标识符、5.1内置c语言的预处理伪指令、(2)包含文件伪指令的说

2、明总是在头文件名之后以. h为扩展名,还具有路径头文件中有标准头文件和自定义头文件. 尖括号内的头文件是标准头文件,由开发环境和系统提供。 双引号内的头文件是用户定义的头文件。 搜索首先在当前目录中搜索,然后按环境变量include指定的目录顺序进行搜索。 检索开头文件后,将该伪指令替换为头文件的内容。5.1内置c语言的预处理伪指令,示例5.1标准头文件定义# include # include string.h和stdio.h是标准头文件,按环境变量include指定的目录顺序搜索string.h和stdio.h 示例5.2用户自定义头文件定义# include“s3c2410-ADC.h”

3、s3c 2410-ADC.h头文件中,用户为三星s3c 2410的ARM处理器定制了A/D转换器的各寄存器、5.1嵌入式c语言预处理伪指令,2 .宏定义伪指令宏定义伪指令可分为简单宏、参数宏、条件宏、预定义宏和宏释放。 (1)单纯宏形式: # define宏识别符宏宏由单词序列构成。 如果宏很长,则使用换行字符“”来允许换行,换行字符和后面的换行字符不能进入宏n。 定义宏时,请使用c语言的关键字和预处理器的预定义宏,避免产生毁灭性的结果。 在源文件中,可以使用预处理器伪指令定义宏标识符,然后使用宏标识符创建程序。 预处理器处理源文件后,每次检测到宏标识符时,预处理器都会将宏解压缩为宏。 5.1

4、内置c语言的预处理伪指令,(2)参数宏格式如下: # define宏标识符(形式参数表)宏格式参数表是以逗号分隔的形式参数。 宏由单词序列构成。 如果宏很长,则使用换行字符“”来允许换行,换行字符和后面的换行字符不能进入宏n。 使用参数宏时,将形式参数表替换为相同个数的实际参数表,这与函数的调用相似。 参数宏和函数的区别在于“参数宏”的“参数表”中没有类型标识符。 预处理器在处理参数宏时,以2通道宏展开。 第一次展开宏,第二次将展开的宏用实际参数替换形式参数。 示例5.3在Linux系统的/include/ASM-arm/arch-s3c 2410/s3c 2410.h头文件中定义每个nand

5、闪存控制寄存器,其源代码如下: # define bnand _ CTL (nb definenfconfbnand _ CTL (0x 00 ) # definenfcmdbnand _ CTL (0x 04 ) # definenfaddrbnand _ CTL (0x 08 ) # definenfdatabnand _ CTL (0x0c ) # definenen definenfecbnand_ctl(0x14 ),5.1内置c语言预处理伪指令,5.1内置c语言预处理伪指令,示例5.4linux中ARM S3C2410X芯片的A/D转换驱动程序头文件s3c2410-adc.h中显示

6、定义#define ADC_WRITE(ch,prescale)(ch)16)/*adc设备的主设备编号*/typedef struct structsemaphorlock; /*内核信号量。 多个用户程序同时访问ADC控制器时,用lock同步*/wait_queue_head_t wait; /*排队*/int channel; /*ADC信号*/int prescale; /*预定值*/ADC_DEV; 5.1嵌入式c语言预处理伪指令、静态ADC _ dev adcdev; 定义开始_ ADC _ ain (ch,预调整)do ADC con=预调整_ en |预调整CVL (预调整)|

7、ADC _输入(ch ) ); ADCCON |=ADC_START; B while(0)/*s3c2410x的ADC通道为ch,预定的缩放值为prescale*/PRESCALE_EN宏是ARM S3C2410X芯片的A/D转换控制寄存器的第14位PRSCEMN,即A/D科PRSCVL宏对应于ARM S3C2410X芯片的A/D转换控制寄存器的第6位,设定预定缩放值的/ADC_INPUT宏对应于ARM S3C2410X芯片的A/D转换控制寄存器的第3 5位,通道ADCCON 0是一组1,准备收集数据,5.1内置c语言的预处理伪指令,5.1内置c语言的预处理伪指令(3)条件宏定义格式是格式1

8、: # ifdef宏标识符# undef宏标识符# define宏标识符# else # define宏识别符宏# endif格式2: # ifndef宏识别符# define宏识别符宏识别符# else # undef宏识别符# endif其中,格式1存在测试,格式2 有 else吗?5.1内置c语言预处理伪指令、5.1内置c语言预处理伪指令、(4)解释宏定义的宏标识符。 释放的宏标识符也可以被用来定义其他宏。 格式如下: # undef宏标识符示例5.6 # definesize 512buf=size * blks/*宏扩展为buf=512*blks; * /undef size # d

9、efinesize 128buf=size * blks/*宏是buf=128*blks; */,5.1内置c语言的预处理伪指令,3 .条件编译伪指令的形式如下: # if (条件式1) # elif (条件式2) # elif (条件式n) # else # endif,5.1内置c语言的预处理伪指令示例5.7 # if _ B0 s # elif _ b0size=b0size _ shorttypedefunsignedshorpb0size; # elif _ b0size=b0size _ wordtypedefunsignedlongpb0size; # endif,5.2内置c语

10、言的基本数据类型,5.2.1数据类型和表达式,5.2内置c语言的基本数据类型,(1)类型修饰符,5.2内置c语言的基本数据类型,(2)访问修饰符c语言有两个修饰符,用于控制变量的访问和修改在程序运行时,const修饰符定义的常数始终不变。 例如: const int num; 347; 例如: const int num=100; volatile修饰符用于警告编译器,并且值不会被程序中显式定义的方法更改。 const和volatile可以同时使用。 例如,若0 x30是仅根据外部条件而变化的地址值,则为了避免偶然引起的副作用的影响,需要进行以下说明。 57348; constvolatile

11、unsignedchar *端口=0x 30; 5.2嵌入式c语言的基本数据类型,2 .结构数据类型排列是一系列连续有序的同一类型的数据。 结构是以一定顺序存储不同种类的数据的数据结构。 共用体将不同种类的数据存储在相同开头地址的存储器单元中,共享存储器来节省存储器单元。 列举只是几个可能的值,一个一个地列举。 实际上,一些期望的整数值用符号表示,是整数的子集。 5.2嵌入式c语言的基本数据类型,3 .指针型指针在调用能够动态分配能够有效表现复杂数据结构的内存、能够方便地使用字符串的数组、高效且方便地使用的函数时,能够直接处理多个值的内存地址等。指针的类型与上述数据的类型有很大差异,无论是简单

12、类型的数据还是结构类型的数据都表示数据,指针的类型表示地址。5.2嵌入式c语言的基本数据类型、5.2.2常数1 .数值常数(1)整数常数整数常数又称为整数常数或整数。 c整数常数可分为十进制整数、八进制整数和十六进制整数。 (2)实数型常数实数型常数有单精度实数型常数和倍精度实数型常数。 可以用小数形式或指数形式表示。 (3)字符常数,5.2嵌入式c语言的基本数据类型,5.2嵌入式c语言的基本数据类型,2 .字符串常数字符串常数简称字符串,是用一对双引号包围的字符串。 例如,“China”是字符串常数。 如果数字被定义为文字类型,就不能像5和5那样参加数值运算。 5是字符常数,不直接参与运算,

13、只靠其ASCII代码值(0 x35 )参与运算。 5.2嵌入式c语言的基本数据类型,3 .没有符号常数(1)参数的宏定义宏定义命令#define的一般形式是卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡653其值为3.14159*/main () 喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓6定义的一般形式是: #define宏名(参数表)字符串,在参数表中指定的参数包含在字符串中。 使用时,将程序中的宏名后的实际参数代入字符串中的参数位置。 例如,喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓地6 57348; 编译预处理,语句为157348; 展开于area=3* 2,5.2嵌入

14、式c语言的基本数据类型,说明:卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡耶伊耶伊57348; (2)为了保证运算顺序,请注意在字符串中使用括号。 上述例子变更为area=s (12,2 )耶; 展开后157348; area=12*2; 欧; 这个不符合要求。 在这种情况下,喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓喀嚓青蛙、5.2内置c语言的基本数据类型、5.2.3变量1 .变量的定义变量定义的一般形式如下。 57348; 记忆类型类型标识符修饰符标识符=初始值、标识符=初始值变量的定义由五部分组成,方括号中的有无取决于变量定义

15、的具体情况。5.2嵌入式c语言的基本数据类型为: (1)类型指定符对于数字和字符,其普通类型主要有char、unsigned char、int、unsigned、long、unsigned long、float、double种。 void类型(抽象型)在具体化时可以用类型强制指定类型指定符的任一个。 在typedef中定义的类型别名。 为了提高程序的可读性和移植时的便利性,在c语言中可以从typedef给c语言固有的类型加上别名。 将特定于typedef C的简单类型或复合型别名标识符源类型替换为别名,并在说明中用作类型标识符。 别名通常是用大写字母写的。 例如:类型长比g big x=800

16、00; 5.2内置c语言的基本数据类型,(2)标识符变量名称可以是c语言中允许的有效标识符。 57348; 各变量需要指定类型。 也就是说,请在使用前先定义变量。 57348; 变量被指定为特定的类型时,分配对应字节数的内存区域。 例如,在32位ARM系统中,char类型是1字节,int型是4字节,float是4字节,双字节是8字节。 当然,根据体系结构的不同,系统可能会有所不同。变量可以在程序内的3处定义。 函数内部,函数参数(形状参数)定义中,或者是所有函数外部。 这样定义的变量分别称为局部变量、形式参数、全局变量。 根据位置定义的变量,其范围不同。 在同一层次中定义的变量不能与数组、指针、函数或其他变量名称相同。 57348; 变量是为了存储数据,数据有不同的类型,所以定义对应类型的变量进行存储。 这些数据被称为对应变量的值。 5.2嵌入式c语言的基本数据类型,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论