嵌入式系统复习资料_第1页
嵌入式系统复习资料_第2页
嵌入式系统复习资料_第3页
嵌入式系统复习资料_第4页
嵌入式系统复习资料_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

ARM嵌入式系统期末复习IEEE(国际电气和电子工程师协会)的定义:

嵌入式系统是“用于控制、监视或者辅助操作的机器和设备的装置”。从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪,能适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。从系统的角度定义:嵌入式系统是设计以完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。一个系统中可以共存多个嵌入式系统。嵌入式系统的概念◆

微控制器(MCU)(MicroControllerUnit)

微处理器(MPU)(EmbeddedMicroProcessorUnit)

数字信号处理器(DSP)(DigitalSignalProcessor)

混合处理器和片上系统(SOC)(SystemOnChip)

可编程片上系统(SOPC)(SystemOnProgrammableChip) 嵌入式微处理器主要分类2023/2/3嵌入式系统的应用领域嵌入式系统作为一个热门的技术,涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术。

嵌入式的应用更是涉及通讯设备、移动终端、智能家居、物联网、汽车电子、工业控制、医疗、航天、军事等各个领域,甚至一些学者断言嵌入式技术将成为后PC时代的主宰。2023/2/32023/2/3

按照实时性分操作系统嵌入式操作系统分为实时操作系统和非实时操作系统。下面主要讲实时操作系统的概念。嵌入式操作系统非实时操作系统实时操作系统硬实时操作系统软实时操作系统实时操作系统

实时系统是由事件驱动的,能对外部事件在限定的时间范围内作出响应。响应时间要有保证。对外部事件的响应包括: (1)事件发生时要识别出来 (2)在给定时间约束内必须输出正确的结果

实时系统强调的是实时性、可靠性和灵活性,与实时应用软件相结合成为有机的整体起着核心作用,由它来管理和协调各项工作,为应用软件提供良好的运行软件环境及开发环境。2023/2/3实时操作系统又分为:硬实时系统: 对系统响应时间有严格的要求,如果系统响应时间不能满足,就会引起系统崩溃或致命的错误。软实时系统:对系统响应时间有要求,但是如果系统响应时间不能满足,它并不会导致系统出现致命的错误或崩溃,只是降低系统的吞吐量。几种主流的嵌入式操作系统FreeRTOS:开源免费的轻量级实时系统µCos-II:源码开放(商业收费)、面向中小型嵌入式系统应用。Linux:嵌入式Linux具有一些独特的优势:层次结构及

内核完全开放;强大的网络支持功能;具备一整套开发工具链;广泛的硬件支持特性。WinCE:它是微软针对个人电脑以外的电脑产品所研发的嵌入式操作系统,支持具有丰富应用程序和服务。Vxworks:美国WindRiver公司于1983年开发,具有可靠、实时、可裁减特性。QNX:主要用于汽车电子的实时系统Android

嵌入式系统软件层次一个嵌入式系统从软件角度来看分为四个层次:

1.引导加载程序包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。

2.Linux内核特定嵌入式平台定制的内核及内核的启动参数。设备驱动程序是可装入的内核模块。

3.文件系统包括根文件系统和建立于Flash内存设备之上的文件系统。

4.用户应用程序特定用户的应用程序。嵌入式系统的最小系统嵌入式控制器时钟系统调试测试接口复位及其配置系统存储器系统供电系统(电源)最小系统ARM7系列

ARM7采用冯·诺依曼(Von-Neumann)存储结构,数据存储器和程序存储器使用同一存储空间,用相同的指令访问。冯·诺依曼结构也被大多数计算机所采用。

ARM7为三级流水线结构(取指令,指令译码,指令执行),平均功耗为0.6mW/MHz,时钟速度为66MHz,每条指令平均执行1.9个时钟周期。取指译码执行ARM7多数不支持MMU。2023/2/3ARM9系列ARM9采用哈佛(Harvard)存储结构,程序存储器与数据存储器分开,提供了较大的存储器带宽。ARM9为五级流水(取指,译码,执行,缓冲/数据,回写),平均功耗为0.7mW/MHz。时钟速度为120MHz-200MHz,每条指令平均执行1.5个时钟周期。32位AMBA总线接口的MMU支持;2023/2/3从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:ARM状态,此时处理器执行32位的字对齐的ARM指令;Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。

