嵌入式系统应用教程第五章
合集下载
嵌入式系统及应用第五讲PPT课件
BL …… NEXT …… MOV
NEXT PC,LR
;跳转到子程序NEXT处执行 ;从子程序返回
CHANG’AN UNIVERSITY
长安大学电子与控制工程学院
嵌入式系统及其应用
7、堆栈寻址
第五讲 ARM指令寻址方式与指令系统
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专 用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 存储器堆栈可分为两种:
CHANG’AN UNIVERSITY
长安大学电子与控制工程学院
嵌入式系统及其应用
5、多寄存器寻址
第五讲 ARM指令寻址方式与指令系统
多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个 寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:
LDMIA R1!,{R2-R4,R6} ;将R1指向的单元中的数据读出到R2~R7、 R12中(R1自动加4)
MOV R1,R2
;将R2的值存入R1
SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0
R2 0xAA R1 0x55
0xAA
CHANG’AN UNIVERSITY
MOV R1,R2
长安大学电子与控制工程学院
嵌入式系统及其应用
3、寄存器间接寻址
第五讲 ARM指令寻址方式与指令系统
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所 需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的 地址指针。寄存器间接寻址指令举例如下:
LDR R0,[R2];将R2指向的存储单元的数据读出,保存在R1中
SWP R1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换
嵌入式系统教案ppt课件
不能为PC; CRn是协处置器的目的存放器,可以是C0-15; CRm是附加的目的存放器或源操作数存放器,用于区分
同一编号的不同物理存放器,当指令中不需求附加信息时 要将C0指定为CRm; OP2也提供附加信息,用于区分同一编号的不同物理存放 器,当指令中不需求附加信息时,可以省略或者将其置0。
嵌入式系统教案
武汉创维特信息技术
2021/6/24
提纲
第五章 ARM存储系统 1 ARM存储系统概述 2 ARM存储器管理单元
3 高速缓冲区和写缓冲区
4 快速上下文切换技术
ARM存储系统概述
ARM存储系统概述
与其他中低档单片机不同,ARM处置器中普通都包含一个 存储器管理部件,用于对存储器的管理。
快表的运用
更新:当CPU需求访问内存时,首先在TLB中查找需求的 地址变换条目。假设不存在那么在内存页表中查询,并把 查询的结果添加到TLB中。
去除:当内存中页表的内容改动或者运用新的页表时, TLB中的内容需求清空。CP15的存放器8用于完成该功能。
锁定:可以将一个地址变换条目锁定在TLB中,以加快访 问速度,CP15的存放器10用于完成该功能。
ARM存储器管理单元
CP15存放器列表-1
存放器编号 根本作用
0
ID编码〔只读〕
1
控制位
2
存储维护和控制
3
存储维护和控制
4
存储维护和控制
5
存储维护和控制
6
存储维护和控制
在MMU中的作用 ID码和Cache类型 各种控制位 地址转换表基地址 域访问控制位 保管 内存失效形状 内存失效地址
ARM存储器管理单元
为了顺应不同的嵌入式运用, ARM存储系统的体系构造 存在很多差别。简单的可以运用向单片机系统中运用的平 板式地址映射机制即可;而一些复杂的系统中那么能够包 含多种技术来提供功能强大的存储系统。
同一编号的不同物理存放器,当指令中不需求附加信息时 要将C0指定为CRm; OP2也提供附加信息,用于区分同一编号的不同物理存放 器,当指令中不需求附加信息时,可以省略或者将其置0。
嵌入式系统教案
武汉创维特信息技术
2021/6/24
提纲
第五章 ARM存储系统 1 ARM存储系统概述 2 ARM存储器管理单元
3 高速缓冲区和写缓冲区
4 快速上下文切换技术
ARM存储系统概述
ARM存储系统概述
与其他中低档单片机不同,ARM处置器中普通都包含一个 存储器管理部件,用于对存储器的管理。
快表的运用
更新:当CPU需求访问内存时,首先在TLB中查找需求的 地址变换条目。假设不存在那么在内存页表中查询,并把 查询的结果添加到TLB中。
去除:当内存中页表的内容改动或者运用新的页表时, TLB中的内容需求清空。CP15的存放器8用于完成该功能。
锁定:可以将一个地址变换条目锁定在TLB中,以加快访 问速度,CP15的存放器10用于完成该功能。
ARM存储器管理单元
CP15存放器列表-1
存放器编号 根本作用
0
ID编码〔只读〕
1
控制位
2
存储维护和控制
3
存储维护和控制
4
存储维护和控制
5
存储维护和控制
6
存储维护和控制
在MMU中的作用 ID码和Cache类型 各种控制位 地址转换表基地址 域访问控制位 保管 内存失效形状 内存失效地址
ARM存储器管理单元
为了顺应不同的嵌入式运用, ARM存储系统的体系构造 存在很多差别。简单的可以运用向单片机系统中运用的平 板式地址映射机制即可;而一些复杂的系统中那么能够包 含多种技术来提供功能强大的存储系统。
嵌入式系统原理及应用教程第5章GPIO
GPIO引脚的电气特性
GPIO引脚具有一些特殊的电气特性,如输入状态的电流、输出状态的电流、 高电平和低电平的电压范围等。了解这些特性对正确地使用和配置GPIO引脚 至关重要。
GPIO的寄存器编程
通过对GPIO寄存器进行编程,可以实现对GPIO引脚的控制和配置。将具体的 控制参数和配置信息写入寄存器中,可以达到控制GPIO引脚的目的。
GPIO的读写操作
GPIO的读写操作是通过读取或写入GPIO寄存器的特定位来实现的。通过读取 GPIO引脚的值可以获取外部设备的输入信息,而通过向GPIO引脚写入值可以 控制外部设备的输出状态。
GPIO的中断处理
中断是一种常用的处理外部事件的方法,GPIO可以通过中断来实现对外部设 备的响应。当外部事件发生时,系统会立即中断当前的运行,执行预定的中 断处理程序。
GPIO的应用场景介绍
GPIO广泛应用于嵌入式系统中的各种场景,比如控制LED灯的亮灭,驱动数码 管显示数字,处理按键输入,控制电机转动,读取温度传感器的数据等。这 些应用场景展示了GPIO的重要性和灵活性。GPIOFra bibliotek外设的通信方法
GPIO可以与其他外设进行通信,通过特定的通信方法,实现与外设的数据交换和控制。常见的通信方法包括串口通 信、I2C总线、SPI总线等。
嵌入式系统原理及应用教 程第5章GPIO
嵌入式系统中的通用输入输出(GPIO)是一种重要的硬件接口,本章将详细 介绍GPIO的基本概念、电气特性、寄存器编程等内容,以及它在控制LED灯、 数码管、按键输入、电机控制、温度传感器等应用实例中的作用。
GPIO基本概念及分类
GPIO是指用于嵌入式系统的通用输入输出接口。它能够通过编程控制与外部 设备进行信息的输入和输出。GPIO根据其功能和特点可以分为不同的分类。
《嵌入式系统基础教程》第09讲第5章ARM指令集特点寻址方式和指令
标志
C=1,Z=0 C=0,Z=l
N=V N!=V Z=0,N=V Z=1,N!=V 任何 ARMv3之前
含义
无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 无条件执行(指令默认条件) 该指令从不执行
2008年6月28日
《嵌入式系统基础教程》第09讲第5 章ARM指令集特点寻址方式和指令
《嵌入式系统基础教程 》第09讲第5章ARM指 令集特点寻址方式和指
令
2023/5/9
《嵌入式系统基础教程》第09讲第5 章ARM指令集特点寻址方式和指令
第5章 ARM指令集和汇编语言程序
l 本章主要介绍以下内容:
l ARM指令集的基本特点 l 与Thumb指令集的区别 l 与x86处理器的区别 l ARM指令格式
l 举例:
l SUB R1,R1,R2 ;R1-R2→R1 l MOV PC,R0 ;PC←R0,程序跳转到指定地址 l LDR R0,[R1],-R2
;读取R1地址上的存储器单元内容并存入R0, ;且R1=R1-R2,后索引偏移 l AND R0,R5,R2 ;R2中存放的是第2操作数 ;该数据属于寄存器方式的第2操作数
运算指令能够访问存储器
2008年6月28日
《嵌入式系统基础教程》第09讲第5 章ARM指令集特点寻址方式和指令
ARM指令集的编码格式
l 参看ARM指令集编码格式PDF文件
2008年6月28日
《嵌入式系统基础教程》第09讲第5 章ARM指令集特点寻址方式和指令
ARM指令集的语法
l 一条典型的ARM指令语法如下所示:
寄存器寻址
l 操作数的值在寄存器中,指令中的地址码字段指 出的是寄存器编号,指令执行时直接取出寄存器 值来操作。寄存器寻址指令举例如下:
嵌入式系统原理及应用教程第5章-精选文档
OM(1:0)=00 SROM/SDRAM (nGCS7)
2M/4M/8M/16M /32M/64M/128M 2M/4M/8M/16M /32M/64M/128M 128M
SROM/SDRAM (nGCS6)
SROM (nGCS5)
SROM (nGCS4) SROM/SDRAM (nGCS3) SROM (nGCS2) SROM (nGCS1) SROM (nGCS0)
5.1.1 存储器控制器
S3C2440A片内集成了存储器控制器,提供了访问存储器所需 的全部控制信号。 1.外部存储空间特点
S3C2440A芯片外部可寻址的存储空间是1GB,被分成8个存储 模块,每块128MB。如图5-1所示。
5.1.1 存储器控制器
0x40000_0000 0x3800_0000 0x3000_0000 0x2800_0000 0x2000_0000 0x1800_0000 0x1000_0000 0x800_0000 OM(1:0)=01,10 SROM/SDRAM (nGCS7) SROM/SDRAM (nGCS6)
0x3040 _0000 0x307f 0ff _ffff
0x3100 _0000 0x31ff _ffff
0x3200 _0000 0x33ff _ffff
0x340 0 _0000 0x37ff _ffff
0x3800 _0000 0x3fff _ffff
0x303f _ffff
0x3000 _0000
0x307f _ffff
0x3000 _0000
0x30ff _ffff
0x3000 _0000
0x31ff _ffff
0x3000 _0000
嵌入式课件第五章
9
4、调试和优化选项 调试选项有很多,它们在目标代码中 加入调试信息,便于调试器对源程序进行 调试。 -g 获得有关调试程序的详细信息,可 以利用这些信息使用GDB调试器进行调试; 有些编译器该选项不能与-O选项一起使用。 优化选项用于缩减代码规模和提高代码 执行效率。
10
常用的优化选项有: -O 编译器会尽量缩减代码规模和执行时间, 这会导致编译过程耗费更多的时间和内存;编译 器还会适当地增加寄存器变量的使用。 -O2 进一步的优化,编译器几乎执行所有不 涉及时空效率的优化,但编译器不进行循环展开、 函数内联和寄存器改名等优化。 -O3 在-O2的基础上加入了函数内联和寄存 器改名两项优化。 -Os 基于空间的优化。执行-O2中不会明显 增加代码规模的优化以及另外一些可缩减代码规 模的优化。
17
Makefile文件中的每条规则形式: target:prereq1 prereq2 prereq3… command … 其中, target是本条规则的目标,也就是Makefile规则的 名字,即生成的文件名或特殊目标。 prereq1,prereq2,prereq3…指明此目标文件所 依赖的文件或其它目标,一个target可以有多个依 赖文件,因而通常是一个列表。 command指明本条规则需要执行的命令或命令列 表。make命令在处理一条规则时,将依次执行这 条规则的所有命令。这些命令由shell来解释执行。 需要注意的是,每个command命令行必须是以 Tab开头,否则,make命令无法区别command和 其他行。
14
5.2 GNU make 与Makefile编写
在编写小型的Linux应用程序时,由于源程序 只有几个,且它们之间的包含和引用关系容易理 清,所以只要使用gcc就可以解决;但是对于大型 的Linux应用程序,由于源程序非常多,且它们之 间的包含和引用关系很复杂,再靠单纯的手工管 理就很困难了;例如,有一个几百个源文件构成 的项目,如果其中只有一个或少数几个源文件进 行了修改,程序员就不得不将所有的源文件重新 编译一遍,因为gcc编译器并不知道哪些源文件是 最近更新的,而只知道需要包含这些源文件才能 编译成可执行文件,于是,程序员需要重新输入 数目如此庞大的文件名以完成最后的编译工作。
4、调试和优化选项 调试选项有很多,它们在目标代码中 加入调试信息,便于调试器对源程序进行 调试。 -g 获得有关调试程序的详细信息,可 以利用这些信息使用GDB调试器进行调试; 有些编译器该选项不能与-O选项一起使用。 优化选项用于缩减代码规模和提高代码 执行效率。
10
常用的优化选项有: -O 编译器会尽量缩减代码规模和执行时间, 这会导致编译过程耗费更多的时间和内存;编译 器还会适当地增加寄存器变量的使用。 -O2 进一步的优化,编译器几乎执行所有不 涉及时空效率的优化,但编译器不进行循环展开、 函数内联和寄存器改名等优化。 -O3 在-O2的基础上加入了函数内联和寄存 器改名两项优化。 -Os 基于空间的优化。执行-O2中不会明显 增加代码规模的优化以及另外一些可缩减代码规 模的优化。
17
Makefile文件中的每条规则形式: target:prereq1 prereq2 prereq3… command … 其中, target是本条规则的目标,也就是Makefile规则的 名字,即生成的文件名或特殊目标。 prereq1,prereq2,prereq3…指明此目标文件所 依赖的文件或其它目标,一个target可以有多个依 赖文件,因而通常是一个列表。 command指明本条规则需要执行的命令或命令列 表。make命令在处理一条规则时,将依次执行这 条规则的所有命令。这些命令由shell来解释执行。 需要注意的是,每个command命令行必须是以 Tab开头,否则,make命令无法区别command和 其他行。
14
5.2 GNU make 与Makefile编写
在编写小型的Linux应用程序时,由于源程序 只有几个,且它们之间的包含和引用关系容易理 清,所以只要使用gcc就可以解决;但是对于大型 的Linux应用程序,由于源程序非常多,且它们之 间的包含和引用关系很复杂,再靠单纯的手工管 理就很困难了;例如,有一个几百个源文件构成 的项目,如果其中只有一个或少数几个源文件进 行了修改,程序员就不得不将所有的源文件重新 编译一遍,因为gcc编译器并不知道哪些源文件是 最近更新的,而只知道需要包含这些源文件才能 编译成可执行文件,于是,程序员需要重新输入 数目如此庞大的文件名以完成最后的编译工作。
嵌入式系统 第5章 uCOS操作系统的应用PPT课件
三菱公司
M16和M32
摩托罗拉公司
PowerPC,
飞利浦公司
XA
西门子公司
80C166和TriCore
TI公司
TMS320
Zilog公司
Z—80 和Z—180
2
μC/OS-II意为“微控制器操作系统版本2”。 世界上已有数千人在各个领域使用μC/OS, 例如,照相机行业、医疗器械、音响设施、 发动机控制、网络设备、高速公路电话系统、 自动提款机、工业机器人等等。很多高等院 校将μC/OS用于实时系统教学。
5.可剥夺型(Preemptive),µC/OS-Ⅱ是完全可剥 夺型的实时内核,运行就绪条件下优先级最高的任务。
6.多任务,µC/OS-Ⅱ可管理64个任务。一般情况下, 建议用户保留8个任务给µC/OS-Ⅱ。这样,留给用户 应用程序的任务最多可有56个。系统赋给每个任务的优 先级必须不同,这意味着µC/OS-Ⅱ不支持时间片轮转 调度法(Round-robin Scheduling)。
①任务延时函数OSTimeDIy()
调用该函数会使µC/OS-Ⅱ进行一次任务调度,并且执行下 一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一 旦规定的时间期满或者有其他任务通过调用 OSTimeDlyResume()取消了延时,它就会立即进入就绪状态。 只有当该任务在所有就绪任务中具有最高的优先级时,它才会立 即运行。
Ⅱ的每一种功能、每一个函数及每一行代码都经过了考
验与测试。
11
5.1.2 µC/OS-Ⅱ系统的内核结构
与其他操作系统不同,µC/OS-Ⅱ其实只有一个内 核,提供任务调度、任务间的通信与同步、任务管理、 时间管理和内存管理等基本功能。
1) 任务
《嵌入式实时操作系统uC OS-2教程》课件第5章
第5章 事件控制块
5.4 在等待事件的任务列表中查找 优先级最高的任务
当事件发生后,由于可能有一个或者多个任务在等待该 事件,因此就要在事件的任务等待列表中查找优先级最高的 任务。为了提高查找速度,查找的方法不是从 .OSEvent Tbl[0]开始逐个查询,而是采用了查表的办法,这个表是 OS_CORE.C文件中的定义的OSUnMapTbl[256],其内容如 程序清单5.4所示。在等待事件的任务列表中查找优先级最 高的任务具体实现算法如下:
};
第5章 事件控制块
程序清单5.5 在等待事件的任务列表中查找优先级最高的任 务的代码 y = OSUnMapTbl[pevent->OSEventGrp]; x = OSUnMapTbl[pevent->OSEventTbl[y]]; prio = (y<<3) + x;
(3) 计算最高优先级:Prio = y × 8 + x 这样,最终就可以得到处于等待该事件状态的最高优先 级任务了,其代码如程序清单5.5所示。
第5章 事件控制块
程序清单5.4 OSUnMapTbl[]的内容 INT8U const OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x00 to 0x0F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x10 to 0x1F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x20 to 0x2F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x30 to 0x3F 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x40 to 0x4F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x50 to 0x5F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x60 to 0x6F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0x70 to 0x7F
嵌入式系统第五章
注:如果需要使用标准C库函数,则要在Linktype 中选 择 Scattered ,系统使用配置文件进行配置,仅使用汇 编语言时选择simple。
(5)如果在上一步选择了Scattered连接,在 ARM C Compiler下ATPCS选项卡中选择ARM/Thump interwork.
(6)如果在上一步选择了Simple连接,在Layout 选项卡在Place at beginning of image框内 设置程序的入口模块及段。
这样,以后工程所生成的目标文件与可执行文件存 放在工程文件夹的Debug子目录中。
(3)在DebugSettings对话框中选择TargetSettings 项,在Link一栏中选择 ARMLINK,在Post-linker 一栏中选择ARM from ELF。
(4)在Debug Settings对话框中选择ARM LINK项,在Output 选项卡的Linktype中选择Simple,在Simple image框中设 置连接的Read-Only(只读)和Read-Write(读写)地址。 这两个地址确定了存放程序代码的区间。
5.5.2 工程文件与源文件的建立
使用ADS1.2 集成开发环境的Code Warrior子 环境可以建立ARM 汇编语言源文件、C语言 源文件,C++源文件,而且解决同一应用问题 的关联文件可以放在一个工程文件中,工程文 件中的多个文件可以连接在一起形成一个可执 行文件。
1. 新建工程文件与源文件的步骤如下:
(3)选择Processor Views下拉菜单的Registers项打开 寄存器观察窗口,选择 Memorys打开 寄存器观察窗口。
(4)选择Excute下拉菜单的Step可进行单步运行,选 择Go可进行连续运行。
-嵌入式系统及应用-PPT精选
while (1)
{
printf("%4u: ***** Test Task 11 *****\n", OSTime);
OSTimeDly(1);
}
7
}
电子科技大学嵌入式软件工程中心
void TestTask2(void *pdata)
{ while (1) { printf("%4u: ***** Test Task 22 *****\n", OSTime);
嵌入式系统及应用
第五章 任务管理与调度
1
电子科技大学嵌入式软件工程中心
主要内容
• 任务简介 • 任务控制块 • 任务管理 • 任务调度 • 优先级反转
2
电子科技大学嵌入式软件工程中心
第一节
任务
任务的定义及其主要特性 任务的内容 任务的分类 任务参数
3
电子科技大学嵌入式软件工程中心
• 在嵌入式实时系统中任务是操作系统内核调度 的基本单位。
}
需注意:任务代码不是真的删除了,只是内核简 单地不会再这个任务,这个任务的代码也不会再 运行了。
6
电子科技大学嵌入式软件工程中心
uC/OS的任务实例
int main(void)
{ // 初始化 uCOS内核.
OSInit();
// 在开始多任务之前必须先建立一个任务
OSTaskCreate(TestTask1, (void *) 11, &TestTaskStk1[TASK_STK_SIZE], 11); //第1个参数是指向该任务运行代码的指针,第2个参数是一个指向任务初始化数据的指针, //第3个参数是任务的堆栈起始地址(高地址向低地址增长), //第4个参数是任务的优先级,数值越小,优先级越高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.1 GCC
5.1.2 GCC的使用
-lname:ld链接程序链接函数库文件“libname.a”。ld链接程序会 自动链接常用的函数库文件,对于一些特殊的函数库文件,例如 “libpthread.a”,和用户自定义的函数库文件需要使用该参数。
-v:显示编译器调用的程序及版本信息。
--version:显示版本信息。
5.1 GCC
5.1.2 GCC的使用
-O:对编译、链接过程进行优化,产生的可执行代码的执行效率可 以提高,但是速度会慢一些。 -O2:比-O更好的优化,但过程会更慢。 -E:仅作预处理,处理结果在标准输出设备(显示器)输出。 -M:输出文件之间的依赖关系,通常为make程序所需要。 -MM:输出文件之间的依赖关系,但不包括头文件,通常为make程 序所需要。 -S:编译到汇编语言。 -Wall:编译时显示警告信息。 -Idirname :当源程序中出现“ #include “myh.h””语句时, cpp预处理程序查找头文件“myh.h”的顺序为当前目录、dirname目 录、系统预设目录(一般为/usr/include)。 -Ldirname : ld 链接程序查找函数库文件的顺序为 dirname 目录, 系统预设目录(一般为/usr/lib)。
表5-1 GCC所支持的文件名后缀
文件名后缀
文件类型 C语言源程序文件 由目标文件构成的档案库文件
.C或.cc或.cxx
.h .i
C++源程序文件
头文件 已经预处理过的C源程序文件
.ii
.m .o
已经预处理过的C++源程序文件
Object C源程序文件 编译后的目标文件
.s
.S
汇编语言源程序文件
已经预处理过的汇编语言源程序文件
并以实例演示了make工具的使用。
目录 5.1 GCC
5.2 GDB
5.3 make工具 本章习题5.1 GCC5.1.1 GCC介绍
GCC是GNU开源社区的一个编译器项目,最初只能编 译C语言程序,是GNU C Compiler 的英文缩写。GNU是 “ GNU’s Not Unix” 的 递 归 缩 写 , 是 由 Richard Stallman 在 1983 年 9 月发起成立的一个开源社区,其目标 是创建一套完全自由的操作系统。目前Linux中的许多软件 来源于GNU,如Emacs、GCC等。 随着众多开源爱好者对GCC功能的不断扩展和完善,如 今的GCC能够完成对多种编程语言编写的程序的编译,包括 C 、 C++ 、 Ada 、 Object C 、 Java 、 Fortran 等,因此, GCC 的 含 义 也 由 原 来 的 GNU C Compiler 变 为 GNU Compiler Collection,也就是GNU编译器家族的含义。
5.1 GCC
5.1.3 使用举例
gcc –c a.c b.c //分别编译源程序文件a.c和b.c,生成目标文件a.o和b.o。 gcc –o ab a.o b.o //将目标文件a.o和b.o进行链接,生成可执行文件ab。 gcc –Wall –o my my.c //编译并链接源程序文件my.c,生成可执行文件my,并显示编译时的警 告信息。 gcc –E test.c //对源程序文件test.c进行预处理,结果显示在屏幕上。 gcc –S test.c //将源程序文件test.c进行编译,生成汇编文件test.s。 gcc –g –o test test.c //编译并链接源程序文件test.c,生成可执行文件 test,并同时生成调试执行时的符号信息。 gcc –lpthread –o thread thread.c //编译并链接源程序文件thread.c, 生成可执行文件thread,链接时链接“libpthread.a”函数库。
5.1 GCC
5.1.1 GCC介绍
在Linux系统中,一般不通过文件名的后缀来区分文 件,但 GCC 通过文件名的后缀来区分文件,因此,使用 GCC 编译文件时要按照 GCC 的要求,给文件名加上相应 的后缀。GCC所支持的文件名后缀如表5-1所示
5.1 GCC
5.1.1 GCC介绍
.c .a
5.1 GCC
5.1.2 GCC的使用
GCC 在 使 用 时 需 要 给 出 参 数 来 执 行 相 应 的 功 能 , GCC的参数大约有100多个,其中大多数的参数不经常使用, 本书仅介绍常用的几个参数,想全面了解 GCC 参数的读者 可参阅专门的GCC手册。
GCC的用法为:gcc [参数] 文件列表,常用的参数含义如下:
-c :编译生成以 .o 为后缀的目标文件,不生成可执行文件。当一个程 序的代码分布在不同文件中时,经常使用该参数对这些文件进行单独 编译,然后对产生的所有以 .o 为后缀的目标文件进行链接,生成可执 行文件。 -o:该参数后面跟要生成的可执行文件的名称,该参数缺省时生成的 可执行文件名称为a.out。 -g:生成符号调试工具(GNU的GDB)所需要的符号信息,要想使 用GDB对可执行程序进行调试执行,必须加入这个参数。
第5章 Linux下C语言编程
本章首先介绍Linux系统下常用的C语言编译工具 GCC,对GCC常用的参数进行了详细说明,并进行了举 例;随后介绍了C语言调试工具GDB,列举了调试命令及 其功能,并以实例说明了GDB的用法;最后介绍了C语言
项目管理工具make,说明了makefile文件的编写语法,
5.1 GCC
5.1.1 GCC介绍
GCC 将源代码程序转变为可执行程序的过程分为四个 相互关联的步骤:预处理(也称预编译, Preprocessing )、 编 译 ( Compilation ) 、 汇 编 ( Assembly ) 和 链 接 (Linking)。GCC首先调用cpp进行预处理,对源代码文件 中的文件包含(include)、预编译语句(如宏定义define等) 进行宏替换处理;接着调用 ccl进行编译,生成以.o为后缀的 目标文件;汇编过程是针对源代码中汇编语言代码的步骤, 调用 as 将以 .S 和 .s 为后缀的汇编语言源代码文件进行汇编之 后生成以 .o 为后缀的目标文件;当所有的目标文件都生成之 后,GCC就调用ld来完成链接,在链接阶段,所有的目标文 件被安排在可执行程序中的恰当的位置,同时,程序中所调 用到的库函数也从各自所在的函数库中链接到适当的地方。