嵌入式系统程序设计课件.ppt

上传人(卖家):三亚风情 文档编号:3194689 上传时间:2022-08-01 格式:PPT 页数:282 大小:2.29MB
下载 相关 举报
嵌入式系统程序设计课件.ppt_第1页
第1页 / 共282页
嵌入式系统程序设计课件.ppt_第2页
第2页 / 共282页
嵌入式系统程序设计课件.ppt_第3页
第3页 / 共282页
嵌入式系统程序设计课件.ppt_第4页
第4页 / 共282页
嵌入式系统程序设计课件.ppt_第5页
第5页 / 共282页
点击查看更多>>
资源描述

1、嵌入式系统程序设计嵌入式系统程序设计大连理工大学软件学院大连理工大学软件学院嵌入式系统工程系嵌入式系统工程系赖晓晨赖晓晨C/C+语言摘要语言摘要o C语言的历史和特点语言的历史和特点o 预处理程序预处理程序o 位运算位运算o 函数指针函数指针o C程序的移植程序的移植一一、C语言的历史和特点语言的历史和特点o C语言的历史语言的历史o C语言的特点语言的特点C语言的优良特性语言的优良特性n 结构化语言,代码数据分离结构化语言,代码数据分离n 包含指针特性,允许对地址操作包含指针特性,允许对地址操作n 语法简洁紧凑,但功能强大语法简洁紧凑,但功能强大n 编程方便,运行速度快编程方便,运行速度快n

2、 支持分离编译支持分离编译C语言的缺点语言的缺点n 封装性不如封装性不如C+,数据安全性上有缺陷,数据安全性上有缺陷n 类型检查机制相对薄弱类型检查机制相对薄弱n 指针的操作带来许多不安全因素指针的操作带来许多不安全因素n 比其他高级语言较难掌握比其他高级语言较难掌握二二、预处理程序、预处理程序o C89规定的预处理指令有以下几条规定的预处理指令有以下几条n#ifn#ifdefn#ifndefn#elsen#elifn#endifn#definen#undefn#linen#errorn#pragman#include预处理预处理语句的书写规则语句的书写规则o 作用:作用:对源程序编译之前做一

3、些处理对源程序编译之前做一些处理,生成扩展生成扩展C源程序源程序o 格式:格式:n“#”开头开头n 占单独书写行占单独书写行n 语句尾不加分号语句尾不加分号o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)如#define YES 1#define NO 0

4、#define PI 3.1415926#define OUT printf(“Hello,World”);o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)宏体可缺省,表示宏名定义过如#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体

5、o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o 作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可可终止宏名作用域终止宏名作用域 格式:格式:#undef 宏名宏名o 1.宏定义宏定义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”);o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识

7、符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o 定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o 作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可可终止宏名作用域终止宏名作用域 格式:格式:#undef 宏名宏名o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替

8、换宏名-不作语法检查不作语法检查o 定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o 作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可可终止宏名作用域终止宏名作用域 格式:格式:#undef 宏名宏名o 引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换例#define ID 1 语句printf(ID);会输出ID,而非1o 1.宏定义宏定义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;o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般

10、形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o 定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o 作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可可终止宏名作用域终止宏名作用域 格式:格式:#undef 宏名宏名o 宏定义可嵌套,不能递归宏定义可嵌套,不能递归o 引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换o 宏定义中使用必要的括号宏定义中使用必要的括号()()例#define

11、 DIS1 10#define DIS2 (DIS1+10)var=DIS2*2;宏展开:var=(10+10)*2;o 1.宏定义宏定义n 不带参数宏定义不带参数宏定义o 一般形式:一般形式:#define 宏名宏名 宏体宏体o 功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o 宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o 定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o 作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可可终止宏名作用域终止宏名作用域 格式:格式:#undef

12、宏名宏名o 宏定义可嵌套,不能递归宏定义可嵌套,不能递归o 引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换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

13、 A0输出仍旧为:输出仍旧为:“A has been defined”。n 带参数宏定义带参数宏定义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 宏展开:宏展开:形参用实参换,其它字符保留形参用实参换,其它字

14、符保留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)(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

15、 func(int x,int y)return(xy?x:y);main()int a,b,c,d,t;.t=func(a+b,c+d);例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能o 带参的宏与函数区别带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间Embest开发环境中的宏定义开发环境中的宏定义o 44b.h有有44B0X中各个特殊功能寄存器的中各个特殊功能寄存器的宏定义宏定义#define rBWSCON(*(vol

16、atile unsigned*)0 x1c80000)#define rBANKCON0(*(volatile 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(*(vol

