第九章C语言在嵌入式中的应用.ppt

上传人:sccc 文档编号:4880042 上传时间:2023-05-21 格式:PPT 页数:59 大小:171.51KB
返回 下载 相关 举报
第九章C语言在嵌入式中的应用.ppt_第1页
第1页 / 共59页
第九章C语言在嵌入式中的应用.ppt_第2页
第2页 / 共59页
第九章C语言在嵌入式中的应用.ppt_第3页
第3页 / 共59页
第九章C语言在嵌入式中的应用.ppt_第4页
第4页 / 共59页
第九章C语言在嵌入式中的应用.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《第九章C语言在嵌入式中的应用.ppt》由会员分享,可在线阅读,更多相关《第九章C语言在嵌入式中的应用.ppt(59页珍藏版)》请在三一办公上搜索。

1、上章回顾,编码的规范和程序版式版权管理和申明头文件结构和作用程序命名程序注释和代码布局规范Assert断言函数的应用与0或NULL值的比较内存的分配和释放细节,避免内存泄露常量特性,C语言在嵌入式中的应用,第九章,预习检查,const比#define有哪些优势简单说出const几种常见的用法内存分配方式有几种常见的内存错误有哪些,课程目标,本章概述以实例说明C在嵌入式中的应用,以及注意事项。本章目标了解C语言在嵌入式系统中的重要性熟悉嵌入式C语言编程的特点和环境了解如何优化C语言嵌入式编程的性能重点了解嵌入式平台的特点,针对性编程 难点嵌入式C语言嵌入编程的性能优化,本章结构,C语言在嵌入式系

2、统地位,C语言在嵌入式中的应用,嵌入式C编码,嵌入式系统编程性能优化,9 C语言在嵌入式中的应用,C语言在嵌入式系统中的地位 嵌入式系统编程的特点 嵌入式C编程的性能优化,9.1 C语言在嵌入式系统中的地位,C语言背景 嵌入式系统编程 C语言的嵌入应用 与汇编语言编程相比的优势 C语言的嵌入式应用发展,9.1.1 C语言背景,C语言的特点C 中蕴含的OO,GP 强大的语言功能灵活的语言机制,9.1.2 嵌入式系统编程,嵌入式系统有三个特点嵌入性专用性计算性 资源受限的环境,9.1.2 嵌入式系统编程,嵌入式系统有三个特点嵌入性表示系统通常需要嵌入到其他对象系统中 专用性表示系统的软件和硬件要有

3、可裁剪性 计算性 表示嵌入式系统必须是能满足对象系统控制需要的电脑系统,9.1.2 嵌入式系统编程,嵌入式系统运行环境 资源受限的环境嵌入式应用种类繁多,9.1.2 嵌入式系统编程,C语言在嵌入式系统的不足 ISO C 的语法特性会导致代码体积膨胀和执行效率的低下 C 有可能会对嵌入式软件带来额外的开销 C语言的改造1998年,Embedded C 规范正式出炉(EC)EC 是标准C 语言的一个子集剔除了一些实现复杂和会导致额外负担语法元素。例如:多重继承和虚基类、RTTI、异常处理、模版、命名空间等等在标准库方面,EC 规范也做了删减,STL和Stream等被剔除了,9.1.3 C语言的嵌入

4、应用,常见的嵌入式操作系统 VxWorks嵌入式LinuxWindows CE C语言嵌入式应用科泰世纪公司自主研发的和欣(Elastos)BrickOS Symbian OS Windows CE,9.1.3 与汇编语言编程相比的优势,C语言相比汇编语言的优势 编程调试灵活方便 生成的代码编译效率高 完全模块化 可移植性好 便于项目维护管理,9.2 嵌入式C编程,嵌入式编程环境模块划分 多任务与单任务中断服务程序硬件驱动模块,9.2.1嵌入式编程的环境,理解全貌 检查环境存储器映射I/O映射指针与地址 通讯过程中断映射接触硬件,9.2.2模块划分,概念:合理的将一个很大的软件划分为一系列功能

5、独立的部分合作完成系统的需求 一个嵌入式系统通常包括两类模块 硬件驱动模块,一种特定硬件对应一个模块 软件功能模块,其模块的划分应满足低偶合、高内聚的要求,9.2.3 多任务与单任务,概念该系统不能支持多任务并发操作,宏观串行地执行一个任务 可以宏观并行地“同时”执行多个任务堆栈溢出 多任务特点依赖于一个多任务操作系统(OS)嵌入式多任务OS Vxworks ucLinux,9.2.3 多任务与单任务,单任务程序典型架构从CPU 复位时的指定地址开始执行;跳转至汇编代码startup 处执行;跳转至用户主程序main 执行,在main 中完成:初试化各硬件设备;初始化各软件模块;进入死循环(无

6、限循环),调用各模块的处理函数,9.2.3 多任务与单任务,循坏模式,死循坏例子操作系统是死循环;WIN32 程序是死循环;嵌入式系统软件是死循环;多线程程序的线程处理函数是死循环。,循坏模式,循坏模式,while(1),for(;),9.2.4 中断服务程序,中断服务程序的要求 不能返回值;不能向ISR 传递参数;ISR 应该尽可能的短小精悍 函数不能带来重入和性能问题,9.2.5 硬件驱动模块,硬件驱动模块通常应包括如下函数 中断服务程序ISR硬件初始化修改寄存器,设置硬件参数将中断服务程序入口地址写入中断向量表:设置CPU 针对该硬件的控制线设置CPU 内部对应寄存器使其作为控制信号;设