对于ARM9处理器有两种工作状态和7种工作模式。1.ARM9处理器的两种工作状态3ARM工作状态和工作模式2023/2/3处理器模式说明备注

用户(usr)正常程序工作模式正常的程序执行状态,不能直接切换到其它模式

系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权,供需要访问系统资源的操作系统任务使用

快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式,用于高速数据传输或通道处理

中断(irq)用于通用中断处理IRQ异常响应时进入此模式,用于通用的中断处理

管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式,供操作系统使用的一种保护模式

中止(abt)用于支持虚拟内存和/或存储器保护当存取异常时将会进入这种模式,用于支持虚拟内存和存储器保护

未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式,软件仿真硬件协处理器3ARM工作状态和工作模式特权模式处理器模式说明备注

用户(usr)正常程序工作模式不能直接切换到其它模式

系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权

快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式

中断(irq)用于通用中断处理IRQ异常响应时进入此模式

管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式

中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处

未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式

除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。

未定义(und)

中止(abt)

管理(svc)

中断(irq)

快中断(fiq)

系统(sys)3ARM工作状态和工作模式异常模式处理器模式说明备注

用户(usr)正常程序工作模式不能直接切换到其它模式

系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权

快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式

中断(irq)用于通用中断处理IRQ异常响应时进入此模式

管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式

中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处

未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式

未定义(und)

中止(abt)

管理(svc)

中断(irq)

快中断(fiq)

这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。3ARM工作状态和工作模式用户和系统模式处理器模式说明备注

用户(usr)正常程序工作模式不能直接切换到其它模式

系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权

快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式

中断(irq)用于通用中断处理IRQ异常响应时进入此模式

管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式

中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处

未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式

这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

系统(sys)

用户(usr)3ARM工作状态和工作模式管理模式(svc)的进入方式和处理内容: ①系统上电复位后进入管理模式,运行系统初始化程序,如中断允许/禁止,主时钟设置,SDRAM配置,各个功能模块初始化等。 ②当执行软件中断指令SWI指令时,进入管理模式。处理器启动时的模式转换图:管理模式(Supervisor)多种特权模式变化用户程序的运行模式复位后的缺省模式主要完成各模式的堆栈设置,注意不要进入用户模式一般为用户模式User2023/2/3ARM内部寄存器ARM9微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的(对应模式下的)。

寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_svcSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM状态各模式下的寄存器2023/2/3ARM状态下的寄存器组织通用寄存器:通用寄存器包括R0~R15,可以分为三类:未分组寄存器R0~R7分组寄存器R8~R14程序计数器PC(R15)未分组寄存器R0~R7

在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,是真正的通用寄存器。 因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。2023/2/3分组寄存器R8~R12每次所访问的物理寄存器与处理器当前的运行模式有关R8~R12:每个寄存器对应两个不同的物理寄存器当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM状态各模式下的寄存器2023/2/3分组寄存器R13~R14R13(SP)、R14(LR):每个寄存器对应6个不同的物理寄存器其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式采用以下的记号来区分不同的物理寄存器:R13_<mode>R14_<mode>mode为以下几种之一:usr、fiq、irq、svc、abt、und。2023/2/3堆栈指针—R13R13在ARM指令中常用作堆栈指针SP,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针SP。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在初始化部分,都要初始化每种模式下的R13,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复。子程序连接寄存器—R14R14也称作子程序连接寄存器或连接寄存器LR。当执行BL指令调用子程序时,R14复制R15(程序计数器PC)以备份。其他情况下,R14用作通用寄存器。R14寄存器与异常发生,异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。将对应的异常模式下的R14设置为异常返回地址(有些异常有一个小的固定偏移量)子程序连接寄存器—R14在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。 BL SUB1 …… SUB1: STMFD SP!,{<regs>,LR}/*将R14存入堆栈*/ …… LDMFD SP!,{<regs>,PC}/*完成子程序返回*/Lable程序A程序BR14BLLable地址A???MOVPC,LRR14(地址A)Lable???2023/2/3程序计数器PC(R15)R15(PC)指向正在取指的地址。可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的方式超出了这些限制,那么结果将是不可预测的。由于ARM9体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前执行指令的下两条指令的地址,即PC的值为当前指令的地址值加8,也即PC指向正在取指的地址。ARM状态下,位[1:0]为0,位[31:2]用于保存PC;Thumb状态下,位[0]为0,位[31:1]用于保存PC;读R15的限制