17、atile unsigned*)0 x1c80018)预定义宏预定义宏o C89规范了五个固有的预定义宏,分别为:规范了五个固有的预定义宏,分别为: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,

18、_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 功能:对源程序中的一部分内容只有满足功能:对源程序中的一部分内容只有满足某种条件的情况下才进行编译。某种条件的情况下才进行编译。2.条件编译条件编译#ifdef 标识符程序段1#else程序段2#endif形式形式1:当标识符已经被定义过(使用当标识符已经被定义过(使用#

19、define),),则对程序段则对程序段1进行编译,否则编译程序段进行编译,否则编译程序段2。其中。其中#else部分可以省略。部分可以省略。形式形式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 可以用来调试程序可以用来调试程序调试结束后只需将调试

20、结束后只需将define行删掉即可行删掉即可#ifndef 标识符程序段1#else程序段2#endif形式形式2:当标识符未被定义过,则对程序段当标识符未被定义过,则对程序段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

21、+;while(c!=0)#if CAPif(c=a&c=z)c-=32;#endifprintf(%c,c);c=stringi+;printf(n);return 0;形式形式3:(续):(续)o 3.文件包含文件包含n 功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n 一般形式:一般形式:#include “文件名文件名”或或#include 直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径o 3.文件包含文件包含n 功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n

22、 一般形式:一般形式:#include “filename”或或#include n 处理过程:预处理时,用被包含文件的内容取代该处理过程:预处理时,用被包含文件的内容取代该预处理命令,再把预处理命令,再把“包含包含”后的文件作为一个源文后的文件作为一个源文件编译件编译n 被包含文件内容被包含文件内容o 源文件源文件(*.c)o 头文件头文件(*.h)宏定义数据结构定义函数说明等n 实际上文件名也可以是实际上文件名也可以是C源文件,不过这不是良好的源文件,不过这不是良好的编程风格编程风格o【例【例3-5】文件包含文件包含一下程序包含一个完整的一下程序包含一个完整的模块(模块(function.

23、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.hint main()f();return 0;头文件格式4.其他预处理指令其他预处理指令o#error指令强制编译器停止编译,主要用指令强制编译器停止编译,主要用于程序调试。于程序调试。o#error指令的一般形式为:指令的一般形式为:编

24、译到编译到#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#else#ifCON3#error run to position3#else#error run to position4#endif#endif明确程序编译位置三三、位运算、位运算位运算符位运算符按位与按位与&取反取反按位或按位或

25、|左移左移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 用途:用途:n使某位取反使某位取反3.按位取反按位取反(续)(续)o 例:使某数最低位为例:使某数最低位为0int a;a=a&0 xfffffffe3.按位取反按位取反(续)(续)o 例:使某数最低位为例:使某数最低位为0思考:

26、有没有思考:有没有隐含的问题隐含的问题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能自动适应能自动适应16位机以及位机以及32位机位机 */解决办法解决办法4.按位异或按位异或o 运算规则:运算规则:n判断两位是否相同,同则为判断两位是否相同,同则为0,否则为,否则为1o 用途:用途:n使特定位翻转使特

27、定位翻转 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将一个数的全部二进制位右移若干位,移出位将一个数的全部二进制位右移若干位,移出位舍弃,左侧可能补舍弃,左侧可能补0或者补或者补1,视计算机系统,视计算机系统不同而不同。不同而不同。o 符号问题:符号问题:n无符号数右

28、移,左侧补无符号数右移,左侧补0n有符号数视计算机系统而定:逻辑右移、算术有符号数视计算机系统而定:逻辑右移、算术右移右移例:循环右移例:循环右移n位位10011111110010101001111111001010N位位例:循环右移例:循环右移n位(续)位(续)#include int main()unsigned a,b,c,n;scanf(a=%x,n=%d,&a,&n);b=an;c=c|b;printf(a=%x,c=%xn,a,c);return 0;输入输入:a=0 x12345678,n=8显示:显示:a=12345678,c=78123456四四、函数指针、函数指针 每一个函

29、数模块都有一个首地址,称为函数每一个函数模块都有一个首地址,称为函数的入口地址。的入口地址。指向函数的指针称为函数指针,保存的是函指向函数的指针称为函数指针,保存的是函数的入口地址(首地址)数的入口地址(首地址)函数调用:找到函数入口地址;传递参数函数调用:找到函数入口地址;传递参数 1.函数指针的定义方法函数指针的定义方法o 格式:格式:int (*ptr1)(int);n定义了函数指针ptr1,此指针只能保存具有一个整型参数的整型函数的首地址。o 注意注意:nint *ptr1(int);n这是一条函数声明语句,表示一个带有整数参这是一条函数声明语句,表示一个带有整数参数的函数返回,返回一

