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

    嵌入式系统C语言编程基础.ppt

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

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

    嵌入式系统C语言编程基础.ppt

    嵌入式系统C语言编程基础杨高波SNBCPage2目录关于本课程C语言复习编程规范开发高效程序的技巧Page3为什么学习本课程会C语法与会用C语言写程序是两个概念C的灵活性以及由此而产生的陷阱非常多TheMostBeautifulLanguageandMostDangerousLanguageintheProgrammingWorld!本课程将嵌入式系统中最基本的(最经常用到的)概念与技巧介绍给大家Page4小测验?Page5Quiz1所有嵌入式系统的主流程最后都进入一个死循环,怎样用C语言实现一个死循环?Page6Quiz2while().和do.while()有什么区别?Page7Quiz3用变量a给出下列定义:a)一个整型数b)一个指向整型数的指针c)一个有10个整型数的的数组d)一个有10个指针的数组,该指针是指向一个整型数的Page8Quiz4关键字static的作用是什么?Page9Quiz5关键字const的作用是什么?Page10Quiz6定义一个标准宏MIN,这个宏输入两个参数并返回较小的一个。Page11Quiz7嵌入式系统中经常要对变量或寄存器进行位操作。给定一个int型变量a,写两段代码,第一个将a的bit3置为1,第二个将a的bit3置为0。以上两个操作中,要保持其它位不变。Page12Quiz8嵌入式系统具有经常去直接访问物理地址的特点。在某工程中,要求设置一绝对地址为0 x5a00的整型变量的值为0 xaa55。写代码去完成这一任务。Page13Quiz9下面这段代码的输出是什么?voidfoo(void)unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(6);Page14Quiz10请评论下面一段程序代码:voidtest()charstring10;char*str=“0123456789”;strcpy(string,str);Page15Quiz11请评论下面一段程序代码:voidGetMemory(char*p)p=(char*)malloc(0 x20);voidTest(void)char*str=NULL;GetMemory(str);strcpy(str,”HelloWorld!”);printf(str);Page16Quiz12中断是嵌入式系统的重要组成部分。请评论下面一段中断服务子程序代码:_interruptdoublecompute_area(doubleradius)doublearea=PI*radius*radius;printf(nArea=%f,area);returnarea;Page17Answer!Page18Quiz1Answerwhile(1).Page19Quiz2Answerwhile().为入口条件循环,即在每次执行循环之前先检查判断条件;do.while()为退出条件循环,即在执行循环之后再检查判断条件。Page20Quiz3Answera)inta;b)int*a;c)inta10;d)int*a10;Page21Quiz4Answer在C语言中,关键字static有三个明显的作用:1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。Page22Quiz5Answerconst是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。const常量与#define常量:前者有数据类型,后者只是字符替换(而且可能产生意料不到的错误),所以编译器可以对前者进行安全性检查。Page23Quiz6Answer#defineMIN(A,B)(A)=(B)?(A):(B)#define宏的副作用,下面的代码执行后会发生什么事:least=MIN(*p+,b);Page24Quiz7AnswerconstintBIT3=0 x016”,原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。Page27Quiz10Answer字符串str需要11个字节才能存放下(包括末尾的0),而string只有10个字节的空间,所以strcpy会导致数组越界。Page28Quiz11Answer编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p。本例中,_p申请了新的内存,但只是_p的值改变了,p的值却丝毫未变,仍然为NULL。事实上,每执行一次GetMemory就会泄漏一块内存。Page29Quiz12Answer1)ISR不能返回值;2)不能向ISR传递参数;3)ISR应该是短而有效率的,因而在ISR中做浮点运算、使用printf等是不明智的,会经常有重入和性能上的问题。Page30还是先复习一下C吧!Page31C语言复习1)循环与分支2)作用域与存储类3)内存与指针4)位操作5)预编译处理Page32循环与分支1)几种循环语句:for(initialize;test;update)body;while(test)body;dobody;while(test);2)循环辅助手段:break语句用于跳出循环,continue语句用于结束本次循环。Page33循环与分支3)三种形式的if语句:if(expression).if(expression).else.if(expression1).elseif(expression).else.Page34循环与分支4)条件运算符?:expression1?expression2:expression3如果expression1为真,整个表达式的值为expression2的值,否则为expression3的值;是if.else.的简写形式,但是编译器可以产生比if.else.更优化的代码。Page35循环与分支5)多重选择:switchswitch(expression)caseconstant1:statements;break;caseconstant2:statements;break;.default:statements;break;switch判断表达式必须具有整数值,case标签必须是整数常量或整数常量表达式。Page36C语言复习1)循环与分支2)作用域与存储类)作用域与存储类3)内存与指针4)位操作5)预编译处理Page37作用域与存储类1)作用域代码块作用域(局部变量)代码块:包含在开始花括号和对应结束花括号之内的一段代码。作用域:从定义变量位置到该代码块的末尾。文件作用域(全局变量)在所有函数之外定义的变量具有文件作用域。作用域:从定义变量位置到包含该定义的文件的结尾处。在其它位置使用该变量应用extern来声明该变量。Page38作用域与存储类2)存储时期静态存储时期:程序运行期间一直存在,给变量分配固定的存储空间;所有全局变量具有静态存储时期(具有静态存储时期的并不都是全局变量),但是修饰全局变量的关键词static表明的是链接类型,并非存储时期。动态(自动)存储时期:运行期间根据需要动态的给变量分配存储空间。Page39作用域与存储类3)5种存储类存储类存储时期作用域链接声明方式自动自动代码块空代码块内寄存器自动代码块空代码块内,使用关键字register外部静态静态文件外部所有函数之外内部静态静态文件内部所有函数之外,使用关键字static代码块静态静态代码块空代码块内,使用关键字staticPage40C语言复习1)循环与分支2)作用域与存储类3)内存与指针)内存与指针4)位操作5)预编译处理Page41内存与指针1)内存分配方式从静态存储区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量;从栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限;动态内存分配。程序在运行的时候由程序员自己负责申请和释放内存。Page42内存与指针2)内存陷阱C语言的灵活性,指针的应用,以及C语法的宽容性很容易造成代码的错误,这其中最主要的就是内存单元的溢出。a)堆栈溢出b)数组越界.将错误锁定在一个函数中以后,首先应该关注内存的问题。Page43内存与指针举例,看看下面这段代码有什么问题char*DoSomething()chari32*1024;.returni;两个重大问题:两个重大问题:1、临时变量在堆栈上创建,太大的、临时变量在堆栈上创建,太大的临时变量数组会冲掉堆栈;临时变量数组会冲掉堆栈;2、返回堆栈中的地址是没有意义的,、返回堆栈中的地址是没有意义的,因为堆栈中的内容永远是不确定的。因为堆栈中的内容永远是不确定的。Page44内存与指针数组越界的危险临时数组:在栈上创建,因此临时数组越界有可能导致某些局部变量莫明其妙被改,函数返回时崩溃等等;全局数组:在静态存储区创建,因此全局数据越界有可能导致某些全局变量莫明其妙被改,被冲的动态内存无法释放等等。Page45内存与指针3)指针指针是什么?指针是一个变量,它的值是另外一个变量的地址。指针的类型指针所指向的变量的类型,就是指针的类型。举例,右边的运算有何不同:intX2,*pX=&X0;pX+;charY2,*pY=&Y0;pY+;Page46内存与指针指针的三要素1、指针指向的地址;2、指针指向地址上的内容;3、指针本身的地址;举例:intA,*pA,*ppA;pA=&A;ppA=&pA;Page47内存与指针指针的大小(指针变量占用的内存空间)举例,以下为ARM平台下的一段32位C程序,请计算sizeof的值。charstr=“Hello”;char*p=str;intn=10;sizeof(str)=?sizeof(p)=?sizeof(n)=?sizeof(str)=6sizeof(p)=4sizeof(n)=4Page48内存与指针指针的初始化指针变量在没有被初始化之前,它的值是随机的;一个指向不明的指针是非常危险的。当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。使用指针之前,必须给它赋予一个已分配的内存地址。Page49内存与指针指针与数组举例,下列操作是否合法:inta4,*p;p=a;*(a+2)=0 x00;p2=0 x01;/等价于p=&a0;/等价于a2;/等价于*(p+2);但是数组名不同于指针:数组名a是指向数组起始位置的“常量”。因此不能对数组名进行赋值操作。a=p;/错误a+;/错误Page50内存与指针指针与数组什么时候是相同的举例,以下为ARM平台下的一段32位C程序,请计算sizeof的值。voidFunc(chara100)sizeof(a)=?sizeof(a)=4(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。Page51内存与指针数组与指针运用规则数组数组声明声明使用使用定义,如chara10不能写成指针的形式extern,如externchara不能写成指针的形式func(chara);或func(char*a)函数参数可以写成指针的形式c=ai;或c=*(a+i);可以写成指针的形式Page52C语言复习1)循环与分支2)作用域与存储类3)内存与指针4)位操作)位操作5)预编译处理Page53位操作1)位操作的用途硬件寄存器控制;压缩和加密操作;提高程序运行效率;.因为位是程序可以操作的最小数据单位,所以理论上可以用“位操作”完成所有的运算与操作。Page54位操作2)位运算符位逻辑运算符&位与(两个数对应位都为1结果才为1)|位或(两个数对应位有一个为1结果则为1)位异或(两个数对应位不同结果则为1)按位取反(单目运算符)移位运算符右移Page55位操作3)用法:掩码位操作符通常跟掩码一起用。掩码是某些位为开而某些位为关的位组合。例:flag&=MASK;00000 01010110 11000000010MASKflag&=Page56位操作4)用法:打开位、关闭位、转置位打开位:flag=flag|MASK;或flag|=MASK;关闭位:flag=flag&MASK;或flag&=MASK;转置位:flag=flagMASK;或flag=MASK;Page57位操作5)用法:查看某一位的值错误用法:if(flag=MASK)正确用法:if(flag&MASK)=MASK)位运算符的优先级低于=,因此需要在flag&MASK的两侧加上圆括号。Page58位操作6)用法:移位操作unsignedcharch=0 x07;/00000111unsignedchari;i=ch2;00000 11111000 00000000 001左移右移Page59C语言复习1)循环与分支2)作用域与存储类3)内存与指针4)位操作5)预编译处理)预编译处理Page60预编译处理C编译系统在对程序进行编译之前,先进行预处理。C提供的预处理功能主要有以下三种:宏定义文件包含条件编译Page61预编译处理1)宏定义类对象宏例:#defineSTX0 x02类函数宏例:#defineSQUARE(x)(x)*(x)几点说明:a.宏定义不是C语句,不在行末加分号;b.宏名有效范围为从定义处到本源文件结束;c.在宏定义时,可以引用已经定义的宏名;d.宏替换不占运行时间,只占编译时间;Page62预编译处理2)文件包含:#include预处理器发现#include后,就会寻找后跟的这个文件并把这个文件的内容复制到当前位置替换#include指令;使用#include指令的一些例子:#include从标准库路径开始搜索文件#include“def.h”从当前工作路径开始搜索文件#include“/usr/head/def.h”搜索“/usr/head/”目录Page63预编译处理3)条件编译条件编译指不对整个程序编译,而是编译满足条件的那部分。条件编译有以下几种形式:a.#ifdef标识符程序段1;#else程序段2;#endif它的作用:当标识符在前面已经定义过,则对程序段1进行编译,否则对程序段2进行编译。Page64预编译处理b.#ifndef标识符程序段1;#else程序段2;#endif它的作用和#ifdef相反,当标识符之前没被定义过,则对程序段1进行编译,否则就对程序段2进行编译。Page65预编译处理c.#if表达式程序段1;#else程序段2;#endif它的作用:当表达式的值为真时,对程序段1进行编译,都则就对程序段2进行编译;Page66预编译处理举例,下面是某工程中.h文件中的一段程序,请说明#ifndef/#define/#endif结构的作用。#ifndefDEF_H#defineDEF_H#include#include“graphics.h”.#endif防止头文件被重复引用Page67编程规范Page68编程规范1)规范的作用改善代码质量提高开发速度增进团队精神养成良好习惯Page69编程规范2)编程规范养成良好的编程习惯Page70开发高效程序的技巧Page71开发高效程序的技巧1)ARM编程中局部变量的使用举例,请看一面一段程序:intchecksum(int*data)chari;.for(i=0;iNUM)currentFocus=0;LcdDisplay(menucurrentFocus.text);break;Page79开发高效程序的技巧5)Bug的修正别急着改,想想,再想想,想清楚了再动手;考虑所做的修改是否对系统造成新的影响;考虑是否对全局数据结构或其他人的代码造成影响;修改完了,应该有详细的代码注释和文档,并对修改过的代码进行测试。Page80一些有益的建议长期坚持好的CodingStyle;避免编写技巧性很高的代码;长期坚持良好的文档写作习惯;不要崇拜那些独来独往、不受约束且带点邪气的所谓“真正的编程高手”;基础最重要,坚持学习,天天向上。Page81谢谢!

    注意事项

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

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




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

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

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

    收起
    展开