正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。LDRR0,PC??????PCPC-4PC-8正在执行正在译码正在取指流水线状态地址程序代码寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM状态各模式下的寄存器 在ARM微处理器中,有CPSR和SPSR两种程序状态寄存器。1、当前程序状态寄存器CPSR(CurrentProgramStatusRegister)用来保存当前程序状态的寄存器。所有模式共用同一个CPSR。2、保存(备份)程序状态寄存器SPSR_mode

(SavedProgramStatusRegister) SPSR_mode用来进行异常处理,其功能包括: ─保存ALU中的当前操作信息 当异常发生时,用来保存CPSR的值,从异常返回时,将

SPSR_mode复制到CPSR中,恢复CPSR的值。 ─控制允许和禁止中断 修改SPSR的值 ─设置处理器的运行模式 修改SPSR的值注意:如果通过程序修改CPSR寄存器中的模式位进入异常模式,那么硬件将不会把CPSR保存至SPSR中。

程序状态寄存器(PSR)寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM状态各模式下的寄存器2023/2/3程序状态寄存器CPSR的每一位的安排

2023/2/3标志位含

义NNegativelessthan,当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零;ZZero,Z=1表示运算的结果为零(通常表示比较结果“相等”);Z=0表示运算的结果为非零;CCarry/Borrow/Extend加法运算结果进位时(包括CMN指令),C=1;减法运算借位时,C=0;移位操作的非加/减运算指令,C为从最高位最后移出的值;其他的非加/减运算指令,C的值通常不改变。VOverflow加/减法运算指令,V=1表示符号位溢出。对于其他的非加/减运算指令,C的值通常不改变。QQ标志指示DSP运算指令是否溢出。3130292827…876543210NZCV(保留)IFTM4M3M2M1M02023/2/3 CPSR的最低8位为控制位,当发生异常时,这些位被硬件改变。当处理器处于一个特权模式时,可用软件操作这些位。中断禁止位I、F:(I--IRQdisable,F—FIQdisable)I=1禁止IRQ中断;

I=0允许IRQ中断F=1禁止FIQ中断;

F=0允许FIQ中断T标志位(Statebit):该位反映处理器的运行状态T=1时,程序运行于Thumb状态T=0时,程序运行于ARM状态

运行模式位M[4:0]是模式位,决定处理器的运行模式

3130292827…876543210NZCV(保留)IFTM4M3M2M1M0CPSR(当前程序状态寄存器)的低5位用于定义当前操作模式:处理器运行模式及可以访问的寄存器3130292827…876543210NZCV(保留)IFTM4M3M2M1M0ARM异常简介

只要正常的程序流被暂时中止,处理器就进入异常模式,如果同时发生两个或更多异常,那么将按照异常的优先级来处理异常。

在ARM中共有7种异常:异常模式向量表偏移复位(reset)SVC(管理模式)+0x00(优先级最高)未定义指令UND(未定义模式)+0x04软件中断(SWI)SVC(管理模式)+0x08预取指终止ABT(中止模式)+0x0c数据终止ABT(中止模式)+0x10未分配--+0x14IRQIRQ(中断模式)+0x18FIQ

FIQ(快速中断模式)+0x1cARM指令系统

寻址方式是处理器执行指令时寻找真实操作数地址的方式。ARM处理器支持9种基本寻址方式寻址方式分类

寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址; 2.立即寻址;3.寄存器移位寻址; 4.寄存器间接寻址;5.基址寻址; 6.多寄存器寻址;7.堆栈寻址; 8.块拷贝寻址;9.相对寻址。

操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2 ;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0

