嵌入式系统程序设计.ppt
《嵌入式系统程序设计.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统程序设计.ppt(282页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式系统程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望C/C+语言摘要语言摘要oC语言的历史和特点语言的历史和特点o预处理程序预处理程序o位运算位运算o函数指针函数指针oC程序的移植程序的移植一、一、C语言的历史和特点语言的历史和特点oC语言的历史语言的历史oC语言的特点语言的特点C语言的优良特性语言的优良特性n结构化语言,代码数据分离结构化语言,代码数据分离n包含指针特性,允许对地址操作包含指针特性,允许对地址操作n语法简洁紧凑,但功能强大语法简洁紧
2、凑,但功能强大n编程方便,运行速度快编程方便,运行速度快n支持分离编译支持分离编译C语言的缺点语言的缺点n封装性不如封装性不如C+,数据安全性上有缺陷,数据安全性上有缺陷n 类型检查机制相对薄弱类型检查机制相对薄弱n 指针的操作带来许多不安全因素指针的操作带来许多不安全因素n 比其他高级语言较难掌握比其他高级语言较难掌握二、预处理程序二、预处理程序oC89规定的预处理指令有以下几条规定的预处理指令有以下几条n#ifn#ifdefn#ifndefn#elsen#elifn#endifn#definen#undefn#linen#errorn#pragman#include预处理预处理语句的书写规
3、则语句的书写规则o作用:对源程序编译之前做一些处理,作用:对源程序编译之前做一些处理,生成扩展生成扩展C源程序源程序o格式:格式:n“#”开头开头n占单独书写行占单独书写行n语句尾不加分号语句尾不加分号o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)如#define YE
4、S 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)宏体可缺省,表示宏名定义过如#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏
5、名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结
6、束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名例#define ID 1 main()#undef ID#define ID 0 max()YES原作用域YES新作用域如 if(x=YES)printf(“correct!n”);else if(x=NO)printf(“error!n”);展开后:if(x=1)printf(“correct!n”);else if(x=0)printf(“error!n”);o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏
7、名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语
8、法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换例#define ID 1 语句printf(ID);会输出ID,而非1o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查
9、不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定义可嵌套,不能递归宏定义可嵌套,不能递归例#define ID ID+1 ()o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换例#define DIS1 10#define DIS2 DIS1+10 var=DIS2*2;宏展开:var=10+10*2;o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指
10、定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定义可嵌套,不能递归宏定义可嵌套,不能递归o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换o宏定义中使用必要的括号宏定义中使用必要的括号()()例#define DIS1 10#define DIS2 (DIS1+10)var=D
11、IS2*2;宏展开:var=(10+10)*2;o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定义可嵌套,不能递归宏定义可嵌套,不能递归o引号中的内容与宏名相同不置换
12、引号中的内容与宏名相同不置换o宏定义中使用必要的括号宏定义中使用必要的括号()()o宏体可以省略,表示宏名已被定义过宏体可以省略,表示宏名已被定义过/*ch3_1.c*/#include#define Aint main()#ifdef Aprintf(A has been definedn);#elseprintf(A has not been definedn);#endifreturn 0;输出为:输出为:“A has been defined”,即使把宏定义改为:,即使把宏定义改为:#define A0输出仍旧为:输出仍旧为:“A has been defined”。n带参数宏定义带参
13、数宏定义o一般形式:一般形式:#define 宏名宏名(参数表参数表)宏体宏体例#define T (m,n)m*n相当于定义了不带参宏T,其宏体为“(m,n)m*n”o宏展开:形参用实参换,其它字符保留宏展开:形参用实参换,其它字符保留例#define T(m,n)m*n .area=T(3,2);宏展开:area=3*2;不能加空格n带参数宏定义带参数宏定义o一般形式:一般形式:#define 宏名宏名(参数表参数表)宏体宏体o宏展开:形参用实参换,其它字符保留宏展开:形参用实参换,其它字符保留o宏体及各形参外一般应加括号宏体及各形参外一般应加括号()()例#define T(m,n)m*
14、n .area=T(3,2);宏展开:area=3*2;例#define CUBE(x)x*x*x a=4;b=6;z=CUBE(a+b);宏展开:z=a+b*a+b*a+b;一般写成:#define CUBE(x)(x)*(x)*(x)宏展开:z=(a+b)*(a+b)*(a+b);#define FUNC(x,y)(x)(y)?(x):(y).main()int a,b,c,d,t;.t=FUNC(a+b,c+d);宏展开:宏展开:t=(a+b)(c+d)?(a+b):(c+d);int func(int x,int y)return(xy?x:y);main()int a,b,c,d,t
15、;.t=func(a+b,c+d);例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能o带参的宏与函数区别带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间Embest开发环境中的宏定义开发环境中的宏定义o44b.h有有44B0X中各个特殊功能寄存器的中各个特殊功能寄存器的宏定义宏定义#define rBWSCON(*(volatile unsigned*)0 x1c80000)#define rBANKCON0(*(volatil
16、e unsigned*)0 x1c80004)#define rBANKCON1(*(volatile unsigned*)0 x1c80008)#define rBANKCON2(*(volatile unsigned*)0 x1c8000c)#define rBANKCON3(*(volatile unsigned*)0 x1c80010)#define rBANKCON4(*(volatile unsigned*)0 x1c80014)#define rBANKCON5(*(volatile unsigned*)0 x1c80018)预定义宏预定义宏oC89规范了五个固有的预定义宏,分别
17、为:规范了五个固有的预定义宏,分别为:n_LINE_:行号:行号n_FILE_:文件名:文件名n_DATE_:日期:日期n_TIME_:时间:时间n_STDC_:1标准标准C编译器编译器 0非标准非标准C编译器编译器预定义宏预定义宏#include int main()printf(The current file is:%sn,_FILE_);printf(The current line number is:%dn,_LINE_);printf(today is:%sn,_DATE_);printf(the time is:%sn,_TIME_);if(_STDC_=1)printf(th
18、is is a standard compilern);else if(_STDC_=0)printf(this is not a standard compilern);/exp/pre/macro.co功能:对源程序中的一部分内容只有满足功能:对源程序中的一部分内容只有满足某种条件的情况下才进行编译。某种条件的情况下才进行编译。2.条件编译条件编译#ifdef 标识符程序段1#else程序段2#endif形式形式1:当标识符已经被定义过(使用当标识符已经被定义过(使用#define),),则对程序段则对程序段1进行编译,否则编译程序段进行编译,否则编译程序段2。其中。其中#else部分可以
19、省略。部分可以省略。形式形式1(续):(续):#define IBM-PC 0 /*或#define IBM-PC */。#ifdef IBM-PC#define INT 16#else#define INT 32#endifo可以用来提高程序的可移植性可以用来提高程序的可移植性形式形式1(续):(续):#define DEBUG .#ifdef DEBUGprintf(“x=%d,y=%d”,x,y);#endifo可以用来调试程序可以用来调试程序调试结束后只需将调试结束后只需将define行删掉即可行删掉即可#ifndef 标识符程序段1#else程序段2#endif形式形式2:当标识符未
20、被定义过,则对程序段当标识符未被定义过,则对程序段1进行编译,进行编译,否则编译程序段否则编译程序段2。(与形式。(与形式1正相反)正相反)#if 表达式程序段1#else程序段2#endif形式形式3:当表达式为真时,则对程序段当表达式为真时,则对程序段1进行编译,否进行编译,否则编译程序段则编译程序段2。#include#define CAP 1int main()char string20=I love China;char c;int i=0;c=stringi+;while(c!=0)#if CAPif(c=a&c=z)c-=32;#endifprintf(%c,c);c=strin
21、gi+;printf(n);return 0;形式形式3:(续):(续)o3.文件包含文件包含n功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n一般形式:一般形式:#include “文件名文件名”或或#include 直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径o3.文件包含文件包含n功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n一般形式:一般形式:#include “filename”或或#include n处理过程:预处理时,用被包含文件的内容取代该处理过程:
22、预处理时,用被包含文件的内容取代该预处理命令,再把预处理命令,再把“包含包含”后的文件作为一个源文后的文件作为一个源文件编译件编译n被包含文件内容被包含文件内容o源文件源文件(*.c)o头文件头文件(*.h)宏定义数据结构定义函数说明等n实际上文件名也可以是实际上文件名也可以是C源文件,不过这不是良好的源文件,不过这不是良好的编程风格编程风格o【例【例3-5】文件包含一下程序包含一个完整的模文件包含一下程序包含一个完整的模块(块(function.c、function.h、test.c)/*funtion.h*/#ifndef _FUNCTION#define _FUNCTIONvoid f(
23、);#endif/*function.c*/#include void f()printf(a example of#include.n);/*test.c*/#include#include function.hint main()f();return 0;头文件格式4.其他预处理指令其他预处理指令o#error指令强制编译器停止编译,主要用指令强制编译器停止编译,主要用于程序调试。于程序调试。o#error指令的一般形式为:指令的一般形式为:编译到编译到#error时,会显示相应字符串时,会显示相应字符串#error error-message#error举例举例#define CON10
24、#define CON21#define CON3-1int main()#ifCON1#ifCON2#error run to position1#else#error run to position2#endif#else#ifCON3#error run to position3#else#error run to position4#endif#endif明确程序编译位置三三、位运算、位运算位运算符按位与&取反按位或|左移1.位与位与&o运算规则:运算规则:n两个位都为两个位都为1,结果为,结果为1,否则为,否则为0o例如:例如:n9&0 x0c结果为结果为82.位或位或|o运算规则:
25、运算规则:n两个位都为两个位都为0,结果为,结果为0,否则为,否则为1o例如:例如:n9|0 x0c结果为结果为0 x0d3.按位取反按位取反o运算规则:运算规则:n1变变0,0变变1o用途:用途:n使某位取反使某位取反3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0int a;a=a&0 xfffffffe3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0思考:有没有思考:有没有隐含的问题隐含的问题int a;a=a&0 xfffffffe3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0/*16位机位机 */int a;a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 程序设计
限制150内