第九章语言在嵌入式中的应用_第1页
第九章语言在嵌入式中的应用_第2页
第九章语言在嵌入式中的应用_第3页
第九章语言在嵌入式中的应用_第4页
第九章语言在嵌入式中的应用_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、上章回顾编码的规范和程序版式管理和申明 头文件结构和作用程序命名程序注释和代码布局规范assert断言函数的应用与0或NULL值的比较内存的分配和常量特性细节,避免内存泄露家园家园-开发板商城/上海第九章C语言在中的应用家园家园-开发板商城/上海预习检查系统有哪些特点关键字volatile的作用家园家园-开发板商城/上海课程目标本章概述以实例说明C在中的应用,以及注意事项 。本章目标了解C语言在系统中的重要性C语言编程的特点和环境熟悉了解如何优化C语言编程的性能重点了解平台的特点,性编程难点C语言嵌入编程的性能优化家园家园-开发板商城/上海本章结

2、构C语言在中的应用系统编程性能优化家园家园-开发板商城/上海C编码C语言在系统地位9 C语言在中的应用C语言在系统中的地位系统编程的特点C编程的性能优化家园家园-开发板商城/上海9.1 C语言在系统中的地位C语言背景系统编程C语言的嵌入应用与汇编语言编程相比的优势C语言的应用发展家园家园-开发板商城/上海9.1.1C语言背景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 规范也做了删

4、减,STL和Stream等被剔除了家园家园-开发板商城/上海9.1.3 C语言的嵌入应用常见的VxWorksLinux Windows CE操作系统C语言应用研发的和欣(Elastos)科泰世纪公司BrickOS Symbian OS Windows CE家园家园-开发板商城/上海9.1.3 与汇编语言编程相比的优势C语言相比汇编语言的优势编程调试灵活方便生成的代码编译效率高完全模块化可移植性好便于项目维护管理家园家园-开发板商城/上海9.2C编程编程环境模块划分多任务与单任务中断服务程序硬件驱动模块家园家园-开发板商城/上海9.2.1编程的环境

5、理解全貌检查环境器I/O指针与地址通讯过程 中断接触硬件家园家园-开发板商城/上海9.2.2模块划分概念:合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求一个系统通常包括两类模块硬件驱动模块,一种特定硬件对应一个模块软件功能模块,其模块的划分应满足低偶合、高内聚的要求家园家园-开发板商城/上海9.2.3 多任务与单任务概念该系统不能支持多任务并发操作,宏观串行地执行一个任务可以宏观并行地“同时”执行多个任务堆栈溢出多任务特点依赖于一个多任务操作系统(OS)多任务OSVxworksucLinux家园家园-开发板商城/上海9.2.3 多任务与单

6、任务单任务程序典型架构从CPU 复位时的指定地址开始执行;跳转至汇编代码startup 处执行;跳转至用户主程序main 执行,在main 中完成:初试化各硬件设备;初始化各软件模块;进入死循环(无限循环),调用各模块的处理函数家园家园-开发板商城/上海9.2.3 多任务与单任务循坏模式循坏模式while(1)循坏模式for(;)死循坏例子操作系统是死循环;WIN32 程序是死循环;系统软件是死循环;多线程程序的线程处理函数是死循环。家园家园-开发板商城/上海9.2.4 中断服务程序中断服务程序的要求不能返回值;不能向ISR 传递参数;ISR 应该尽可能的短小精悍函数不

7、能带来重入和性能问题家园家园-开发板商城/上海9.2.5 硬件驱动模块硬件驱动模块通常应包括如下函数中断服务程序ISR 硬件初始化修改寄存器,设置硬件参数将中断服务程序地址写入中断向量表:设置CPU该硬件的线设置CPU 内部对应寄存器使其作为信号;位,设置中断方式设置CPU 内部的该设备的中断提供一系列该设备的操作接口函数家园家园-开发板商城/上海阶段小节Ô系统编程软件架构方面的知识Ô 模块划分、多任务还是单任务选取Ô 中断服务程序、硬件驱动模块设计Ô 单任务程序典型架构家园家园-开发板商城/上海9.3系统编程的特点C