0xAA0x55R2R1寻址方式分类——寄存器寻址MOVR1,R20xAA

立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位;R0=R0-#1;MOV R0,#0xFF;将立即数0xFF装入R0寄存器

寻址方式分类——立即寻址

寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOV R0,R2,LSL#3 ;R2的值左移3位,结果放入R0,即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“与”操作,结果放入R10x55R0R20x01寻址方式分类——寄存器移位寻址MOVR0,R2,LSL#30x080x08逻辑左移3位

寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDR R1,[R2] ;将R2指向的存储单元的数据读出;将其保存在R1中SWP R1,R1,[R2] ;将寄存器R1的值和R2指向的存储单元的内容交换0x55R0R20x400000000xAA0x40000000寻址方式分类——寄存器间接寻址LDRR0,[R2]0xAA

基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元的内容,存入R2。STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值保存到R0指定的存储单元寻址方式分类——基址寻址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据

多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,{R2-R7,R12};

[R1]->R2,[R1+4]->R3,[R1+8]->R4等(R1自动加1)。STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保存到R0指向的存储;单元中(R0自动加1)。注:ARM指令中{!},为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器地址寻址方式分类——多寄存器寻址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000010

堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针SP,R13)指向一块存储区域(堆栈),SP指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈寻址方式分类——堆栈寻址寻址方式分类——堆栈寻址栈底(低地址)栈顶栈区SP堆栈存储区(低地址)栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈满堆栈是指堆栈指针指向堆栈的最后一个已使用的地址;空堆栈是指堆栈指针指向下一个待压入数据的空位置。 ARM体系结构使用多寄存器指令load-store来完成堆栈操作。在指令上加上后缀FA、FD、EA、ED(F-满位置,E-空位置,A-递增,D-递减)来表示sp指针的寻址方式,如FA表示满递增。寻址方式分类——堆栈寻址可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向含有有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向含有有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类——堆栈寻址

多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。块拷贝寻址与堆栈寻址有所类似。两者的区别在于:堆栈寻址中数据的存取是面向堆栈的,块拷贝寻址中数据的存取是面向寄存器指向的存储单元的.在块拷贝寻址方式中,基址寄存器传送一个数据后有4种增长方式,即:IA:每次传送后地址增加4;(IncrementAfterOperating)IB:每次传送前的地址增加4;(IncrementBeforeOperating)DA:每次传送后地址减少4;(DecrementAfterOperating)DB:每次传送前地址减少4。(DecrementBeforeOperating)寻址方式分类——块拷贝寻址STMIA

R0!,{R1—R7,R9,R11};将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后增加4,向上增长。R0作为基址寄存器。STMIB

