欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    嵌入式系统程序设计.ppt

    • 资源ID:65270285       资源大小:2.07MB        全文页数:282页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式系统程序设计.ppt

    嵌入式系统程序设计 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语法简洁紧凑,但功能强大语法简洁紧凑,但功能强大n编程方便,运行速度快编程方便,运行速度快n支持分离编译支持分离编译C语言的缺点语言的缺点n封装性不如封装性不如C+,数据安全性上有缺陷,数据安全性上有缺陷n 类型检查机制相对薄弱类型检查机制相对薄弱n 指针的操作带来许多不安全因素指针的操作带来许多不安全因素n 比其他高级语言较难掌握比其他高级语言较难掌握二、预处理程序二、预处理程序oC89规定的预处理指令有以下几条规定的预处理指令有以下几条n#ifn#ifdefn#ifndefn#elsen#elifn#endifn#definen#undefn#linen#errorn#pragman#include预处理预处理语句的书写规则语句的书写规则o作用:对源程序编译之前做一些处理,作用:对源程序编译之前做一些处理,生成扩展生成扩展C源程序源程序o格式:格式:n“#”开头开头n占单独书写行占单独书写行n语句尾不加分号语句尾不加分号o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)如#define YES 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 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束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(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作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名o引号中的内容与宏名相同不置换引号中的内容与宏名相同不置换例#define ID 1 语句printf(ID);会输出ID,而非1o1.宏定义宏定义n不带参数宏定义不带参数宏定义o一般形式:一般形式:#define 宏名宏名 宏体宏体o功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查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功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)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功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)o宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查o定义位置定义位置:任意任意(一般在函数外面一般在函数外面)o作用域作用域:从定义命令到文件结束从定义命令到文件结束o#undef可终止宏名作用域可终止宏名作用域 格式:格式:#undef 宏名宏名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 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宏展开:形参用实参换,其它字符保留宏展开:形参用实参换,其它字符保留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 func(int x,int y)return(xy?x:y);main()int a,b,c,d,t;.t=func(a+b,c+d);例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能o带参的宏与函数区别带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间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 unsigned*)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编译器编译器预定义宏预定义宏#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功能:对源程序中的一部分内容只有满足功能:对源程序中的一部分内容只有满足某种条件的情况下才进行编译。某种条件的情况下才进行编译。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#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:当表达式为真时,则对程序段当表达式为真时,则对程序段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一般形式:一般形式:#include “文件名文件名”或或#include 直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径o3.文件包含文件包含n功能:一个源文件可将另一个源文件的内容全部包功能:一个源文件可将另一个源文件的内容全部包含进来含进来n一般形式:一般形式:#include “filename”或或#include n处理过程:预处理时,用被包含文件的内容取代该处理过程:预处理时,用被包含文件的内容取代该预处理命令,再把预处理命令,再把“包含包含”后的文件作为一个源文后的文件作为一个源文件编译件编译n被包含文件内容被包含文件内容o源文件源文件(*.c)o头文件头文件(*.h)宏定义数据结构定义函数说明等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.hint 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#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用途:用途: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能自动适应能自动适应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将一个数的全部二进制位右移若干位,移出位将一个数的全部二进制位右移若干位,移出位舍弃,左侧可能补舍弃,左侧可能补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;c=c|b;printf(a=%x,c=%xn,a,c);return 0;输入输入:a=0 x12345678,n=8显示:显示:a=12345678,c=78123456四四、函数指针、函数指针 每一个函数模块都有一个首地址,称为函数每一个函数模块都有一个首地址,称为函数的入口地址。的入口地址。指向函数的指针称为函数指针,保存的是函指向函数的指针称为函数指针,保存的是函数的入口地址(首地址)数的入口地址(首地址)函数调用:找到函数入口地址;传递参数函数调用:找到函数入口地址;传递参数 1.函数指针的定义方法函数指针的定义方法o格式:格式:int (*ptr1)(int);n定义了函数指针ptr1,此指针只能保存具有一个整型参数的整型函数的首地址。o注意注意:nint *ptr1(int);n这是一条函数声明语句,表示一个带有整数参这是一条函数声明语句,表示一个带有整数参数的函数返回,返回一个整型指针。数的函数返回,返回一个整型指针。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()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;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对参数较多的函数类型,定义相应的函数指针比较烦琐,可用typedef关键字简化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 (*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,f4 4函数指针应用函数指针应用o在嵌入式操作系统中,经常用函数指针来在嵌入式操作系统中,经常用函数指针来完成任务的调度。完成任务的调度。o例如例如uC/OS中,任务创建的函数原型为中,任务创建的函数原型为o第一个参数为函数指针第一个参数为函数指针INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio);五、五、C程序的移植程序的移植o为一种机器写的程序,经常需要在其他硬件、为一种机器写的程序,经常需要在其他硬件、操作系统的平台上运行,往往需要对此程序操作系统的平台上运行,往往需要对此程序进行一些改动,这个过程叫做程序的移植进行一些改动,这个过程叫做程序的移植o方便移植的程序称为可移植程序方便移植的程序称为可移植程序o程序不可移植,主要是因为有太多硬件相关程序不可移植,主要是因为有太多硬件相关的代码的代码1、避免使用、避免使用“魔数魔数”o“魔数魔数”(magic number):依赖于系):依赖于系统或处理器的数字。例如表示硬盘缓冲区的统或处理器的数字。例如表示硬盘缓冲区的大小、屏幕和键盘的特定尺寸等数字。大小、屏幕和键盘的特定尺寸等数字。o“魔数魔数”的出现使系统可移植性变差。下列的出现使系统可移植性变差。下列代码本质上是不可移植的代码本质上是不可移植的fread(buf,256,1,fp);/缓冲区为缓冲区为256B使用使用#define替换替换“魔数魔数”o程序中要尽量避免程序中要尽量避免“魔数魔数”的硬编码,可以的硬编码,可以用宏来取代魔数,使可读性增强,而且移植用宏来取代魔数,使可读性增强,而且移植程序时只要修改宏一处即可程序时只要修改宏一处即可#define BUFFER_SIZE 256fread(buf,BUFFER_SIZE,1,fp);例例o一个图形处理程序中,需要不同的颜色执行一个图形处理程序中,需要不同的颜色执行不同操作不同操作例例/*恶劣的例子恶劣的例子*/void ShowColor(int color)if(color=0)sub_red();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#define GREEN 22、程序分层、程序分层o不同的操作系统为应用程序提供了不同的支不同的操作系统为应用程序提供了不同的支持,例如持,例如windows2000应用程序可以有应用程序可以有多线程特性,但是多线程特性,但是windows3.2不可以,不可以,应用程序对系统有依赖型。应用程序对系统有依赖型。o这种依赖性没有具体通用的解决方法,但是这种依赖性没有具体通用的解决方法,但是可以通过程序分层来解决,把系统相关的代可以通过程序分层来解决,把系统相关的代码放到一起。码放到一起。3、注意数据类型的长度、注意数据类型的长度o16位机中整型数据是位机中整型数据是2字节,字节,32位机为位机为4字字节,这会导致程序的不兼容。节,这会导致程序的不兼容。n可以利用宏来重定义数据类型可以利用宏来重定义数据类型#define int16 int/16位机位机int16 a;#define int16 short int/32位机位机int16 a;注意数据类型的长度(续)注意数据类型的长度(续)o16位机中整型数据是位机中整型数据是2字节,字节,32位机为位机为4字字节,这会导致程序的不兼容。节,这会导致程序的不兼容。n使用可适应任何情况的编码方式,例如把一个使用可适应任何情况的编码方式,例如把一个整型数据写入磁盘:整型数据写入磁盘:fwrite(&i,4,1,fp);/不好不好fwrite(&i,sizeof(int),1,fp);/好好4、对齐问题、对齐问题o某些计算机允许数据边界地址不对齐,把这某些计算机允许数据边界地址不对齐,把这样的代码移植到样的代码移植到ARM上时要小心。上时要小心。oARMv5TE前的处理器都不支持地址不对齐前的处理器都不支持地址不对齐的指针的指针5、大小端问题、大小端问题o如果两台计算机的大小端定义不一致,那么如果两台计算机的大小端定义不一致,那么代码移植时要做转换代码移植时要做转换6、枚举类型、枚举类型oenum是可移植的,但是不同编译器中对是可移植的,但是不同编译器中对enum分配的字节数可能不同。分配的字节数可能不同。o不能在不同的编译器之间对代码进行交叉连不能在不同的编译器之间对代码进行交叉连接接7、减少内嵌汇编、减少内嵌汇编oC语言的内嵌汇编由语言的内嵌汇编由C编译器来负责编译,编译器来负责编译,而不使用而不使用armasm或或gas。内嵌汇编可以。内嵌汇编可以提高编程效率,但是会影响到程序的可移植提高编程效率,但是会影响到程序的可移植性。性。C语言与语言与C+语言的区别语言的区别o变量定义位置变量定义位置o结构体变量结构体变量o数据类型数据类型o输入输出输入输出o动态内存分配动态内存分配o其他区别其他区别1.变量定义位置变量定义位置oC89要求所有变量都必须定义在块的最前部要求所有变量都必须定义在块的最前部oC+没有这个要求,可以在程序任意位置没有这个要求,可以在程序任意位置定义新的变量定义新的变量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;编译错误:编译错误:“ch3_10.c:5:error:field b declared as a function”C+标准可以通过编译标准可以通过编译2.结构体变量(续)结构体变量(续)o在在C语言中,声明一个结构体类型语言中,声明一个结构体类型A之后,之后,使用下面的语句来定义结构体变量使用下面的语句来定义结构体变量a:nstruct A a;o而而C+语言中可以省略语言中可以省略struct3.数据类型数据类型oC+中有中有bool(或或boolean类型);类型);oC中没有这样的中没有这样的bool类型,均为数值类型!类型,均为数值类型!oC编译器不能通过编译,编译器不能通过编译,C+编译器可以编译器可以bool a;a=1;4.输入输出输入输出 oC中使用中使用printf、scanf输入输出输入输出o使用时不用包含任何头文件使用时不用包含任何头文件o但如果使用但如果使用g+编译时必须加上编译时必须加上stdio.h头文件头文件int a;scanf(%d,&a);printf(您输入的数值是您输入的数值是%dn,a);A.scanf()函数函数o功能:功能:n从键盘读入指定格式的数据从键盘读入指定格式的数据o格式:格式:nscanf(控制字符串控制字符串,输入项列表输入项列表);o注意:注意:nscanf中各变量一定是表示地址的标识符中各变量一定是表示地址的标识符(加加&)控制字符串控制字符串o控制字符串有两部分组成:控制字符串有两部分组成:n格式说明格式说明o形式:形式:n%n普通字符普通字符o空格空格o可打印字符可打印字符格式说明格式说明o各格式字符及其意义:(详见各格式字符及其意义:(详见C教程)教程)nd:输入一个十进制整数:输入一个十进制整数no:输入一个八进制整数:输入一个八进制整数nx:输入一个十六进制整数:输入一个十六进制整数nf:输入一个小数形式的浮点数:输入一个小数形式的浮点数ne:输入一个指数形式的浮点数:输入一个指数形式的浮点数nc:输入一个字符:输入一个字符ns:输入一个字符串:输入一个字符串空格空格o在多个输入时,一般用空格或回车作为分隔在多个输入时,一般用空格或回车作为分隔符符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可以得到可以得到 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格式:格式:nprintf(控制字符串控制字符串,输入项列表输入项列表);控制字符串控制字符串o控制字符串有两部分组成:控制字符串有两部分组成:n格式说明格式说明o形式:形式:n%n普通字符普通字符o空格空格o可打印字符可打印字符格式说明格式说明o各格式字符及其意义:(详见各格式字符及其意义:(详见C教程)教程)nc:按字符型输出:按字符型输出no:按八进制输出:按八进制输出nd:按十进制输出:按十进制输出nx:按十六进制输出:按十六进制输出nu:按无符号整数输出:按无符号整数输出nf:按浮点型小数输出:按浮点型小数输出ng:按:按e和和f格式中较短的一种输出格式中较短的一种输出ne:按科学计数法输出:按科学计数法输出普通字符普通字符o普通字符:普通字符:n可打印字符可打印字符o主要是说明字符,按原样输出,支持汉字输出主要是说明字符,按原样输出,支持汉字输出n转义字符(例)转义字符(例)o不能直接打印,控制产生特殊的输出效果不能直接打印,控制产生特殊的输出效果普通字符(续)普通字符(续)o转义字符示例转义字符示例i=789,n=123,a=92.34567,且,且i为整型,为整型,n为长整型。为长整型。printf(%4dt%7.4fnt%lun,i,a,n);输出为:输出为:78992.3457 123C语言输入输出总结语言输入输出总结o输入输出可能是输入输出可能是C和和C+的最明显的区别的最明显的区别nC中用中用scanf(),printf()来完成输入输出操作来完成输入输出操作nC+中全局对象中全局对象cin、cout来输入输出,比来输入输出,比C更方便,而且类型检查机制更加完善更方便,而且类型检查机制更加完善oC+中的使用方式中的使用方式nnew申请申请ndelete释放释放oC中的使用方式中的使用方式nmalloc()申请申请nfree()释放释放5.动态内存分配动态内存分配o函数原型:函数原型:nvoid*malloc(long size);o作用:作用:n在对内存中分配在对内存中分配size各字节,并返回了指向这各字节,并返回了指向这块内存首地址的指针

    注意事项

    本文(嵌入式系统程序设计.ppt)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开