30、个整型指针。数的函数返回,返回一个整型指针。nint (*ptr1)(int);这个是函数指针这个是函数指针例:o 以0.1为步长,计算特定范围内的三角函数之和。sin(0.1)+sin(0.2)+sin(1.0)cos(0.5)+cos(0.6)+cos(3.0)#include#include double triangle(double(*func)(double),double begin,double end)double step,sum=0.0;for(step=begin;stepend;step+=0.1)sum+=func(step);return sum;int main

31、()double result;result=triangle(sin,0.1,1.0);printf(the sum of sin from 0.1 to 1.0 is%fn,result);result=triangle(cos,0.5,3.0);printf(the sum of cos from 0.5 to 3.0 is%fn,result);return 0;#include#include double triangle(double(*func)(double),double begin,double end)double step,sum=0.0;for(step=begin

32、;stepend;step+=0.1)sum+=func(step);return sum;int main()double result;result=triangle(sin,0.1,1.0);printf(the sum of sin from 0.1 to 1.0 is%fn,result);result=triangle(cos,0.5,3.0);printf(the sum of cos from 0.5 to 3.0 is%fn,result);return 0;2.用用typedef来简化函数指针来简化函数指针o 对参数较多的函数类型,定义相应的函数指针比较烦琐,可用typed

33、ef关键字简化o 例如ntypedef double(*FUN)(double a,double b);用用typedef来简化函数指针来简化函数指针(续)(续)o 格式:格式:int (*ptr1)(int);o 定义函数指针的别名方法定义函数指针的别名方法:o 定义了函数指针ptr1,此指针只能保存具有一个整型参数的整型函数的首地址。double (*fun1)(double a,double b);typedef double(*FUN)(double a,double b);FUN f1;FUN f2;用用typedef来简化函数指针来简化函数指针(续)(续)o 格式:格式:int (

34、*ptr1)(int);o 定义函数指针的别名方法定义函数指针的别名方法:(也可以这样):(也可以这样)o 定义了函数指针ptr1,此指针只能保存具有一个整型参数的整型函数的首地址。double (*fun1)(double a,double b);typedef double(FUN)(double a,double b);FUN*f1;FUN*f2;3函数指针数组函数指针数组o 声明方式声明方式o 定义了定义了表示定义了一个长度为表示定义了一个长度为4的函数指针的函数指针数组,同时做了初始化。数组,同时做了初始化。double (*fp4)(double,double)=f1,f2,f3,

35、f4 4函数指针函数指针应用应用o 在嵌入式操作系统中,经常用函数指针来在嵌入式操作系统中,经常用函数指针来完成任务的调度。完成任务的调度。o 例如例如uC/OS中,任务创建的函数原型为中,任务创建的函数原型为o 第一个参数为函数指针第一个参数为函数指针INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio);五五、C程序的移植程序的移植o 为一种机器写的程序,经常需要在其他硬件、为一种机器写的程序,经常需要在其他硬件、操作系统的平台上运行,往往需要对此程序操作系统的平台上运行,往往需要对此程序进行一些

36、改动,这个过程叫做程序的移植进行一些改动,这个过程叫做程序的移植o 方便移植的程序称为可移植程序方便移植的程序称为可移植程序o 程序不可移植,主要是因为有太多硬件相关程序不可移植,主要是因为有太多硬件相关的代码的代码1、避免使用、避免使用“魔数魔数”o“魔数魔数”(magic number):依赖于系):依赖于系统或处理器的数字。例如表示硬盘缓冲区的统或处理器的数字。例如表示硬盘缓冲区的大小、屏幕和键盘的特定尺寸等数字。大小、屏幕和键盘的特定尺寸等数字。o“魔数魔数”的出现使系统可移植性变差。下列的出现使系统可移植性变差。下列代码本质上是不可移植的代码本质上是不可移植的fread(buf,25

37、6,1,fp);/缓冲区为缓冲区为256B使用使用#define替换替换“魔数魔数”o 程序中要尽量避免程序中要尽量避免“魔数魔数”的硬编码,可以的硬编码,可以用宏来取代魔数,使可读性增强,而且移植用宏来取代魔数,使可读性增强,而且移植程序时只要修改宏一处即可程序时只要修改宏一处即可#define BUFFER_SIZE 256fread(buf,BUFFER_SIZE,1,fp);例例o 一个图形处理程序中,需要不同的颜色执行一个图形处理程序中,需要不同的颜色执行不同操作不同操作例例/*恶劣的例子恶劣的例子*/void ShowColor(int color)if(color=0)sub_r