R0!,{R1—R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加4,向上增长。R0作为基址寄存器。STMDA

!,{R1—R7};将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后减少4,向下减少。R0作为基址寄存器。STMDB

!,{R1—R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前减少4,向下减少。R0作为基址寄存器。注:ARM指令中{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

ARM指令中{^}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:

BL SUBR1 ;调用到SUBR1子程序

BEQ LOOP ;条件跳转到LOOP标号处

...LOOP MOV R6,#1 ...SUBR1 ...寻址方式分类——相对寻址BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←label,切换处理器状态BX{cond}ARM指令——分支指令

带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行助记符说明操作条件码位置MOVRd,operand2数据传送Rd←operand2MOV{cond}{S}MVNRd,operand2数据非传送Rd←(~operand2)MVN{cond}{S}ARM数据处理指令——数据传送

MOV指令将8位立即数或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。指令格式如下:MOV{cond}{S}Rd,operand2

MOV指令举例如下:

MOV R1,#0x10 ;R1=0x10

MOV R0,R1 ;R0=R1

MOVS R3,R1,LSL#2 ;R3=(R1<<2),并影响标志位

MOV PC,LR ;PC=LR,子程序返回

助记符说明操作条件码位置ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2带进位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2带进位逆向减法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}ARM数据处理指令——算术运算

加法运算指令——ADD指令将operand2的值与Rn的值相加,结果保存到Rd寄存器。指令格式如下:ADD{cond}{S}Rd,Rn,operand2

应用示例:

ADDSR1,R1,#1 ;R1=R1+1,并影响标志位

ADDR1,R1,R2 ;R1=R1+R2

助记符说明操作条件码位置ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2带进位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2带进位逆向减法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存到Rd中。指令格式如下:SUB{cond}{S}Rd,Rn,operand2

应用示例:

SUBS R0,R0,#1 ;R0=R0-1,并影响标志位

SUBS R2,R1,R2 ;R2=R1-R2

,并影响标志位

ARM数据处理指令——算术运算助记符说明操作条件码位置ANDRd,Rn,operand2逻辑与操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2逻辑或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2逻辑异或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}ARM数据处理指令——逻辑运算指令

逻辑或操作指令——ORR指令将operand2的值与寄存器Rn的值按位作逻辑“或”操作,结果保存到Rd中。指令格式如下:ORR{cond}{S}Rd,Rn,operand2

应用示例:

MOV R1,R2,LSR#24 ;使用ORR指令将R2的高8位

ORR R3,R1,R3,LSL#8

;移入到R3低8位中注:LSL为逻辑左移;LSR为逻辑右移。助记符说明操作条件码位置ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2带进位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2带进位逆向减法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

带进位加法指令——ADC将operand2的值与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下:ADC{cond}{S}Rd,Rn,operand2应用示例(使用ADC实现64位加法,结果存于R1、R0中):

ADDSR0,R0,R2 ;R0等于低32位相加,并影响标志位

ADCR1,R1,R3

;R1等于高32位相加,并加上低位进位ARM数据处理指令——算术运算助记符说明操作条件码位置ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2带进位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2带进位逆向减法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

带进位减法指令——SBC用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的非(减法运算借位,则C=0),结果保存到Rd中。Rd=Rn-operand2-(C!)SBC{cond}{S}Rd,Rn,operand2应用示例(使用SBC实现64位减法,结果存于R1、R0中):

SUBSR0,R0,R2 ;低32位相减,并影响标志位

SBCR1,R1,R3

;高32位相减,并减去低位借位ARM数据处理指令——算术运算ARM数据处理指令——比较指令

比较指令——CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:CMP{cond} Rn,operand2

应用示例:

CMP R1,#10

;R1与10比较,设置相关标志位注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作。助记符说明操作条件码位置CMPRn,operand2比较指令标志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2负数比较指令标志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位测试指令标志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等测试指令标志N、Z、C、V←Rn^operand2TEQ{cond}2023/2/3ARM汇编语言程序实例

例:编写一具有完整汇编格式的程序,实现冒泡法排序功能。设无符号字数据存放在从0x400004开始的区域,字数据的数目字存放在0x400000中。AREASORT,CODE,READONLY ENTRYSTART

MOVR0,#0x400000

MOV R1,[R0]LOOP SUBS R1,R1,#1 BEQ EXIT MOV R7,R1 LDR R0,=0x400004LOOP1 LDR R2,[R0],#4 LDR R3,[R0] CMP R2,R3

STRLOR3,[R0,#-4] STRLOR2,[R0] SUBSR7,R7,#1 BNE LOOP1 B LOOPEXIT END搭建Linux交叉编译开发环境vim没有菜单,只有命令vim有三种基本工作模式,分别是:命令模式(commandmode)插入模式(insertmode)底行模式(lastlinemode)VIM的使用:三种工作模式CommandMode主要功能:移动鼠标或编辑文字LastLineMode主要功能:搜索或替换、存保存及结束InsertMode主要功能:输入文字按a/A、i/I、o/O键按:键命令错误或按Esc键执行vi命令回到终端按q、q!、wq键按Esc键gcc编译器GNUCC(简称为gcc)是GNU项目中符合ANSIC标准的编译系统,gcc不仅功能强大,而且可以编译如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。gcc编译过程Gcc的编译流程分为了4个步骤,分别为:·预处理(Pre-Processing);·编译(Compiling);·汇编(Assembling);·链接(Linking)。1.预处理阶段预处理程序(Pre-processor)读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理。伪指令主要包括文件包含、宏定义和条件编译指令。2.编译阶段编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分。在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或者汇编代码。3.汇编过程汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程。4.连接阶段将一个文件中引用的符号(如变量或函数调用)与该符号在另外一个文件中的定义连接起来,从而使有关的目标文件连成一个整体,最终成为可被操作系统执行的可执行文件。连接模式分为静态连接和动态连接。

理解下列Makefile文件: #一个简单的Makefile的例子 #以#开头的为注释行 test:prog.ocode.o gccprog.ocode.o–otest

prog.o:prog.cprog.hcode.h gcc–cprog.c–oprog.o

code.o:code.ccode.h gcc–ccode.c–ocode.o

clean: @echo"cleanningproject" rmmain*.o @echo"cleancompleted"BootLoader介绍在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。Bootloader(引导加载程序)是嵌入式系统上电后运行的第一段软件代码。通过它,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,以便为操作系统内核运行准备好正确的环境.Bootloader的主要运行任务是硬件初始化,将Linux内核镜像从硬盘Flash读到RAM中,然后跳转到Linux内核的入口点去运行,从而启动Linux系统。BootLoader介绍BootLoader非通用性:

每种不同的CPU体系结构都有不同的BootLoader。有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。BootLoader的两种类型BootLoader的启动过程有两种类型:单阶段(SingleStage):一些只需完成很简单功能的bootloader可能是单阶段的多阶段(Multi-Stage):

通常多阶段的BootLoader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备(Flash)上启动的BootLoader大多都是2阶段的启动过程,也即启动过程可以分为stage1和stage2两部分:(1)Stage1--依赖于处理器体系结构和板级初始化的代码,需要短小精悍,通常用汇编语言编写;(2)Stage2--通常用C语言来实现,以便于实现更复杂的功能以及取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接Bootloader程序时,不能使用glibc库中的任何支持函数。Uboot的作用uboot相关命令printenv打印环境变量usage:

printenv

-printvaluesofallenvironmentvariables

printenvname...

-printvalueofenvironmentvariable'name'Uboot>printenv

baudrate=115200

ipaddr=

ethaddr=12:34:56:78:9A:BC

serverip=Uboot>printenvipaddripaddr=

环境变量相关命令setenv添加、修改、删除环境变量setenvnamevalue...

-setenvironmentvariable'name'to'value...‘setenvname

-deleteenvironmentvariable'name‘添加例子:

Uboot>setenvmyboardAT91RM9200DK

Uboot>printenvmyboard myboard=AT91RM9200DK修改例子:

Uboot>setenvipaddr4Uboot>setenvserverip8删除例子:

Uboot>setenvmyboard环境变量相关命令setenv命令的使用实例:>setenvserverip>setenvipaddr00>setenvrootpath“/usr/local/arm/3.3.2/rootfs”>setenvbootargs“root=/dev/nfsrwnfsroot=\$(serverip):\$(rootpath)ip=\$(ipaddr)”>setenvkernel_addr30000000>setenvnfscmd“tftp\$(kernel_addr)uImage;bootm\$(kernel_addr)”>runnfscmd

上面定义的环境变量有serverip、ipaddr、rootpath、bootargs、kernel_addr。环境变量bootargs中还调用了环境变量,bootargs环境变量定义了命令行参数,通过bootm命令传递给内核。环境变量nfscmd通过tftp协议把uImage下载到指定的地址并且引导起来。最后,通过run命令来执行nfscmd脚本。环境变量相关命令saveenv保存变量 设置好的环境变量只是保持在内存(断点消失)中,所以需要通过saveenv命令保存至Flash中。我们经常要设置的环境变量有ipaddr,serverip,bootcmd,bootargs。Linux内核结构Linux内核组成 Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。Linux内核结构

进程调度(SCHED) 控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。

Linux使用了比较简单的基于优先级的进程调度算法来选择运行新的进程。Linux内核结构

(2)内存管理(MM) Linux允许多个进程安全的共享主内存区域。它的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据、堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟接口。Linux内核结构

(3)虚拟文件系统(VirtualFileSystem,VFS) 虚拟文件系统隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚

温馨提示

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

评论

0/150

提交评论