1.07k likes | 1.35k Views
Make 工具. GNU Make 是一种常用的编译工具,通过它,程序员可以很方便地管理软件编译的内容、方式和时机,从而使程序员能够把主要精力集中在代码的编写上。 Make 自动判断源码中哪些部分有更新,重新编译这些文件并重新链接。 对于那些由许多源文件组成的大型软件项目来说,采用这种项目管理方法则可以极大地提高工作效率,让原本复杂繁琐的开发工作变得简单。. make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。 makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。
E N D
Make工具 • GNU Make是一种常用的编译工具,通过它,程序员可以很方便地管理软件编译的内容、方式和时机,从而使程序员能够把主要精力集中在代码的编写上。 • Make自动判断源码中哪些部分有更新,重新编译这些文件并重新链接。 • 对于那些由许多源文件组成的大型软件项目来说,采用这种项目管理方法则可以极大地提高工作效率,让原本复杂繁琐的开发工作变得简单。
make 工具通过一个称为makefile的文件来完成并自动维护编译工作。 • makefile需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。 • 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。
基本规则 :目标、依赖关系、指令 target : dependency …… command …… 目标(target):需要由make工具创建的项目,是指令(command)执行的结果文件(目标文件或执行文件),也可以是一个标签(Lable),如make clean、make all等。 依赖(dependency):要创建的项目依赖于哪些文件或目标。依赖条件顶格书写。指令(command):创建每个项目时make需要运行的命令(任意的Shell命令) 。指令必须使用一个TAB符(制表位)开始进行书写。 在指令部分定义的指令会在依赖文件的内容有所变更或找不到目标文件时被执行。
如果一个工程有三个源文件write.c,read.c,main.c生成可执行程序test 。 用于生成test的Makefile文件如下: -c:对源程序进行预处理、编译,产生目标文件,但不进行连接。 -o <文件名>:定义输出的执行文件名为<文件名>。
clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。 • 例如,使用名为clean标签来进行清除,可以没有依赖关系部分,即执行命令 以此来清除所有的目标文件,以便重新编译。 相当于执行了: [root@XSBase test]# make clean [root@XSBase test]# rm test main.o read.o write.o
使用vi编译器创建Makefile后,进行make,则生成执行文件test。Make将按照 Makefile中指定的依赖关系来依次执行。 [root@XSBase test]# make Makefile依赖关系
宏和标签 • 为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。 比如,我们声明一个能够表示obj文件的宏,宏名可为objects,OBJECTS,objs,OBJS,obj或 OBJ等。 • 可使用宏(Macro)功能和标签(Label)功能使Makefile的创建更为灵活。宏起到以替换指定的内容使程序简单化的作用。宏必须要在$(..)里面使用。
例:利用宏来创建Makefile。在这里宏是OBJECTS,将main.o、read.o、write.o替换为OBJECTS来使用。
预定义的宏(Pre-defined Macro) 执行make -p可看到Make中事先指定好的各个值(宏,环境参数等)。
扩展名规则 • 扩展名规则(Suffix Rule)是根据文件的扩展名来进行适当的运算操作。例如,.c一般指C源文件,.o文件是目标文件。.c文件编译后应成为.o文件。 • 在这里出现名为.SUFFIXES的宏,这个宏自动处理Makefile中需要慎重处理的文件的扩展名。 .SUFFIXES = .c .o 上面的例子对带有.c和.o扩展名的文件按照扩展名规则来处理,自动操作使.c文件编译后生成.o文件。
内部宏定义(Internal Macro) 用于简化Makefile的写法
内部宏的用法 例子一: main.o : main.c io.h gcc -c $*.c 说明:$*是没有扩展名的当前目标文件,所以$*.c扩展为main.c。 例子二: test : gcc -o $@ -c main.c 说明:$@是当前目标文件,相当于test。
例子三: .c.o : gcc -c $< test: main.o gcc -o $@ main.o 说明:如果源文件.c比目标文件.o更新,则.c文件会自动编译。即在main.o生成之后更新了main.c的话,那么main.c就会被$<自动重新编译。
myprog:main.o display.o input.o gcc main.o display.o input.o -o myprog main.o:main.c commom.h gcc -c main.c display.o:display.c display.h common.h gcc -c display.c input.o:input.c input.h common.h gcc -c input.c clean: rm -f myprog main.o display.o input.o CC=gcc OBJS=main.o display.o input.o myprog:$(OBJS) $(CC) $(OBJS) -o $@ main.o:main.c commom.h $(CC) -c $< display.o:display.c display.h common.h $(CC) -c $< input.o:input.c input.h common.h $(CC) -c $< clean: rm -f myprog $(OBJS)
实验二 Makefile • 使用命令编译程序 • 使用预定义变量编译程序 • 使用预定义变量对多个.c文件编译 • 具体练习题目详见实验指导书
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM 技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。
ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,它本身不直接从事芯片生产,靠转让设计许可,由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,它本身不直接从事芯片生产,靠转让设计许可,由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。 目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,从而使产品更容易进入市场被消费者所接受,更具有竞争力。
ARM处理器系列 下面所列的是ARM微处理器的几个系列,以及其他厂商基于ARM体系结构的处理器,这些处理器除了具有ARM体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。 ◆ ARM7系列 ◆ ARM9系列 ◆ ARM9E系列 ◆ ARMl0E系列 ◆ SecurCore系列 ◆ Intel的Xscale ◆ Intel的StrongARM
Xscale处理器 • Xscale处理器是基于ARMv5TE体系结构的解决方案,是一款性能全、性价比高、功耗低的处理器。 • 它支持16位的Thumb指令和DSP指令集,已使用在数字移动电话、个人数字助理和网络产品等场合。 • Xscale处理器是Intel目前主要推广的一款ARM微处理器。
RISC体系结构 ARM处理器实现加载/存储(load/store)体系结构是典型的RISC处理器。只有加载和存储指令可以访问存储器。数据处理指令只对寄存器的内容进行操作。
精简指令集计算机RISC(Reduced Instruction Set Computer)结构的产生是相对于传统的复杂指令集计算机CISC (Complex Instruction Set Computer)结构而言的。 传统的CISC计算机的指令集随着计算机的发展而引入了各种各样的复杂指令,使得指令集和为此要实现这些指令的计算机体系结构越来越复杂,已经不堪重负。
经过大量的研究和分析,发现在CISC的指令集中,各种指令的使用频度相差悬殊。经过大量的研究和分析,发现在CISC的指令集中,各种指令的使用频度相差悬殊。 大概有20%的指令被反复使用,使用量约占整个程序的80%;而有80%左右的指令则很少使用,其使用量约占整个程序的20%。这就是所谓的20%—80%定律。
RISC特点如下: • 指令规整、对称、简单。指令小于100条,基本寻址方式有2~3种。 • 单周期指令。 • 指令字长度一致,单拍完成,便于流水操作; • ARM7 三级流水线:取指、译码、执行; • ARM9 五级流水线; • ARMl0 六级流水线。 • 大量的寄存器。寄存器不少于32个。数据处理器的指令只对寄存器的内容操作。只有加载/存储指令可以访问存储器。
几种常用的调试方法 • 指令集模拟器 一种利用PC机端的仿真开发软件模拟调试的方法。 • 驻留监控软件 驻留监控程序运行在目标板上,PC机端调试软件可通过并口、串口、网口与之交互,以完成程序执行、存储器及寄存器读写、断点设置等任务 • JTAG仿真器 通过ARM芯片的JTAG边界扫描口与ARM核进行通信,不占用目标板的资源,是目前使用最广泛的调试手段 • 在线仿真器 使用仿真头代替目标板上的CPU,可以完全仿真ARM芯片的行为。但结构较复杂,价格昂贵,通常用于ARM硬件开发中
什么是JTAG? • JTAG是Joint Test Action Group的缩写是IEEE1149.1标准 • JTAG的建立使得集成电路固定在PCB上,只通过边界扫描便可以被测试 • 在ARM7TDMI处理器中,可以通过JTAG直接控制ARM的内部总线,IO口等信息,从而达到调试的目的
Debug主控端 运行ARM公司或第三方 提供的调试软件的PC机 协议转换器 负责转换Debug主控端发出的 高级ARM调试指令为 底层的和ARM内核通信的 处理器的开发系统 调试目标机 ARM的JTAG调试接口 1、ARM的JTAG调试结构 一个典型的ARM基于JTAG调试结构如图所示。
Debug主控(Host)通常是运行有ARM公司或者第三方提供的调式软件的PC,通常用的调试软件有ARM Debug for Window(ADW),Linux下的arm-elf-gdb等。通过这些调试软件,可以发送高级的ARM指令,比如:设置断点,读写存储器,单步跟踪,全速运行等。
协议转换器(Protocol converter)负责转换Debug主控端发出的高级ARM调式命令为底层的和ARM内核通信的JTAG命令。 Debug主控端和协议转换器之间的介质可以有很多种,比如:以太网,USB,RS-232,并口等。主控端和协议转换器之间的通信协议最典型的就是ARM公司提供的Angle标准,也可以是第三方厂家自己定义的标准。 关于Angle的协议,请参考ARM SDT和ADS,ajj公司的OpenICE32,EPI公司的Jeeni等。 Debug目标板就是指系统的调试对象。
JTAG的典型信号 • TMS: 测试模式选择(Test Mode Select),通过TMS信号控制JTAG状态机的状态 • TCK :JTAG的时钟信号 • TDI:数据输入信号 • TDO :数据输出信号 • nTRST:JTAG复位信号,复位JTAG的状态机和内部的宏单元(Macrocell)
JTAG与Angel • JTAG调试:协议转换器解释上位机传送过来的命令,通过JTAG控制ARM执行。 • Angel调试:协议转换器可以直接做为目标板的Firmware的一部分。直接执行从宿主机传送过来的调试命令;并回送相应的数据。 • Angel可以节省专门的JTAG仿真器,但是,它需要软件,或者是嵌入式操作系统的支持,做不到完全的实时仿真。而JTAG仿真是通过硬件和控制ARM的EmbeddedICE实现的,可以做到实时仿真。
数据和指令类型 • ARM采用的是32位架构。 • ARM约定: • Byte: 8 bit • Halfword: 16 bits(2 bytes) • Word: 32 bits(4 bytes) • 大部分ARM core提供: • ARM指令集(32-bit) • Thumb指令集(16-bit)
数据类型 • 字(Word) 字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位,请注意区分。 • 半字(Half-Word) 半字的长度为16位,与8位/16位处理器体系结构中字的长度一致。 • 字节(Byte) 各种处理器体系结构中,字节的长度均为8位。
ARM微处理器的工作状态 • 从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换: • ARM状态,此时处理器执行32位的字对齐的ARM指令; • Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
ARM处理器在两种工作状态之间可以切换: • 进入Thumb状态。 当操作数寄存器的状态位(地址的最低位,即位[0])为1时,执行BX指令进入Thumb状态。如果处理器在Thumb状态进入异常,则当异常处理(IRQ、FIQ、Undef、Abort 和 SWI)返回时,自动转换到Thumb状态。 • 进入ARM状态。 当操作数寄存器的状态位(位[0])为0时,执行BX指令进入ARM状态。处理器进行异常处理(IRQ、FIQ、Reset、Undef、Abort 和 SWI ARM状态执行)。在此情况下,把PC 放人异常模式链接寄存器中。从异常向量地址开始执行也可以进入ARM状态。
处理器工作模式 ARM微处理器支持7个基本工作模式,分别为: • 用户模式(User):非特权模式,大部分任务执行在这种模式,ARM处理器正常的程序执行状态。 • 快速中断模式(FIQ):当一个高优先级(fast)中断产生时将会进入这种模式,用于高速数据传输或通道处理。 • 外部中断模式(IRQ):当一个低优先级(normal)中断产生时将会进入这种模式,用于通用的中断处理。 • 管理模式(Supervisor):当复位或软中断指令执行时将会进入这种模式,操作系统使用的保护模式,系统复位后的缺省模式。
中止模式(Abort):当存取异常时将会进入这种模式。中止模式(Abort):当存取异常时将会进入这种模式。 • 1.指令中止模式:指令预取终止时进入该模式。 • 2.数据访问中止模式:当数据访问终止时进入该模式,可用于虚拟存储及存储保护。 • 指令未定义模式(Undef):当执行未定义指令时会进入这种模式,支持硬件协处理器指令的软件仿真。 • 系统模式(System):使用和User模式相同寄存器集的特权模式,运行具有特权的操作系统任务。
ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。 大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。 除用户模式以外,其余的所有6种模式称为非用户模式或特权模式(Privileged Modes); 其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
处理器启动时的模式转换图 多种特权模式变化 用户程序的运行模式 超级模式 (Supervisor) 复位后的缺省模式 一般为用户模式 User 主要完成各模式的堆栈设置,注意不要进入用户模式 处理器模式
寄存器 • ARM 的中央寄存器集是16 个用户寄存器R0 – R15。这些寄存器均是32 位宽度,R0 – R12没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。 • R13被用作堆栈指针(stack pointer,SP),保存当前处理器模式的堆栈的栈顶。 • R14被称为链接寄存器(link register,LR),保存调用子函数的返回地址。 • R15是程序计数器(program counter,PC)。其内容是处理器要取的下一条指令的地址。
ARM状态下的寄存器组织 • 程序状态寄存器: • CPSR • (current program status register) • 当前的程序状态寄存器 • SPSR • (saved program status register) • 备份的程序状态寄存器
用户的应用程序通常运行于用户模式,可访问寄存器组R0 – R15 以及CPSR。 • 为了响应诸如中断、存储器错误,或者软件中断指令之类的异常,处理器将改变运行模式。 • 当改变模式时,寄存器R0–R12 和R15 的作用不变,但R13(LR)和R14(SP)被相应模式特有的寄存器替代。 • 意味着每一个模式都有它自己的栈寄存器和链接寄存器。此外,快速中断模式(FIQ)有自己的R7–R12 寄存器,不需要将寄存器入栈就可以快速进入FIQ 中断。
除了用户模式外的所有模式都有一个额外的寄存器——“程序状态保存寄存器”(SPSR)。除了用户模式外的所有模式都有一个额外的寄存器——“程序状态保存寄存器”(SPSR)。 • 当应用程序在用户模式下运行时,如果发生了一个异常,CPU 将改变操作模式,并将CPSR 的当前内容保存到SPSR。执行完异常代码后返回时,SPSR 的内容被恢复到CPSR,以允许应用程序继续正常执行。 • ARM7 CPU 有六种用于处理异常的操作模式。由阴影标明的寄存器是当操作模式改变时使能的寄存器。SPSR 寄存器用于在改变模式时保存CPSR 的副本。
ARM微处理器共有37个32位寄存器。 • 1个用作PC • 1个用作CPSR • 5个用作SPSR • 30个为通用寄存器 • 当前处理器的模式决定着哪组寄存器可操作,任何模式都可以存取: • 相应的R0 – R12子集 • 相应的R13(SP),R14(LR) • 相应的R15(PC) • 相应的CPSR • 特权模式(除system模式)还可存取: • 相应的SPSR 6个状态寄存器
Thumb状态下和ARM状态下的R0~R7是相同的 • Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的 • Thumb状态下的SP对应于ARM状态下的R13 • Thumb状态下的LR对应于ARM状态下的R14 • Thumb状态下的程序计数器对应于ARM状态下的R15 (1) Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系