8、语言语法优化字节对齐详解关键字volatile 中断程序利用硬件特性活用位操作 内嵌汇编使用寄存器变量家园家园-开发板商城/上海9.3.1 C语言语法优化数据类型关于局部变量函数操作语法结构优化家园家园-开发板商城/上海数据类型硬件系统编译器设置某些编译器选项dclcom家家园-开发板/上海城C语言性能数据类型结构体数据的优化规则小的元素放在结构体的开始,大的元素放在结构体的最后;避免使用过大的结构体,用层次话的小结构体代替;人工对API的结构体增加填充位以提高移植性;枚举类型要慎用,因为它的大小与编译器相关;家园家园-开发板商城

9、/上海 关于局部变量局部变量的数据类型最好有系统操作位一致比如:ARM数据处理操作都是32位的,局部变量应尽可能使用32位的数据类型(int或long)分析short checksum_v3(short * data)unsigned int i; short sum = 0;for(i = 0; i < 64 ; i+)sum = (short)( sum + datai );return sum;shortshortint降低程序的效率家园家园-开发板商城/上海 关于局部变量程序分析提高性能short checksum_v3(sho

10、rt * data)unsigned int i; int sum = 0;for(i = 0; i < 64 ; i+)sun += ( data +);return (short) sum;家园家园-开发板商城/上海 函数操作ARM函数参数特性系统寄存器堆栈家园家园-开发板商城/上海 函数操作函数优化规则尽量限制函数参数,不要超过四个,也可以把相关的参数组织在结构体传递。把比较小的被调用函数和调用函数放在同一个源文件中用_inline内联性能影响较大的重要函数。函数参数和返回值应尽量使用int类型;对于调用频率较低的全局变量,尽量使

11、用小的数据类型以节省空间。家园家园-开发板商城/上海 语法结构优化语法结构规则使用减数到零的循环体,以节省指令和寄存器的使用;使用无符号的循环计数值,并用条件 i != 0中止;如果循环体至少执行一次,用优先选用dowhile;适当情况下展开循环体;尽量使用数组的大小是4或8的倍数,用此倍数展开循环体;尽量避免使用边界不对齐数据。家园家园-开发板商城/上海什么是字节对齐对齐的定义按照一定的规则在空间上排列,而不是顺序的一个接一个的排放对齐的各个硬件平台对空间的处理上有很大的不同对齐的作用提高存取效率家园家园-开发板商城/上海9.3

12、.1.6 字节对齐对程序的影响例A例Bstruct Bchar b; int a; short c;struct Aint a; char b; short c;假定运行在32位系统结果sizeof(strcut A)的值为?sizeof(struct B)的值是?812家园家园-开发板商城/上海 字节对齐对程序的影响例D例C/*指定按2字节对齐*/ #pragma pack (2) struct Cchar b; int a; short c;#pragma pack ()/*指定按1字节对齐*/ #pragma pack (1) struct Dchar b; i

13、nt a; short c;#pragma pack ()假定运行在32位系统结果sizeof(strcut C)的值为?sizeof(struct D)的值是?87家园家园-开发板商城/上海编译器是按照什么样的原则进行对齐的基本概念数据类型自身的对齐值:char型数据,其自身对齐值为1 short型为2,int,float,double类型,其自身对齐值为4结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。指定对齐值:#pragma pack (value)时的指定对齐值value。数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。重要概

14、念有效对齐N存放起始地址%N=0对齐值圆整结构体成员变量占用总长度需要是对结构体有效对齐值的整数倍家园家园-开发板商城/上海 编译器是按照什么样的原则进行对齐的例Astruct Bchar int例A分析假定B起始地址为0X0000b -> 0x0000%1=0 ->0X000-0X000 a -> 0x0004%4=0 ->0X004-0X007 c -> 0x0008%2=0 ->0X008-0X009结构体的有效对齐值MAX(1,4,2) -> 4B ->(10+2)%40 ->0X000-0X00Bb;a;

