嵌入式系统C语言编程基础.ppt_第1页
嵌入式系统C语言编程基础.ppt_第2页
嵌入式系统C语言编程基础.ppt_第3页
嵌入式系统C语言编程基础.ppt_第4页
嵌入式系统C语言编程基础.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统c语言编程基础,杨高波,SNBC,Page2,目录,本课程c语言复习编程规范开发的有效步骤,Page3,为什么要学习本课程, 会c语法参加用c语言编写程序是两个概念c的灵活性和由此产生的陷阱非常多的themostbaeituileflullllanguageandsodstangrussslanguageintheprogrammingworld! 本课程介绍嵌入式系统中最基本的(最常用的)概念和技巧。 Page4、测验、Page5、Quiz1和所有嵌入式系统的主流最后都进入死循环,如何用c语言实现死循环? Page6,Quiz2,while().和do.while ()有什么区别?Page7、Quiz3和变量a定义。 整数、整数指针、整数10指针、整数指针、Page8,Quiz4和关键字static的作用是什么? Page9、Quiz5和关键字const的作用是什么? 定义Page10、Quiz6和标准宏MIN。 此宏输入两个参数并返回较小的参数。 此外,Page11、Quiz7、嵌入式系统中始终对变量和寄存器进行比特操作。 给出int型的变量a,写两个代码,第一个使a的bit3为1,第二个使a的bit3为0。 在以上两个操作中,其他位应保持原样。 此外,Page12、Quiz8、嵌入式系统具有总是直接访问物理地址的特征。 对于某个项目,必须将绝对地址为0 x5a00的整数变量的值设置为0 xaa55。 写代码完成这项任务。 Page13、Quiz9,以下代码的输出是什么? voidfoo(void)unsignedinta=6; intb=-20; (a b6 )? puts(6):puts(6 );Page14、Quiz10、voidtest()charstring10; char*str=“0123456789”; strcpy(string,str) 、Page15、Quiz11、voidagetmemory (char * p ) p=(char * ) malloc (0x 20 ); void测试(void ) char * str=null; get memory (str ) strcpy (str ) hello world! ; printf(str) 、Page16、Quiz12、中断是嵌入式系统的重要组成部分。 请注释以下中断服务子程序代码: _ _ interruptpdoublecompute _ area (双radius ) 双rarea=pi * radius * radius; printf(narea=%f ,area ); returnarea; Page17,Answer! 另外,Page18,Quiz1Answer,while(1).,Page19,Quiz2Answer,while () . 是入口条件循环,每次执行循环检查判定条件的do.while ()是结束条件循环,执行循环后将判定条件返回到、Page20、Quiz3Answer、a)inta; b)int*a c)inta10; d)int*a10; 此外,在Page21、Quiz4Answer和c语言中,关键字static具有三个重要角色:1)在调用该函数时,在函数中声明为静态的变量保持其值。 2 )在模块内(但是在函数之外),可以从模块内使用的函数访问被声明为静态的变量,但不能从模块以外的其他函数访问变量。 这是局部全局变量。 3 )在模块内被声明为静态的函数只能由该模块内的其他函数调用。 换句话说,此函数限制在声明的模块的本地范围内使用。 Page22、Quiz5Answer、const是constant的缩写,意思是“一定不变”。 用const修饰的一切都是强制性的保护,可以防止意外的变动,提高程序的稳健性。 const常数和#define常数:前者有数据类型,后者只是文字置换(可能发生意外的错误),所以编译器可以进行前者的安全检查。 Page23、Quiz6Answer、#defineMIN(A,B)(A)=(B )? (A):(B)#define宏的不良反应,执行以下代码会发生什么: least=MIN(*p,b )、Page24、Quiz7Answer、constintBIT3=0 x016 )表达式中存在符号类型和无符号类型因此,-20是非常大的正整数,因此表达式返回大于6的结果。 这对于频繁使用无符号数据类型的嵌入式系统来说是非常重要的。 另外,存储Page27、Quiz10Answer和字符串str需要11字节(包括末尾的 0),但是由于string只有10字节的空间,因此strcpy会超出数组边界。此外,Page28、Quiz11Answer、编译器总是生成函数的每个参数的临时副本,指针参数p的副本为_p,编译器为_p=p。 在本例中,_p虽然申请了新的存储器,但只是_p的值发生了变化,p的值没有变化,仍然是NULL。 实际上,每次运行GetMemory时内存都会泄漏。Page29、Quiz12Answer、1)ISR不能返回返回值2)ISR不能传递参数3)ISR应该短而高效,在ISR中进行浮点运算或使用printf是不明智的,经常重新引入和性能Page30,还是复习c吧! Page31,c语言复习,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) else 、Page34、循环和分支、4 )条件运算符:expression1? 如果expression2: expression3expression 1为真,则整个表达式的值为expression 2的值,否则为expression3的值if.else.的简短格式,但编译器生成的代码更优于if.else.Page35、环路与分支、5 )多重选择: switch switch (expression ) case constant 13360 statements; break; caseconstant2:statements; break; .default:statements; break; switch确定表达式需要整数值,case标签需要整数常量或整数常量表达式。 Page36,c语言复习,1 )环路和分支2 )范围和类3 )内存和指针4 )位操作5 )预编译处理,Page37,范围和类,1 )范围代码块范围代码块:与开始大括号对应的结束大括号中包含的代码。 范围:从定义变量的位置到代码块的末尾。 文件作用域(全局变量)在所有函数之外定义的变量都具有文件作用域。 范围:从定义变量的位置到包含定义的文件的结尾。 在其他位置使用此变量应用extern并声明变量。 Page38,范围和存储类,2 )存储期间静态存储期间:程序运行期间一直存在,为变量分配静态存储空间的所有全局变量都具有静态保留期间(具有静态保留期间的不是全局变量) 动态(自动)保留期:在运行时根据需要动态分配保留区域给变量。 Page39,范围和存储类,3)5种存储类,Page40,c语言复习,1 )循环和分支,2 )范围和存储类,3 )内存和指针,4 )位操作,5 )预编译处理,Page41,内存和指针,1 )内存分配方式内存在程序编译时已被分配,该内存存在于程序的整个执行期间。 例如,从全局变量、静态变量堆栈创建。 运行函数时,可以在堆栈中为函数中的局部变量创建存储单元格,并在函数运行完成后自动释放存储单元格。 堆栈存储器分配操作内置在处理器的指令集中且效率高,但其分配的存储器容量有限的动态存储器分配。 程序在执行时由程序员自身负责内存的申请和释放。 Page42,存储和指针,2 )存储陷阱c语言的灵活性,指针的应用,c语法的容忍性容易导致代码错误,其中最重要的是存储单元的溢出。 a )堆溢出b )排列越境.将错误锁定在一个函数后,首先应该关注存储器的问题。 Page43,内存和指针,例如,char*dosome()chari32*1024; .returni;两个重要问题: 1、在堆栈上创建临时变量,过大的临时变量数组冲突堆栈2 .返回堆栈内的地址没有意义。 因为堆栈内的内容永远不会确定。Page44、内存和指针、阵列过境的危险临时阵列:由于在堆栈上创建,临时阵列过境在某些局部变量发生微小变化或函数返回时可能崩溃的全局阵列:由于在静态存储区域中创建,因此跨越全局数据边界的某些全局阵列Page45,内存和指针,3 )指针是什么? 指针是变量,其值是另一个变量的地址。 指针类型指针指向的变量类型是指针类型。 例如,右边运算的差异在于,intX2、*pX=、Page46、存储器和指针、指针这三要素1、指针指向的地址2、指针指向地址上的内容的3、指针自身的地址例: intA、*pA、*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 )=4、Page48、内存和指针、指针初始化指针变量未初始化之前,其值为随机的未知指针非常危险。 创建指针时,只分配存储指针本身的内存空间,而不分配存储数据的内存空间。 在使用指针之前,必须指定分配的内存地址。 Page49、内存和指针、指针和数组示例,以下操作是否合法: inta4、*p; p=a; *(a 2)=0 x00; p2=0 x01; p=/相当于错误a/错误、Page50、内存和指针、指针和数组何时相同,请在ARM平台下的32位c程序中计算sizeof的值。 voidafunc (chara 100 ) sizeof (a )=? (2)遗憾的是,如果sizeof(a)=4,(1)数组名称是函数形式参数,则在函数中它自身的内容丢失,而且它只是一个指针,(2)丢失了它的内容,同时也丢失了常量特性,可以进行诸如自增量、自减量等的操作,从而进行修改。 Page51、内存和指针、数组和指针操作规则、数组、声明、使用、定义,例如chara10不能写指针格式,extern、externchara不能写指针格式,func(chara ) 或者func(char*a )函数参数可以指针的形式描述,c=ai; 或者c=*(a i )指针的形式是,Page52,c语言复习,1 )循环和分支2 )作用域和记忆类3 )存储器和指针4 )位操作5 )预编译处理,Page53,位操作, 1 )位操作的用途提高硬件寄存器控制压缩和加密的操作程序的执行效率位是程序能够操作的最小数据单位,理论上可以通过“位操作”进行所有的运算和操作。 Page54、位运算符、2 )位逻辑运算符或flag|=MASK; off位: flag=flag,Page57,位操作,5 )用法:查看某位值的错误用法: if(flag=MASK )正确用法: if(flag/000007539; 未发现的chari; i=ch2; 向左移动、向右移动、Page59、c语言复习、1 )环路和分支、2 )范围和类、3 )存储器和指针、4 )位操作、5 )预编译处理、Page60、预编译处理、c编译系统在编译程序之前进行预处理。 c提供的预处理功能主要包括宏定义文件中的条件编译、Page61、预编译处理、1 )宏定义类对象宏示例: #defineSTX0 x02类函数宏示例: #defineSQUARE(x)(x)*(x ) )一些描述: a .宏b .宏名的有效范围不是行尾的加分符号,从定义位置到本源文件。c .宏定义时,可以参照预定义的宏名。d .宏置换不占用执行时间,只占用编译时间,Page62,预编译处理,2 )文件中包含: #include预处理使用#include指令来替换#include指令,该指令在发现include后搜索后续文件,将该文件的内容复制到当前位置并替换#include指令的示例:Page63,预编译过程,3 )条件编译条件编译不是满足整个程序,而是满足条件条件编译包括a.#ifdef标识符程序段1; 第#else段2; 如果先前定义了标识符,则#endif用作编译段1,否则编译段2。 Page64

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论