38、ed();else if(color=1)sub_blue();else if(color=2)sub_green();return;例(改进后的程序)例(改进后的程序)/*然后在源文件中直接使用这些宏来判断然后在源文件中直接使用这些宏来判断*/#include color.hvoid ShowColor(int color)if(color=RED)sub_red();else if(color=BLUE)sub_blue();else if(color=GREEN)sub_green();return;/*color.h*/#define RED 0#define BLUE 1#defin

39、e GREEN 22、程序分层程序分层o 不同的操作系统为应用程序提供了不同的支不同的操作系统为应用程序提供了不同的支持,例如持,例如windows2000应用程序可以有应用程序可以有多线程特性,但是多线程特性,但是windows3.2不可以,不可以,应用程序对系统有依赖型。应用程序对系统有依赖型。o 这种依赖性没有具体通用的解决方法,但是这种依赖性没有具体通用的解决方法,但是可以通过程序分层来解决,把系统相关的代可以通过程序分层来解决,把系统相关的代码放到一起。码放到一起。3、注意数据类型的长度注意数据类型的长度o 16位机中整型数据是位机中整型数据是2字节,字节,32位机为位机为4字节,这

40、会导致程序的不兼容。字节,这会导致程序的不兼容。n 可以利用宏来重定义数据类型可以利用宏来重定义数据类型#define int16 int/16位机位机int16 a;#define int16 short int/32位机位机int16 a;注意数据类型的长度注意数据类型的长度(续)(续)o 16位机中整型数据是位机中整型数据是2字节,字节,32位机为位机为4字节,这会导致程序的不兼容。字节,这会导致程序的不兼容。n 使用可适应任何情况的编码方式,例如把一个使用可适应任何情况的编码方式,例如把一个整型数据写入磁盘:整型数据写入磁盘:fwrite(&i,4,1,fp);/不好不好fwrite(

41、&i,sizeof(int),1,fp);/好好4、对齐问题对齐问题o 某些计算机允许数据边界地址不对齐,把这某些计算机允许数据边界地址不对齐,把这样的代码移植到样的代码移植到ARM上时要小心。上时要小心。o ARMv5TE前的处理器都不支持地址不对前的处理器都不支持地址不对齐的指针齐的指针5、大小端问题大小端问题o 如果两台计算机的大小端定义不一致,那么如果两台计算机的大小端定义不一致,那么代码移植时要做转换代码移植时要做转换6、枚举类型枚举类型o enum是可移植的,但是不同编译器中对是可移植的,但是不同编译器中对enum分配的字节数可能不同。分配的字节数可能不同。o 不能在不同的编译器之

42、间对代码进行交叉连不能在不同的编译器之间对代码进行交叉连接接7、减少内嵌汇编减少内嵌汇编o C语言的内嵌汇编由语言的内嵌汇编由C编译器来负责编译,编译器来负责编译,而不使用而不使用armasm或或gas。内嵌汇编可以。内嵌汇编可以提高编程效率,但是会影响到程序的可移植提高编程效率,但是会影响到程序的可移植性。性。C语言与语言与C+语言的区别语言的区别o 变量定义位置变量定义位置o 结构体变量结构体变量o 数据类型数据类型o 输入输出输入输出o 动态内存分配动态内存分配o 其他区别其他区别1.变量变量定义位置定义位置o C89要求所有变量都必须定义在块的最前部要求所有变量都必须定义在块的最前部o

43、 C+没有这个要求,可以在程序任意位置没有这个要求,可以在程序任意位置定义新的变量定义新的变量2.结构体结构体变量变量o 在在C+中,中,struct结构体支持成员函数的结构体支持成员函数的定义,定义,C中不行中不行。o 如果在如果在C的的struct中定义函数,编译时会显中定义函数,编译时会显示一个示一个“field function name declared as function”错误错误2.结构体结构体变量(续)变量(续)/*ch3_10.c*/struct Aint a;int b();int main()struct A c;c.a=2;return 0;编译错误:编译错误:“c

44、h3_10.c:5:error:field b declared as a function”C+标准可以通过编译标准可以通过编译2.结构体结构体变量(续)变量(续)o 在在C语言中,声明一个结构体类型语言中,声明一个结构体类型A之后,之后,使用下面的语句来定义结构体变量使用下面的语句来定义结构体变量a:n struct A a;o 而而C+语言中可以省略语言中可以省略struct3.数据类型数据类型o C+中有中有bool(或或boolean类型);类型);o C中没有这样的中没有这样的bool类型,均为数值类型!类型,均为数值类型!o C编译器不能通过编译,编译器不能通过编译,C+编译器可