15、short c;假定运行在32位系统结果sizeof(struct B)的值是?12家园家园-开发板商城/上海编译器是按照什么样的原则进行对齐的例C例C分析假定B起始地址为0X0000b -> 0x0000%1=0 ->0X000-0X000b有效对齐值->MIN(2,4)->2a -> 0x0004%2=0 ->0X002-0X003 a -> 0x0006%2=0 ->0X004-0X005 c -> 0x0008%2=0 ->0X006-0X007结构体的有效对齐值MAX(4,2) -> 2B -

16、> (8)%20 ->0X000-0X007/*指定按2字节对齐*/ #pragma pack (2) struct Cchar int shortb;a;c;#pragma pack ()假定运行在32位系统结果sizeof(struct C)的值是?家园8家园-开发板商城/上海字节对齐,我们在编程中如何考虑如何节约空间结构中的变量按照类型大小从小到大以空间换取时间 显式struct Achar a; char int b;3;/使用空间换时间家园家园-开发板商城/上海 字节对齐可能带来的隐患如下例子有什么问题?分析unsign

17、ed int i = 0x12345678; unsigned char *p=NULL; unsigned short *p1=NULL;p=&i;*p=0x00;p1=(unsigned short *)(p+1);*p1=0x0000;家园家园-开发板商城/上海0 如何查找与字节对齐方面的问题编译器的big little端设置看这种体系本身是否支持非对齐如果支持看设置了对齐与否,如果没有则看时需要加某些特殊的修饰来标志其特殊操作。家园家园-开发板商城/上海1 对齐的使用 align(num) packed家园家园-开发板商城ub

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

19、误呢?家园家园-开发板商城/上海9.3.3 关键字volatile例子分析系统优化int a,b,c;/*I/O空间0x100端口的内容存入a变量*/a = inWord(0x100); b = a;/*再次I/O空间0x100端口的内容存入a变量*/a = inWord (0x100); c = a;会出现什么错误呢?家园家园-开发板商城/上海9.3.3 关键字volatile例子分析正确改正int b,c; volatile int a;/*I/O空间0x100端口的内容存入a变量*/a = inWord(0x100); b = a;/*再次I/O空间0x100端口

20、的内容存入a变量*/a = inWord (0x100); c = a;会出现什么错误呢?家园家园-开发板商城/上海9.3.3 关键字volatilevolatile的特点一个参数既可以是const还可以是volatile吗?解释为什么? 一个指针可以是volatile 吗?解释为什么。下面的函数有什么错误:家园家园-开发板商城/上海9.3.4 中断程序中断程序特性分析 interrupt double compute_area (double radius)double area = PI * radius * radius; printf(" Area =

21、 %f", area);return area;家园家园-开发板商城/上海9.3.4 中断程序中断程序特性分析ISR 不能返回一个值。ISR 不能传递参数。在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。printf()经常有重入和性能上的问题家园家园-开发板商城/上海9.3.5 利用硬件特性器的速度选择CPU内部RAM FLASH/ROM>外部同步RAM>外部异步RAM>硬件内部的空间利用

22、减少了CPU 对外设的干预家园家园-开发板商城/上海9.3.6 活用位操作位操作特点位是可以操作的最小数据理论上可以用“位运算”来完成所有的运算和操作提高程序运行的效率例子:/* 方法1 */int i,j;i = 879 / 16;j = 562 % 32;/* 方法2 */int i,j;i = 879 >> 4;j = 562 - (562 >> 5 << 5);家园家园-开发板商城/上海9.3.6 活用位操作硬件寄存器进行位设置寄存器的第低6位设置为0#define INT_I2_MASK0x0040wTemp = inword(INT_MASK); outword(INT_MASK, wTemp &INT_I2_MASK);寄存器的第低6位设置为1设置寄存器的第低6位设置是否为1#define INT_I2_MASK0x0040wTemp = inword(INT_MASK); if(wTemp & INT_I2_MASK)/* 该位为1 *//上海家园 开发板商城 9.3.7 内嵌汇编内嵌汇编特点提高运算速度内嵌汇编语法_asm 例子/* 把两个输入参数的值相加,结果存放到另外一个全局变量中*/ int result;void Add(long a, l

温馨提示

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

评论

0/150

提交评论