最新嵌入式系统程序设计PPT课件.ppt
《最新嵌入式系统程序设计PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式系统程序设计PPT课件.ppt(283页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式系统程序设计嵌入式系统程序设计C/C+语言摘要语言摘要oC语言的历史和特点语言的历史和特点o预处理程序预处理程序o位运算位运算o函数指针函数指针oC程序的移植程序的移植o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)如#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#def
2、ine 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)宏体可缺省,表示宏名定义过如#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束
3、o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名例#define ID 1 main()#undef ID#define ID 0 max()YES原作用域YES新作用域如 if(
4、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功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令
5、到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o引号中的内
6、容与宏名相同不置换引号中的内容与宏名相同不置换例#define ID 1 语句printf(ID);会输出ID,而非1o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定
7、义可嵌套,不能递归宏定义可嵌套,不能递归例#define ID ID+1 ()o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换例#define DIS1 10#define DIS2 DIS1+10 var=DIS2*2;宏展开:var=10+10*2;o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面
8、)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定义可嵌套,不能递归宏定义可嵌套,不能递归o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换o宏定义中使用必要的括号宏定义中使用必要的括号()()例#define DIS1 10#define DIS2 (DIS1+10)var=DIS2*2;宏展开:var=(10+10)*2;o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替
9、字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o宏定义可嵌套,不能递归宏定义可嵌套,不能递归o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换o宏定义中使用必要的括号宏定义中使用必要的括号()()o宏体可以省略,表示宏名已被定义过宏体可以省略,表示宏名已被定义过/*ch3_1.c*/#include#define Aint ma
10、in()#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带参数宏定义带参数宏定义o一般形式:一般形式:#define 宏名宏名(参数表参数表)宏体宏体例#define T (m,n)m*n相当于定义了不带参宏T,其宏体为“(m,n)m*n”o宏展开:形参用实参换,其它字符保留宏展开:形参
11、用实参换,其它字符保留例#define T(m,n)m*n .area=T(3,2);宏展开:area=3*2;不能加空格n带参数宏定义带参数宏定义o一般形式:一般形式:#define 宏名宏名(参数表参数表)宏体宏体o宏展开:形参用实参换,其它字符保留宏展开:形参用实参换,其它字符保留o宏体及各形参外一般应加括号宏体及各形参外一般应加括号()()例#define T(m,n)m*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)
12、(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;.t=func(a+b,c+d);例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能o带参的宏与函数区别带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间
13、编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间Embest开发环境中的宏定义开发环境中的宏定义o44b.h有有44B0X中各个特殊功能寄存器的中各个特殊功能寄存器的宏定义宏定义#define rBWSCON(*(volatile unsigned*)0 x1c80000)#define rBANKCON0(*(volatile unsigned*)0 x1c80004)#define rBANKCON1(*(volatile unsigned*)0 x1c80008)#define rBANKCON2(*(volatile unsign
14、ed*)0 x1c8000c)#define rBANKCON3(*(volatile unsigned*)0 x1c80010)#define rBANKCON4(*(volatile unsigned*)0 x1c80014)#define rBANKCON5(*(volatile unsigned*)0 x1c80018)预定义宏预定义宏oC89规范了五个固有的预定义宏,分别为:规范了五个固有的预定义宏,分别为:n_LINE_:行号:行号n_FILE_:文件名:文件名n_DATE_:日期:日期n_TIME_:时间:时间n_STDC_:1标准标准C编译器编译器 0非标准非标准C编译器编译器
15、预定义宏预定义宏#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(this is a standard compilern);else if(_STDC_=0)printf(this is not a standard compilern);/exp/pre/macro.co功能:对源
16、程序中的一部分内容只有满足功能:对源程序中的一部分内容只有满足某种条件的情况下才进行编译。某种条件的情况下才进行编译。2.条件编译条件编译#ifdef 标识符程序段1#else程序段2#endif形式形式1:当标识符已经被定义过(使用当标识符已经被定义过(使用#define),),则对程序段则对程序段1进行编译,否则编译程序段进行编译,否则编译程序段2。其中。其中#else部分可以省略。部分可以省略。形式形式1(续):(续):#define IBM-PC 0 /*或#define IBM-PC */。#ifdef IBM-PC#define INT 16#else#define INT 32#
17、endifo可以用来提高程序的可移植性可以用来提高程序的可移植性形式形式1(续):(续):#define DEBUG .#ifdef DEBUGprintf(“x=%d,y=%d”,x,y);#endifo可以用来调试程序可以用来调试程序调试结束后只需将调试结束后只需将define行删掉即可行删掉即可#ifndef 标识符程序段1#else程序段2#endif形式形式2:当标识符未被定义过,则对程序段当标识符未被定义过,则对程序段1进行编译,进行编译,否则编译程序段否则编译程序段2。(与形式。(与形式1正相反)正相反)#if 表达式程序段1#else程序段2#endif形式形式3:当表达式为真
18、时,则对程序段当表达式为真时,则对程序段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=stringi+;printf(n);return 0;形式形式3:(续):(续)o3.文件包含文件包含n功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n一般形式:一般形式
19、:#include “文件名文件名”或或#include 直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径o3.文件包含文件包含n功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n一般形式:一般形式:#include “filename”或或#include n处理过程:预处理时,用被包含文件的内容取代该处理过程:预处理时,用被包含文件的内容取代该预处理命令,再把预处理命令,再把“包含包含”后的文件作为一个源文后的文件作为一个源文件编译件编译n被包含文件内容被包含文件内容o源文件源文件(*.c)o头文件头文件(*.h)宏定义数
20、据结构定义函数说明等n实际上文件名也可以是实际上文件名也可以是C源文件,不过这不是良好的源文件,不过这不是良好的编程风格编程风格o【例【例3-5】文件包含一下程序包含一个完整的模文件包含一下程序包含一个完整的模块(块(function.c、function.h、test.c)/*funtion.h*/#ifndef _FUNCTION#define _FUNCTIONvoid f();#endif/*function.c*/#include void f()printf(a example of#include.n);/*test.c*/#include#include function.hi
21、nt main()f();return 0;头文件格式4.其他预处理指令其他预处理指令o#error指令强制编译器停止编译,主要用指令强制编译器停止编译,主要用于程序调试。于程序调试。o#error指令的一般形式为:指令的一般形式为:编译到编译到#error时,会显示相应字符串时,会显示相应字符串#error error-message#error举例举例#define CON10#define CON21#define CON3-1int main()#ifCON1#ifCON2#error run to position1#else#error run to position2#endif
22、#else#ifCON3#error run to position3#else#error run to position4#endif#endif明确程序编译位置三三、位运算、位运算位运算符位运算符按位与按位与&取反取反按位或按位或|左移左移1.位与位与&o运算规则:运算规则:n两个位都为两个位都为1,结果为,结果为1,否则为,否则为0o例如例如:n9&0 x0c结果为结果为82.位或位或|o运算规则:运算规则:n两个位都为两个位都为0,结果为,结果为0,否则为,否则为1o例如例如:n9|0 x0c结果为结果为0 x0d3.按位取反按位取反o运算规则:运算规则:n1变变0,0变变1o用途:
23、用途:n使某位取反使某位取反3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0int a;a=a&0 xfffffffe3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0思考:有没有思考:有没有隐含的问题隐含的问题int a;a=a&0 xfffffffe3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0/*16位机位机 */int a;a=a&0 xffffe/*32位机位机 */a=a&0 xfffffffe可移植性变可移植性变差差3.按位取反按位取反(续)(续)o例:使某数最低位为例:使某数最低位为0a=a&1/*1能自动
24、适应能自动适应16位机以及位机以及32位机位机 */解决办法解决办法4.按位异或按位异或o运算规则:运算规则:n判断两位是否相同,同则为判断两位是否相同,同则为0,否则为,否则为1o用途:用途:n使特定位翻转使特定位翻转 n交换两个值,不用临时变量交换两个值,不用临时变量4.按位异或按位异或(续)(续)不通过中间变量交换两个变量的值不通过中间变量交换两个变量的值/*ch3_7.c*/#include int main()int a=21;int b=43;a=ab;b=ba;a=ab;printf(a=%d,b=%dn,a,b);return 0;5.左移位左移位o运算规则:运算规则:n将一个
25、数的全部二进制位右移若干位,移出位将一个数的全部二进制位右移若干位,移出位舍弃,左侧可能补舍弃,左侧可能补0或者补或者补1,视计算机系统不,视计算机系统不同而不同。同而不同。o符号问题:符号问题:n无符号数右移,左侧补无符号数右移,左侧补0n有符号数视计算机系统而定:逻辑右移、算术有符号数视计算机系统而定:逻辑右移、算术右移右移例:循环右移例:循环右移n位位10011111110010101001111111001010N位位例:循环右移例:循环右移n位(续)位(续)#include int main()unsigned a,b,c,n;scanf(a=%x,n=%d,&a,&n);b=an;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 嵌入式 系统 程序设计 PPT 课件
限制150内