45、以编译器可以bool a;a=1;4.输入输出输入输出 o C中使用中使用printf、scanf输入输出输入输出o 使用时不用包含任何头文件使用时不用包含任何头文件o 但如果使用但如果使用g+编译时必须加上编译时必须加上stdio.h头文件头文件int a;scanf(%d,&a);printf(您输入的数值是您输入的数值是%dn,a);A.scanf()函数函数o 功能:功能:n 从键盘读入指定格式的数据从键盘读入指定格式的数据o 格式:格式:n scanf(控制字符串控制字符串,输入项列表输入项列表);o 注意:注意:n scanf中各变量一定是表示地址的标识符中各变量一定是表示地址的标

46、识符(加加&)控制字符串控制字符串o 控制字符串有两部分组成:控制字符串有两部分组成:n 格式说明格式说明o 形式:形式:n%n 普通字符普通字符o 空格空格o 可打印字符可打印字符格式说明格式说明o 各格式字符及其意义:(详见各格式字符及其意义:(详见C教程)教程)nd:输入一个十进制整数:输入一个十进制整数no:输入一个八进制整数:输入一个八进制整数nx:输入一个十六进制整数:输入一个十六进制整数nf:输入一个小数形式的浮点数:输入一个小数形式的浮点数ne:输入一个指数形式的浮点数:输入一个指数形式的浮点数nc:输入一个字符:输入一个字符ns:输入一个字符串:输入一个字符串空格空格o 在多

47、个输入时,一般用空格或回车作为分隔在多个输入时,一般用空格或回车作为分隔符符o 若以空格作为分隔符,当输入中包含字符类若以空格作为分隔符,当输入中包含字符类型时,可能产生非预期的结果型时,可能产生非预期的结果scanf(%d%c,&a,&ch);输入:输入:45 q输出:输出:45 空格空格空格(续)空格(续)o 如下语句会有正确输出如下语句会有正确输出o 此处此处%d后的空格,就可以跳过字符后的空格,就可以跳过字符q前前的所有空格的所有空格scanf(%d%c,&a,&ch);输入:输入:45 q输出:输出:45 q可打印字符可打印字符o 看一个例子看一个例子o 输入为:输入为:1,2,qo

48、 可以得到可以得到 a=1,b=2,ch=qo 输入为:输入为:1 2 qo 除除a的值为的值为1外,外,对对b与与ch的赋值失败的赋值失败scanf(%d,%d,%c,&a,&b,&ch);B.printf()函数函数o 功能:功能:n 从缺省输出设备(一般为显示器)输出规定格从缺省输出设备(一般为显示器)输出规定格式的字符串式的字符串o 格式:格式:n printf(控制字符串控制字符串,输入项列表输入项列表);控制字符串控制字符串o 控制字符串有两部分组成:控制字符串有两部分组成:n 格式说明格式说明o 形式:形式:n%n 普通字符普通字符o 空格空格o 可打印字符可打印字符格式说明格式

49、说明o 各格式字符及其意义:(详见各格式字符及其意义:(详见C教程)教程)nc:按字符型输出:按字符型输出no:按八进制输出:按八进制输出nd:按十进制输出:按十进制输出nx:按十六进制输出:按十六进制输出nu:按无符号整数输出:按无符号整数输出nf:按浮点型小数输出:按浮点型小数输出ng:按:按e和和f格式中较短的一种输出格式中较短的一种输出ne:按科学计数法输出:按科学计数法输出普通字符普通字符o 普通字符:普通字符:n 可打印字符可打印字符o 主要是说明字符,按原样输出,支持汉字输出主要是说明字符,按原样输出,支持汉字输出n 转义字符(例)转义字符(例)o 不能直接打印,控制产生特殊的输

50、出效果不能直接打印,控制产生特殊的输出效果普通字符(续)普通字符(续)o 转义字符示例转义字符示例i=789,n=123,a=92.34567,且,且i为整型,为整型,n为长整型。为长整型。printf(%4dt%7.4fnt%lun,i,a,n);输出为:输出为:78992.3457 123C语言输入输出总结语言输入输出总结o 输入输出可能是输入输出可能是C和和C+的最明显的区别的最明显的区别n C中用中用scanf(),printf()来完成输入输出操作来完成输入输出操作n C+中全局对象中全局对象cin、cout来输入输出,比来输入输出,比C更方便,而且类型检查机制更加完善更方便,而且类

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(嵌入式系统程序设计课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|