7、置CPU 内部的针对该设备的中断屏蔽位,设置中断方式提供一系列针对该设备的操作接口函数,阶段小节,嵌入式系统编程软件架构方面的知识 模块划分、多任务还是单任务选取 中断服务程序、硬件驱动模块设计单任务程序典型架构,9.3 嵌入式系统编程的特点,C语言语法优化字节对齐详解 关键字volatile 中断程序 利用硬件特性 活用位操作 内嵌汇编 使用寄存器变量,9.3.1 C语言语法优化,数据类型关于局部变量 函数操作 语法结构优化,9.3.1.1 数据类型,C语言性能,编译器,硬件系统,设置某些编译器选项,9.3.1.1 数据类型,结构体数据的优化规则小的元素放在结构体的开始,大的元素放在结构体的

8、最后;避免使用过大的结构体,用层次话的小结构体代替;人工对API的结构体增加填充位以提高移植性;枚举类型要慎用,因为它的大小与编译器相关;,9.3.1.2 关于局部变量,局部变量的数据类型最好有系统操作位一致比如:ARM数据处理操作都是32位的,局部变量应尽可能使用32位的数据类型(int或long)分析,shortshortint降低程序的效率,short checksum_v3(short*data)unsigned int i;short sum=0;for(i=0;i 64;i+)sum=(short)(sum+datai);return sum;,9.3.1.2 关于局部变量,程序分

9、析,提高性能,short checksum_v3(short*data)unsigned int i;int sum=0;for(i=0;i 64;i+)sun+=(data+);return(short)sum;,9.3.1.3 函数操作,ARM函数参数特性,void func(var1,var2,var3,var4,var5),系统寄存器,堆 栈,9.3.1.3 函数操作,函数优化规则尽量限制函数参数,不要超过四个,也可以把相关的参数组织在结构体传递。把比较小的被调用函数和调用函数放在同一个源文件中用_inline内联性能影响较大的重要函数。函数参数和返回值应尽量使用int类型;对于调用频

10、率较低的全局变量,尽量使用小的数据类型以节省空间。,9.3.1.4 语法结构优化,语法结构规则使用减数到零的循环体,以节省指令和寄存器的使用;使用无符号的循环计数值,并用条件 i!=0中止;如果循环体至少执行一次,用优先选用dowhile;适当情况下展开循环体;尽量使用数组的大小是4或8的倍数,用此倍数展开循环体;尽量避免使用边界不对齐数据。,9.3.1.5 什么是字节对齐,对齐的定义按照一定的规则在空间上排列,而不是顺序的一个接一个的排放 对齐的原因各个硬件平台对存储空间的处理上有很大的不同 对齐的作用提高存取效率,9.3.1.6 字节对齐对程序的影响,例A,例B,假定运行在32位系统结果s

11、izeof(strcut A)的值为?8sizeof(struct B)的值是?12,struct A int a;char b;short c;,struct B char b;int a;short c;,9.3.1.6 字节对齐对程序的影响,例C,例D,假定运行在32位系统结果sizeof(strcut C)的值为?8sizeof(struct D)的值是?7,/*指定按2字节对齐*/#pragma pack(2)struct C char b;int a;short c;#pragma pack(),/*指定按1字节对齐*/#pragma pack(1)struct D char b;

12、int a;short c;#pragma pack(),9.3.1.7 编译器是按照什么样的原则进行对齐的,基本概念数据类型自身的对齐值:char型数据,其自身对齐值为1short型为2,int,float,double类型,其自身对齐值为4结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。指定对齐值:#pragma pack(value)时的指定对齐值value。数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。重要概念 有效对齐N-存放起始地址%N=0 对齐值圆整结构体成员变量占用总长度需要是对结构体有效对齐值的整数倍,9.3.1.7 编译器是按照什么样的原则

13、进行对齐的,例A,例A分析假定B起始地址为0X0000b-0 x0000%1=0-0X000-0X000a-0 x0004%4=0-0X004-0X007c-0 x0008%2=0-0X008-0X009结构体的有效对齐值MAX(1,4,2)-4B-(10+2)%40-0X000-0X00B,假定运行在32位系统结果sizeof(struct B)的值是?12,struct B char b;int a;short c;,9.3.1.7编译器是按照什么样的原则进行对齐的,例C,例C分析假定B起始地址为0X0000b-0 x0000%1=0-0X000-0X000b有效对齐值-MIN(2,4)-

