第3章 嵌入式Linux C高级用法_第1页
第3章 嵌入式Linux C高级用法_第2页
第3章 嵌入式Linux C高级用法_第3页
第3章 嵌入式Linux C高级用法_第4页
第3章 嵌入式Linux C高级用法_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、,嵌入式LinuxC高级用法,课程目标,预处理C语言中的内存分配程序的可移植性考虑C和汇编的接口,,本章内容,3.1预处理3.2C语言中的内存分配3.3程序的可移植性考虑3.4C和汇编的接口本章小结,,3.1预处理,3.3.1预定义3.3.2文件包含3.3.3条件编译,,3.1.1预定义,在C语言源程序中允许用一个标识符来表示一串符号,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的符号串去替换,这称为宏替换或宏展开。预定义符号宏定义,,预定

2、义符号,有一些预处理定义的符号串,它们的值或者是字符串常量,或者是十进制数字常量,它们通常在调试程序时用于输出源程序的各项信息。,,宏定义,宏定义是由源程序中的宏定义#define语句完成的;而宏替换是由预处理程序自动完成的。(1)无参宏定义无参宏的宏名(也就是标识符)后不带参数,其定义的一般形式为:#define标识符字符串(2)带参宏定义对带参数的宏,在调用中不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为:#define宏名(形参表)字符串,,宏定义,宏与函数的不同之处,,3.1.2文件包含,

3、文件包含是C语言预处理程序的另一个重要功能,文件包含命令行的一般形式为:#include文件名“对文件包含命令还要说明以下几点:包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。使用尖括号表示在系统头文件目录中去查找(头文件目录可以由用户来指定);使用双引号则表示首先在当前的源文件目录中查找,若未找到才到系统头文件目录中去查找。用户编程时可根据自己文件所在的位置来选择某一种形式。一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。文件包含允许嵌套,即在一个被包含的文件中又可以包含别的文件。,,3.1.3条件编译,

4、第一种形式第二种形式第三种形式,#ifdef标识符程序段1#else程序段2#endif,#ifndef标识符程序段1#else程序段2#endif,#if常量表达式程序段1#else程序段2#endif,,3.2C语言中的内存分配,3.2.1C语言程序所占内存分类3.2.2堆和栈的区别,,3.2.1C语言程序所占内存分类,一个由C语言的程序占用的内存分为以下几个部分。栈(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值、返回地址等,其操作方式类似于数据结构中的栈。堆(heap):一般由程序员动态分配(调用mallo()

5、函数)和释放(调用free()函数),若程序员不释放,程序结束时可能由操作系统回收。数据段(data):存放的是全局变量、静态变量、常数。根据存放的数据,数据段又可以分成普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)。代码段(code):用于存放程序代码。,,3.2.2堆和栈的区别,申请方式栈(stack)是由系统自动分配的;堆(head)需要程序员自己申请,并在申请时指定大小。申请后系统的响应堆在操作系统中有一个记录空闲内存地址的链表,当系统收到程序的申请时,系统就会开始遍历该链表,寻找第一个空间大于

6、所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。,,3.2.2堆和栈的区别,申请大小的限制堆是向高地址扩展的数据结构,是不连续的内存区域;栈是向低地址扩展的数据结构,是一块连续的内存的区域。申请速度的限制堆是由malloc()等语句分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来很方便。栈由系统自动分配,速度较快,但程序员一般无法控制。堆和栈中的存储内容堆一般在堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。,,3.3程序的可移植性考虑,3.3.1字长和数据类型3.3.2数据对齐3

7、.3.3字节顺序,,3.3.1字长和数据类型,能够由机器一次完成处理的数据称为字,不同体系结构的字长通常会有所区别。,,3.3.2数据对齐,对齐是内存数据与内存中的相对位置相关的话题。一些体系结构对对齐的要求非常严格。通常基于RISC的系统载入未对齐的数据会导致处理器陷入(一种可处理的错误);还有一些系统可以访问没有对齐的数据,但性能会下降。,,3.3.3字节顺序,字节顺序是指一个字中各个字节的顺序,有大端模式和小端模式。大端模式是指在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

8、小端模式是指与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。ARM体系结构支持大端模式(big-endian)和小端模式(little-endian)两种内存模式。,,3.4C和汇编的接口,3.4.1内嵌汇编的语法3.4.2编译器优化介绍3.4.3C语言关键字volatile3.4.4memory描述符,,3.4.1内嵌汇编的语法,汇编语言模板汇编语句模板由汇编语句序列组成,语句之间使用“;”、“n”或“nt”分开。每条指令都必须被双引号括起来。两条指令必须用换行或分号分开。指令中的操作

9、数可以使用占位符引用C语言变量,操作数占位符最多10个,名称如为:%0,%1,.,%9,,3.4.1内嵌汇编的语法,输出部分输出部分用来指定当前内联汇编语句的输出。输入部分输入部分用来指定当前内联汇编语句的输入,每个操作数描述符由限定字符串和C语言表达式或者C语言变量组成,格式为形如“constraint”(variable)的列表。破坏描述部分有时候,我们想通知gcc当前内联汇编语句可能会对某些寄存器或内存进行修改,希望gcc在编译时能够将这一点考虑进去。那么就可以在破坏描述部分声明这些寄存器或内存。,,3.4.2编译器优化介绍,由于内

10、存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度,以上是硬件级别的优化。软件级别的优化有两种:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器和调整指令顺序充分利用CPU指令流水线等,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。,,3.4.3C语言关键字volatile,C语言关键字vola

11、tile表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取。volatile的本意是指这个值可能会在当前线程外部被改变,此时编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取。这个关键字在外设接口编程中经常会使用。,,3.4.4memory描述符,memory描述符告知gcc以下内容。不要将该段内嵌汇编指令与前面的指令重新排序。不要将变量缓存到寄存器。如果汇编指令修改了内存,但是gcc本身却察觉不到,因为在输出部分没有描述,此时就需要在修改描述部分增加memory,告诉gcc内存已经被修改,gcc得知这个信息后,就会在这段指令之前,插入必要的指令将前面因为优化Cache而到

温馨提示

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

评论

0/150

提交评论