480 likes | 682 Views
嵌入式 ARM 内核的概述. 报告人:王黎明 Email : icesoar785160@163.com. 概述. ARM 公司不生产芯片,只出售芯片技术授权 ARM 技术 IP 核的微处理器--汽车、消费电子、工业控制、海量存储、网络、安保、无线等 目前世界前 5 大半导体公司全部使用了 ARM 的技术授权,前 10 大半导体有 9 家,全世界有 70 多家公司生产 ARM 芯片。. ARM 技术的应用领域. 无线设备 蓝牙技术 互联网 消费电子 汽车电子 海量存储 成像 安全产品 PDA 产品 手持仪器 工业控制. ARM 芯片特点.
E N D
嵌入式ARM内核的概述 报告人:王黎明 Email:icesoar785160@163.com
概述 • ARM公司不生产芯片,只出售芯片技术授权 • ARM技术IP核的微处理器--汽车、消费电子、工业控制、海量存储、网络、安保、无线等 • 目前世界前5大半导体公司全部使用了ARM的技术授权,前10大半导体有9家,全世界有70多家公司生产ARM芯片。
ARM技术的应用领域 • 无线设备 • 蓝牙技术 • 互联网 • 消费电子 • 汽车电子 • 海量存储 • 成像 • 安全产品 • PDA产品 • 手持仪器 • 工业控制
ARM芯片特点 • ARM芯片具有一般RISC体系结构的一般特点: 1)具有大量寄存器 2)绝大多数操作都在寄存器中进行,在内存和寄存器之间是通过load/store进行的 3)寻址方式简单 4)采用固定长度的指令结构 • ARM还采用了别的结构 1)在同一条指令中包含算术逻辑处理单元和移位处理 2)使用地址自动增加(减少)来优化程序中循环处理 3)Load/Store指令可以批量传输数据 4)所有指令都可以根据前面指令的执行结构,决定是否执行
ARM处理器模式 除了用户模式之外其他6种处理器模式为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意的进行处理器模式的切换。
ARM处理器模式 • 处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换 • 大多数应用程序在用户模式下执行,当处理器工作在用户模式下时,正常执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常(exception)产生。 • 当应用程序发生异常中断时,处理器进入相应的异常模式,每种异常模式都有一组寄存器,供相应的异常处理程序使用,这样就保证在进入异常模式时,用户模式下的寄存器(保存了程序的运行状态)不被破坏。 • 系统模式不是通过异常过程进入的,它和用户模式具有完全一样的寄存器
ARM寄存器 • 31个通用寄存器 1)未备份寄存器R0~R7 2)备份寄存器R8~R14 其中R13在ARM中经常用作栈指针 R14又称为连接寄存器 3)程序计数器PC 即R15 • 程序状态寄存器 CPSR当前程序状态寄存器 SPSR备份程序状态寄存器
ARM指令概要 • ARM指令分为: 1) 跳转指令 2)数据处理指令 3)乘法指令 4)程序状态寄存器(PSR)访问指令 5)load/Store指令 6)信号量操作指令 7)异常中断产生指令 8)协处理器指令
ARM指令概要 • 跳转指令 ARM可以实现程序的跳转: 1)跳转指令 2)直接向PC寄存器中写入目标在地址 ARM跳转指令可以向前后的32MB的地址空间跳转 1)B 跳转指令 2)BL 带返回的跳转指令 3)BLX 带返回和状态切换的跳转指令 4)BX 带状态切换的跳转指令
ARM指令概要 • 数据处理指令 1)数据传送指令 如:MOV 2)算术逻辑指令 如:ADD,SUB,AND等 3)比较指令 如:TST Example: ADD Rd,Rx,Rx,LRL #n :Rd=Rx+Rx×2*n
ARM指令概要 • 乘法指令 1)32位乘法指令,即乘法操作的结果为32位 2)64位乘法指令,即乘法操作的结果为64位 Example MUL R0,R1,R2 ;R0=R1*R2 MULS R0,R1,R2 ;R0=R1*R2 ,同时设置CPSR中的N位和Z位
ARM指令概要 • 状态寄存器访问指令 通常修改状态寄存器是通过“读取-修改-写回”的操作来实现的 程序不能通过直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换 1)MRS 状态寄存器到通用寄存器的传送指令 2)MSR通用寄存器到状态寄存器的传送指令 Example: MRS R0,CPSR ;读取CPSR BIC R0,R0,#0x1F ;修改,去除当前处理器模式 ORR R0,R0,#0x13 ;修改,设置特权模式 MSR CPSR_C, R0 ; 写回
ARM指令概要 • Load/Store内存访问指令 1)load指令用于从内存中读取数据放入寄存器中 2)store 用于将寄存器中的数据保存到内存 3)LDM 批量内存字数据读取指令 4)STM 批量内存数据写入指令 Example: LDR R0,[R1,#4] ;将内存单元R1+4中的字读取到R0寄存器中STR R0, [R1,#0x4] ;R0中的字数据保存到内存(R1+0x4)中
ARM指令概要 • 异常中断产生指令 1)SWI 软中断指令 2)BKPT断点中断指令 SWI指令主要用于用户程序调用操作系统的系统服务。操作系统在SWI的异常中断处理程序中提供相关的系统服务,并定义了参数传递的方法 BKPT指令用于产生软件断点中断,软件调试可以使用该中断,当系统使用硬件调试部件时可以忽略该中断。
ARM指令概要 • 信号量操作指令-主要用于实现信号量操作 1)SWP 交换指令 2)SWPB 字节交换指令 SWP <Rd>,<Rm>,[<Rn>] 将内存单元(该单元地址放在寄存器<Rn>中)的内容读取到一个寄存器<Rd>中,同时将另一个寄存器<Rm>的内容写到该内存单元中。 Example: SWP R1,R2,[R3] ;将内存单元(R3)中字数据读取到R1寄存器 中,同时将R2寄存器的数据写入到内存单元(R3)中。 SWP R1,R1,[R2];将R1寄存器内容和内存单元(R2)的内容互换
ARM指令概要 • ARM协处理器指令 1)CDP 协处理器数据操作指令 2)LDC协处理器数据读取指令 3)STC协处理器数据写入指令 4)MCR ARM寄存器到协处理器寄存器数据传送指令 5)MRC协处理器寄存器到ARM寄存器的数据传送指令
ARM汇编语言程序设计 • 符号定义(Symbol definition)伪操作 • 数据定义(Data definition)伪操作 • 汇编控制(Assembly control)伪操作 • 框架描述(Frame description)伪操作 • 信息报告(Reporting)伪操作 • 其他伪操作
ARM汇编语言程序设计 • 符号定义伪操作 1)GBLA,GBLL,GBLS声明全局变量 2)LCLA,LCLL,LCLS 声明局部变量 3)SETA,SETL,SETS给变量赋值 4)RLIST 为通用寄存器列表定义名称 5)CN 为协处理器的寄存器定义名称 6)CP为协处理器定义名称 7)DN及SN 为VFP的寄存器定义名称 8)FN 为FPA的浮点寄存器定义名称
ARM汇编语言程序设计 • 数据定义伪操作 1)LTORG:声明一个数据缓冲池的开始 2)MAP 定义一个结构化的内存表的首地址 ……^ 3)FIELD 定义结构化的内存表中的一个数据域 ……# 4)SPACE分配一块内存单元,并用0初始化 ……% 5)DCD 分配一段字的内存单元,并用指定的数据初始化 ……& 6)DATA在代码中使用数据 7)DCDB,DCFD,DCFS,DCI,DCQ,DCW
ARM汇编语言程序设计 • 汇编控制伪操作 1)IF,ELSE 及ENDIF 2)WHILE及WEND 3)MACRO及MEND 4)MEXIT Example: count SETA 1 ;设置循环计数变量count初始值为1 WHILE count<=4 ; count SETA count+1 ;code WEND
ARM汇编语言程序设计 • 信息报告伪操作 1)ASSERT:报告错误信息 2)INFO:汇编处理过程中报告诊断信息 3)OPT 4)TTL:在列表文件的每一页开头插入一个标题 5)SUBT:在列表文件的每一页开头插入一个子标题 Example: INFO 0,“Version 1.0” ;在第二遍扫描时报告版本信息 IF endofdata<=label1 INFO 4, “Data overrun at label1” ;如果endofdata<=label1成立 ;在第一遍扫描报告错误信息, ;并终止程序
ARM汇编语言程序设计 • 其他伪操作 1)ALIGN:通过添加补丁字节使当前位置满足一定的对齐方式 2)AREA:用于定义一个代码段或者数据段 3)CODE16,CODE32:说明后面指令序列是Thumb还是ARM指令 4)ENTRY:指定程序的入口点 5)EXPORT或者GLOBAL:声明一个全局变量 6)GET及INCLUDE:将一个源文件包含到当前源文件中 Example: AREA Example,CODE,READONLY EXPORT DoAdd DoAdd ADD R0,R0,R1
ARM汇编语言程序设计 • ARM汇编语言的伪指令: 1)ADR:将基于PC的地址值或基于寄存器的地址值读到寄存器中 2)ADRL:将基于PC的地址值或基于寄存器的地址值读到寄存器中 只是比ADR可以读取更大范围的地址 3)LDR:将一个32位的常数或者一个地址读取到寄存器中 4)NOP:空操作伪指令
ARM中异常中断处理概述 • ARM体系结构3种方式控制程序的执行流程 1)正常执行--ARM指令PC+4,Thumb指令PC+2 2)跳转指令--B,BL,BX,BLX 3)异常中断发生--保存中断的程序的执行现场,中断退出之后,恢复中断程序的执行现场
ARM中异常中断处理概述 • 如果异常处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器
ARM中异常中断处理概述 • ARM处理器对异常中断的相应过程 1)保存处理器当前状态、中断屏蔽位以及各条件标志位 2)设置当前状态寄存器CPSR中相应的位 3)将寄存器Ir_mode设置成返回地址 4)将程序计数值PC设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行 Example----响应IRQ异常中断 R14_irq=address of next instruction to be executed + 4 SPSR_irq=CPSR CPSR[4:0]=0b10010 ;进入IRQ异常中断模式 CPSR[5]=0 ;切换到ARM状态 CPSR[7]=1 ;禁止IRQ异常中断 if high vectors configured then pc=0xFFFF0018 else pc=0x00000018
ARM中异常中断处理概述 • 从异常中断处理程序中返回 1)恢复被中断的程序的处理器状态,即将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中 2)返回发生异常中断的指令的下一条指令处执行,即将lr_mode寄存器的内容赋值程序计数器PC中 3)复位异常中断处理程序不需要返回 4)当异常处理程序发生时,程序计数器PC所指的位置对于不同的异常中断是不同的
ARM中异常中断处理概述 • 在系统的启动代码中安装异常中断处理程序分两种情况: 1)地址0x0处为ROM,可以使用数据读取指令LDR直接向程序计数器PC中赋值,也可以直接使用跳转指令跳到异常中断处理程序 2)0x0处为RAM,中断向量表必须使用数据读取指令直接向PC中赋值的形式,比且必须将中断向量表从ROM中赋值到RAM中 Example: MOV R8,#0 ADR R9, Vector_Init_Block LDMIA R9!,{R0-R7} ;复制中断向量表 STMIA R8!,{R0-R7} LDMIA R9!,{R0-R7} ;复制中断处理函数地址表 STMIA R8!,{R0-R7}
ARM中异常中断处理概述 • 在C程序中安装异常中断处理程序 中断向量表中使用跳转指令的情况 1)读取中断处理程序的地址 2)从上一步得到的地址中减去该异常中断对应的中断向量的地址 3)从上一步得到的地址中减去8 4)将上步得到的地址右移2位 5)确保上步得到的地址高8位为0 6)将上步得到的地址与数据0xea00 0000做逻辑或,从而得到将要写到中断向量表中的跳转指令的编码
ARM中异常中断处理概述 • Example: 其中参数routine是中断处理程序的地址,vector为中断向量地址 Unsigned Install_Handler (unsigned routine,unsigned *vector) /*在中断向量表vector处,添加合适的跳转指令*/ /*该跳转指令跳转到中断处理程序routine处*/ /*程序返回原来的中断向量*/ { unsigned vec ,oldvec; vec=((routine-(unsigned)vector-0x08)>>2); If (vec & 0xff000000) { printf( “ Installation of Handler failed”); exit(1);} vec=0xea000000 | vec; oldvec = *vector; *vector = vec Return ( oldvec); } 下面语句调用上面代码,在C程序中安装中断处理程序 Unsigned *irqvec = (unsigned *)0x18 Install_Handler ((unsigned) IRQHandler, irqvec);
ARM中异常中断处理概述 • 中断向量表中使用数据读取指令的情况 1)读取中断处理程序的地址 2)从上步得到的地址中减去该异常中断对应的中断向量的地址 3)从上步得到的地址中减去8 4)将上步得到的地址与数据0xe59ff000作逻辑或,从而得到将要写到中断向量表中的数据读取指令的编码 5)将中断处理程序的地址放到相应的存储单元
ARM中异常中断处理概述 • Example: 参数loction是一个存储单元,其中保存了中断处理程序的地址;vector为中断向量地址 unsigned Install_handler (Unsigned location, unsigned *vector) /*在中断向量表中vector处,添上合适的指令LDR pc, [pc,#offset] */ /*该指令跳转到目标地址存放在存储单元‘location’中*/ /*函数返回原来的中断向量*/ { unsigned vec, oldvec; Vec = ((unsigned)location –(unsigned)vector-0x8) | 0xe59ff000; Oldvec= *vector *vector=vec; Return (oldvec); } 下面调用上面函数,在C程序中安装中断处理程序 Unsigned *irqvec = (unsigned *)0x18 Install_Handler ((unsigned) IRQHandler, irqvec);
ARM中异常中断处理概述 • FIQ和IRQ异常中断处理程序 1)ARM提供FIQ和IRQ异常中断用于外部设备向CPU请求中断 2)FIQ异常中断的中断向量为0x1c,位于中断向量表的最后。这样FIQ异常中断处理程序可以直接放在地址0x1c开始的存储单元,这种安排省掉了中断向量表中的跳转指令,从而也就节省了中断响应的时间 3)与其他异常模式相比,FIQ异常模式还有额外的5个物理寄存器,这样在进入FIQ处理程序时可以不保存这5个寄存器,从而提高了FIQ异常中断的执行速度
ARM映象文件 • ARM映象文件是一个层次结构的文件,其中包含了域(region)、输出段(output section)和输入段(input section) 1)一个映象文件由一个或者多个域组成 2)每个域包含一个或多个输出段 3)每个输出段包含一个或者多个输入段 4)各输入段包含了目标文件中代码和数据 输入段:代码,已经初始化的数据,未经初始化存储区域,内容初始化 成0的存储区域 一个输出段包含了一系列的具有相同的RO,RW和ZI属性的输入段 一个域包含的各输出段属性各不相同。
ARM映象文件 • ARM映象文件各组成部分在存储系统中的地址有两种: 1)加载时地址 2)运行时地址
ARM映象文件 • 通常一个映象文件中包含若干个域,各域又可包含若干的输出段,ARM是通过以下两个信息决定如何生成相应的映象文件。 1)分组信息:决定如何将各输入段组织成相应的输出段 和域。 2)定位信息:决定各域的存储空间中的起始地址
谢谢大家! Email:icesoar785160@163.com