14、2a-0 x0004%2=0-0X002-0X003a-0 x0006%2=0-0X004-0X005c-0 x0008%2=0-0X006-0X007结构体的有效对齐值MAX(4,2)-2B-(8)%20-0X000-0X007,假定运行在32位系统结果sizeof(struct C)的值是?8,/*指定按2字节对齐*/#pragma pack(2)struct C char b;int a;short c;#pragma pack(),9.3.1.8 针对字节对齐,我们在编程中如何考虑,如何节约空间 结构中的变量按照类型大小从小到大声明 以空间换取时间 显式reserved,struct

15、A char a;char reserved3;/使用空间换时间 int b;,9.3.1.9 字节对齐可能带来的隐患,如下例子有什么问题?分析,unsigned int i=0 x12345678;unsigned char*p=NULL;unsigned short*p1=NULL;p=,9.3.1.10 如何查找与字节对齐方面的问题,编译器的big little端设置看这种体系本身是否支持非对齐访问如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。,9.3.1.11 对齐的使用,_align(num)_packed,9.3.2 关键字volatile,

16、volatile 特点:变量可能会被意想不到地改变 优化器在用到这个变量时必须每次都重新读取这个变量的值 主要的应用实例 并行设备的硬件寄存器(如:状态寄存器);一个中断服务子程序中会访问到的非自动变量(也就是全局变量);多线程应用中被几个任务共享的变量,9.3.3 关键字volatile,例子分析 会出现什么错误呢?,int a,b,c;/*读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);b=a;/*再次读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);c=a;,9.3.3 关键字volatile,例子分析 系统优化会出现

17、什么错误呢?,int a,b,c;/*读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);b=a;/*再次读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);c=a;,9.3.3 关键字volatile,例子分析 正确改正会出现什么错误呢?,int b,c;volatile int a;/*读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);b=a;/*再次读取I/O空间0 x100端口的内容存入a变量*/a=inWord(0 x100);c=a;,9.3.3 关键字volatile,volatil

18、e的特点 一个参数既可以是const还可以是volatile吗?解释为什么?一个指针可以是volatile 吗?解释为什么。下面的函数有什么错误:,int square(volatile int*ptr)return*ptr*ptr;,9.3.4 中断程序,中断程序特性分析,_interrupt double compute_area(double radius)double area=PI*radius*radius;printf(Area=%f,area);return area;,9.3.4 中断程序,中断程序特性分析ISR 不能返回一个值。ISR 不能传递参数。在许多的处理器/编译器中

19、,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。printf()经常有重入和性能上的问题,9.3.5 利用硬件特性,存储器的访问速度选择CPU内部RAM外部同步RAM外部异步RAMFLASH/ROM 硬件内部的存储空间利用减少了CPU 对外设的干预,9.3.6 活用位操作,位操作特点位是可以操作的最小数据单位 理论上可以用“位运算”来完成所有的运算和操作 提高程序运行的效率 例子:,/*方法1*/int i,j;i=879/16;j=562%32;,/*方法2*

20、/int i,j;i=879 4;j=562-(562 5 5);,9.3.6 活用位操作,硬件寄存器进行位设置 屏蔽控制寄存器的第低6位设置为0 设置控制寄存器的第低6位设置为1判断控制寄存器的第低6位设置是否为1,#define INT_I2_MASK 0 x0040 wTemp=inword(INT_MASK);outword(INT_MASK,wTemp,#define INT_I2_MASK 0 x0040 wTemp=inword(INT_MASK);outword(INT_MASK,wTemp|INT_I2_MASK);,#define INT_I2_MASK 0 x0040 w

21、Temp=inword(INT_MASK);if(wTemp&INT_I2_MASK)/*该位为1*/,9.3.7 内嵌汇编,内嵌汇编特点提高运算速度内嵌汇编语法_asm 例子,/*把两个输入参数的值相加,结果存放到另外一个全局变量中*/intresult;void Add(longa,long*b)_asm MOV AX,a MOV BX,b ADD AX,BX MOV result,AX,9.3.8 使用寄存器变量,关键字register register特点存放在CPU的寄存器 使用时不需要访问内存 提高效率 Register使用规则只有局部自动变量和形参才可以定义为寄存器变量“建议”型

22、关键字,9.3.8 使用寄存器变量,例子,/*求1+2+3+.+n的值*/WORD Addition(BYTE n)register i,s=0;for(i=1;i=n;i+)s=s+i;return s;,9.3.9 降低内存的使用,RAM 与ROM减小栈的大小堆的大小受限于RAM,阶段小节,字节对齐特点和好处嵌入式中断程序的特点如何在嵌入式系统中嵌入汇编和位操作寄存器变量和volatile变量的区别和各自的用法如何提供系统内存的利用,本章总结,嵌入式环境特点和C语言的优势C语言与汇编语言的优势及嵌入式的发展前景嵌入式系统编程的环境嵌入式系统编程的调试特点如何优化嵌入式C编程,实验1,题目编译器是一个纯粹的ANSI编译器。要求设置一绝对地址为0 x67a9的整型变量的值为0 xaa66。写代码去完成这一任务。同时写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。实验目的嵌入式寄存器位操作运算;volatile关键词的用法;实验分析定义一个数据指针,确定好数据指针的数据类型;定义一个volatile指针;实现一个设置位函数和清零位函数;,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号