ARM的存储器映射与存储器重映射.
- 格式:doc
- 大小:16.00 KB
- 文档页数:3
嵌入式系统复习题一、简答题1、什么是嵌入式处理器,嵌入式处理器可以分为几大类?嵌入式处理器是为了完成特殊的应用而设计的特殊目的的处理器,分为嵌入式微处理器、嵌入式微控制器、嵌入式DSP处理器、嵌入式片上系统(SOC)。
2、广泛使用的三种类型的操作系统?多道批处理操作系统、分时操作系统以及实时操作系统。
3、什么是RISC?什么是CISC?RISC是精简指令集计算机的缩写。
CISC是复杂指令集计算机的缩写。
4、ARM7TDMI中的T、D、S、I分别表示什么含义?T:支持高密度16位的Thumb指令集;D:支持片上调试;S:ARM7TDMI 的可综合(synthesizable)版本(软核);I:支持EmbededICE观察硬件;M:支持64位乘法5、ARM7TDMI处理器采用什么样的体系结构,其可寻址地址空间多大?ARM处理器使用冯.诺依曼结构;使用单个平面的232个8位字节地址空间。
地址空间可以看作是包含230个32位字,或231个16位半字。
6、ARM7TDMI处理器采用几级流水线处理,使用何种存储器编址方式?ARM7TDMI处理器采用三级流水线;ARM处理器将存储器看做是一个从0开始的线性递增的字节集合。
7、ARM处理器模式和ARM处理器状态有什么区别?ARM处理器模式指用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。
ARM处理器状态指ARM状态和Thumb状态ARM两种处理器状态下均有上述7种模式。
8、ARM7TDMI内部寄存器特点?分别为31个通用32位寄存器和6个状态寄存器。
它们不能在同一使劲同时被访问,对其的访问取决于处理器状态和处理器模式。
9、ARM7TDMI有几种寻址方式?寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、相对寻址。
10、ARM7的内部寄存器R13、R14、R15的主要功能和作用?R13:堆栈指针,用于保存堆栈的出入口处地址、保存待使用寄存器的内容R14:连接寄存器,当使用BL指令调用子程序时,返回地址将自动存入14中;当发生异常时,将R14对应的异常模式版本设置为异常返回地址;其他时候作为通用寄存器。
第⼆章STM32的结构和组成2.5 芯⽚⾥⾯有什么STM32F103采⽤的是Cortex-M3内核,内核即CPU,由ARM公司设计。
ARM公司并不⽣产芯⽚,⽽是出售其芯⽚技术授权。
芯⽚⽣产⼚商(SOC)如ST、TI、Freescale,负责在内核之外设计部件并⽣产整个芯⽚,这些内核之外的部件被称为核外外设或⽚上外设。
如:GPIO、USART(串⼝)、I2C、SPI等都在做⽚上外设。
ICode总线ICode中的I表⽰Instruction,及指令。
我们写好的程序编译之后都是⼀条条指令,存放在FLASH中,内核要读取这些指令来执⾏程序就必须通过ICode总线。
驱动单元DCode总线D表⽰Data,即数据,这要总线是⽤来取数的。
DMA系统总线⽤来传输数据,这个数据可以是在某个外设的数据寄存器。
被动单元内部的闪存存储器:即FLASH,我们编写好的程序就放在这个地⽅。
内核通过ICode总线来取⾥⾯的指令。
内部的SRAM:通常说的RAM,程序的变量开销都是基于内部的SRAM。
内核通过DCode总线访问。
FSMC:灵活的静态的存储器控制器。
AHB到APB的桥从AHB总线延伸出来的两条APB2和APB1总线,上⾯挂载着STM32各种各样的特⾊外设。
我们经常说的GPIO、串⼝、I2C、SPI这些外设在这条总线上,这是我们学习STM32的重点,重点、重点。
2.6存储器映射存储器映射:给存储器分配地址的过程。
存储器重映射:给存储器在分配⼀个地址就叫存储器重映射。
2.7寄存器映射给已经分配好的地址的⼜特定功能的内存单元取别名的过程就叫寄存器映射。
ARM片外Flash存储器IAP解决办法0 引言以ARM芯片为处理器核的嵌入式应用系统,以其小体积、低功耗、低成本、高性能、丰富的片内资源以及对操作系统的广泛支持,得到了人们越来越多的青睐。
在应用编程IAP (InApplicatAiONProgram)就是这样的自修改程序。
它先在RAM存储器中写人数据值,然后使PC指向该存储段,把该段作为程序段来执行。
很多ARM7芯片自带IAP处理器,应用其自带的IAP处理器可以方便地对其片内集成的Flash存储器进行在应用编程,但几乎所有的ARM 核芯片均不支持片外IAP处理,因为片外Flash存储器是用户选型的,芯片生产厂家无法先知先觉,而不同Flash存储器其编程时序也不尽相同,导致芯片生产厂家无法提供通用的IAP 代码。
那么,如何对嵌入式系统的片外Flash存储器进行在应用编程呢?这里分两种情况:一是普通代码存放在片外单独1片Flash中,IAP代码在另一片Flash中完成,此时只要依据Flash的操作时序执行IAP代码,完成擦除或写入操作即可。
这种情况虽然简单,但应用了2片Flash;而IAP代码很小,一般完全可以集成到1片中,所以这里对这种情况不予考虑。
另一种情况是1片Flash中既要存储普通代码,又要实现IAP。
针对嵌入式应用系统片外Flash存储器IAP无现成方案的问题,介绍一种基于代码重入思想的片外存储器IAP解决方案。
结合LPC2210及SST39VFl60芯片,简介两款芯片特点,给出应用连接框图;分析IAP实现要点,并给出IAP的实现代码。
下面以Phnips公司的LPC2210 和 Silicon storageTechnology 公司的SST39VFl60为例,详细讨论这种情况IAP的解决方案。
1 硬件结构1.1 LPC2210介绍Philips公司的LPC22lO是一款基于支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-SCPU的微控制器。
ARM处理器系统初始化过程1 禁止MMU,关闭中断,禁止cache;2 根据硬件设计配制好处理器时钟、DRAM时钟、定时器时钟;3 根据系统中所用的flash和DRAM芯片容量和电气参数设置它们的起始地址、容量、刷新频率等;4 将固化在flash芯片中的程序搬移到DRAM内存中;5 使能cache,使能MMU,跳转到DRAM内存中运行继续初始化,包括根据具体应用以及系统中的硬件配置初始化各个功能模块、安装好异常中断处理程序、使能中断等;6 进行操作系统相关初始化;禁止MMU,关闭中断,禁止cache通过写系统控制协处理器的寄存器1 的第0 位可以允许和禁止MMU。
在复位后这位是0,MMU 被禁止。
关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个程序输出打印内容,这样在打印机上就会乱得不得了,同时有两份以上的文件交错地打印在一张纸上。
像不可剥夺的资源,就一定要关闭中断,让它占有这个资源。
在ARM里,没有像x86那样有清除中断指令CLI。
那么在ARM里是怎么样实现关中断和开中断的呢?下面就来看看ARM的关中断和开中断实现。
void Lock(void){stmdb sp!, {r0}mrs r0, cpsrorr r0,r0,#0xC0msr cpsr_cxsf,r0ldmia sp!,{r0}}上面这段程序是通过设置CPSR的第6,7位来实现的,因为第6,7位是设置为1时,就不再响应中断。
void UnLock(void){stmdb sp!, {r0}mrs r0, cpsrbic r0,r0,#0xC0msr cpsr_cxsf,r0ldmia sp!,{r0}}上面是重新开中断的命令,同样是设置CPSR的第6,7位,但它的值是0,就可接收中断了。
如果在多个任务之间进行共享数据,一般是需要使用关中断和开中断实现数据同步的,其实中这种关中断和开中断,就是进入临界区和退出临界区。
单片机重映射随着科技的发展和应用的广泛,单片机(Microcontroller)在各个领域中得到了广泛的应用。
单片机重映射(Remapping)是指将单片机的引脚或者功能进行重新分配和配置,以满足特定应用需求的一种技术手段。
通过单片机重映射,可以使单片机具备更多的功能和扩展性,提高系统的灵活性和效率。
单片机重映射涉及到对单片机的引脚和功能进行重新配置,使其能够适应不同的应用场景。
在单片机设计中,通常会有一些功能模块或引脚需要被多个外设所共享,而这些外设可能需要在不同的时间段内使用。
为了解决这个问题,就需要对单片机进行重映射,将不同的功能或引脚分时使用,从而实现多个外设的共享。
单片机重映射的具体实现方法可以有多种,比较常见的有软件重映射和硬件重映射两种方式。
软件重映射是通过软件编程的方式实现的,通过对单片机的寄存器进行设置和配置,将某个引脚或功能从一个外设映射到另一个外设。
软件重映射的优点是灵活性高,可以根据需要随时进行配置和修改。
但是,软件重映射的缺点是需要占用额外的处理器资源和时间,并且可能会影响系统的实时性能。
硬件重映射是通过硬件电路的方式实现的,通过对单片机的引脚进行物理连接和切换,将某个引脚或功能从一个外设映射到另一个外设。
硬件重映射的优点是实时性好,不会影响系统的性能和时序要求。
但是,硬件重映射的缺点是配置和修改比较困难,需要设计和制造专门的硬件电路。
单片机重映射的应用非常广泛。
在嵌入式系统中,由于单片机的引脚和功能资源有限,需要通过重映射来实现多个外设的共享。
比如,一个单片机可能需要同时连接多个传感器、执行器和通信模块,通过重映射可以将不同的功能映射到不同的引脚上,从而实现多个外设的并行工作。
在工业控制系统中,单片机重映射也发挥着重要的作用。
工业控制系统通常需要连接大量的传感器、执行器和通信设备,通过重映射可以将不同的功能映射到不同的引脚上,从而实现系统的灵活配置和扩展。
单片机重映射还可以用于汽车电子、医疗设备、智能家居等领域。
1.内存管理和MMU当ARM 要访问存储器时,MMU 先查找TLB(Translation Lookaside Buffer,旁路转换缓冲)中的虚拟地址表。
如果TLB 中没有虚拟地址的入口,则转换表遍历硬件会从存放在内存的转换表中获得转换和访问器权限。
一旦取到,这些信息将被放到TLB 中,这时访问存储器的TLB 入口就拿到了。
在TLB 中其实包含了以下信息:1)控制决定是否使用高速缓冲2)访问权限信息3)在有cache 的系统中,如果cache 没有命中,那么物理地址作为线性获取(line fetch)硬件的输入地址。
如果命中了cache 那么数据直接从cache 中得到,物理地址被忽略。
ARM 的工作流程可用下图表示:这种机制是纯粹的高速硬件操作,并不需要操作系统来完成。
操作系统只要提供内存转换表就可以了,但是需要符合一定的格式。
ARM9 的MMU 映射表分为两种,一级页表的变换和二级页表变换。
两者的不同之处就是实现的变换地址空间大小不同。
一级页表变换支持1 M 大小的存储空间的映射,而二级可以支持64 kB,4 kB 和1 kB 大小地址空间的映射。
在LINUX 中最终使用了1 M 一级页表和4 kB 的二级页表(即 1M段区和4KB页面)内核中地址转换表建立过程地址转换表建立是和内核的启动一起完成的,页表的建立也可以分为三个阶段:第一阶段是发生在内核解压缩、自引导时,也就内核镜像zimage 的文件头部分。
相关代码从某种意义上来讲不属于内核,它是BSP 代码中的一部分,是需要根据不同的架构来分别实现的。
通过平面映射的方式建立了256M 空间节描述表。
但是,这个映射表是临时的,是为了提高内核解压缩时的速度而实现的。
在解压缩结束之后,进入内核代码之前,MMU 功能就被关闭了,随之的映射表也被废弃不用。
当decompress_kernel 函数实现内核的解压缩之后,那么内核启动的第一阶段工作就完成了。
存储器映射以及重映射代影珂,程帅旗摘要:本文讲的主要是存储器映射的相关内容。
包括片内外存储器(片内外Flash、SRAM)的简单介绍。
存储器映射即是存储器分配地址的过程,存储器的地址分配是在芯片生产时就已确定的,在对映射介绍时着重有关外设的映射,如AHB和VPB总线外设映射,对它们用图文并茂的形式作了全面的论述。
重映射是指系统中有部分存储单元可以同时出现在不同的地址上。
本文介绍了Boot Block(引导块)重映射与异常向量表的重映射及产生原因。
关键词:片内外存储器、存储器映射、存储器重映射、引导块、异常向量表Abstract: This article is discussing about the memory maps, which conclude internal memory and external memory (Flash, SRAM). The memory map is a process of distribution of memory address, the memory address allocation is set by the manufacturer when it is produced. We emphasize the peripherals ,such as the maps of AHB and VPB peripherals, when interviewing the maps with excellent picture and wonderful text. The memory remapping is a remapping process of the mapped memory, in this text, the Boot Block remapping and the remapping of the exception vector table is our key point ,and also the cause.Keyword: internal memory, external memory, memory remapping, Boot Block, exception vector table.一、片内存储器片内存储器包括片内Flash程序存储器、片内静态RAM(SRAM)。
第1章嵌入式系统概述(1)举出3个本书中未提到的嵌入式系统的例子。
答:键盘、鼠标、扫描仪。
(2)什么叫嵌入式系统?答:嵌入到对象体系中的专用计算机应用系统。
(3)什么叫嵌入式处理器?嵌入式处理器分为哪几类?答:嵌入式处理器是为完成特殊的应用而设计的特殊目的的处理器。
分为3类:1.注重尺寸、能耗和价格; 2.关注性能;3.关注全部4个需求——性能、尺寸、能耗和价格。
(4)什么是嵌入式操作系统?为何要使用嵌入式操作系统?答:嵌入式操作系统是操作系统的一种类型,是在传统操作系统的基础上加入符合嵌入式系统要求的元素发展而来的。
原因: 1.提高了系统的可靠性; 2.提高了开发效率,缩短了开发周期。
3.充分发挥了32位CPU的多任务潜力。
第2章ARM7体系结构1.基础知识(1)ARM7TDMI中的T、D、M、I的含义是什么?答:T:高密度16位Thumb指令集扩展;D:支持片上调试;M:64位乘法指令;I:Embedded ICE硬件仿真功能模块。
(2)ARM7TDMI采用几级流水线?使用何种存储器编址方式?答:3级;冯・诺依曼结构。
(3)ARM处理器模式和ARM处理器状态有何区别?答:ARM处理器模式体现在不同寄存器的使用上;ARM处理器状态体现在不同指令的使用上。
(4)分别列举ARM的处理器模式和状态?答:ARM的处理器模式:用户模式、系统模式、管理模式、中止模式、未定义模式、中断模式、快速模式;ARM的处理器状态:ARM状态、Thumb状态。
(5)PC和LR分别使用哪个寄存器?答:PC:R15;LR:R14。
(6)R13寄存器的通用功能是什么?答:堆栈指针SP。
(7)CPSR寄存器中哪些位用来定义处理器状态?答:位31~28:N、Z、C、V,条件代码标志位;27~8:保留位;7~0:I、F、T、M4~0,控制标志位。
(8)描述一下如何禁止IRQ和FIQ的中断。
答:当控制位I置位时,IRQ中断被禁止,否则允许IRQ中断使能;当控制位F 置位时,FIQ中断被禁止,否则允许FIQ中断使能。
嵌入式芯片的存储器映射和存储器重映射1. 引言很多嵌入式芯片都集成了多种存储器(RAM、ROM、Flash、……),这些存储器的介质、工艺、容量、价格、读写速度和读写方式都各不相同,嵌入式系统设计需根据应用需求巧妙地规划和利用这些存储器,使得存储系统既满足应用对容量和速度的需求,又有较强的价格竞争优势。
本文所讲的存储器映射就是对各种存储器的大小和地址分布的规划。
存储器重映射就是为了快速响应中断或者快速完成某个任务,将同一地址段映射到不同速度的两个存储块,然后将低速存储块中的代码段复制到高速存储块中,对低速存储块的访问将被重映射为对高速存储块的访问。
2. 存储器映射(Memory Mapping)对于具体的某款嵌入式芯片,它包含的各种存储器的大小、地址分布都是确定的。
存储器映射(Memory Mapping)就是指(物理)地址到存储单元的一一对应(注意,本文中所讲的存储器映射不是指虚拟地址到物理地址的映射。
更确切地讲,本文所讲的存储器映射是存储布局(Memory Layout))。
同一类型的存储器称为一个存储块(Memory Block),也有的地方称为一个存储区域(Memory Area,Memory Region),嵌入式系统设计者通常会为一个存储块分配一段连续的物理地址。
多种存储器按某种方式排列,形成整个存储空间。
存储器映射可以理解为这样一个函数:输入是地址总线上的地址编码,输出是被寻址单元中(或数据总线上)的数据。
该函数是一个逻辑概念,计算机系统上电复位后才建立起这种映射,当计算机系统掉电后,这个函数就不复存在,只剩下计算机系统中实现这个函数的物理基础——电路连接。
也可以这样认为:存储器映射是计算机系统上电复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
3. 存储器重映射(Memory Remapping)3.1 为什么需要存储器重映射目前很多嵌入式系统中的Flash分为Code Flash和Data Flash。
Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.
ARM的存储器映射与存储器重映射
当系统上电后,程序将自动从0x00000000地址处开始执行,因此在系统的初始状态,要求0x00000000地址处的存储器是非易性的ROM或Flash等。
但是ROM 或Flash的访问速度相对较慢,每次中断发生后,都要读取ROM或Flash上的向量表开始,影响了中断响应速度。
因此,LPC2200提供一种灵活的地址重映射方法,该方法可以将内部RAM的地址重新映射到0x00000000的位置。
在系统执行重映射命令之前,需要将Flash中的中断向量代码拷贝到内部RAM中。
这样在重映射命令执行之后相当于从内部RAM中0x00000000的位置找到中断向量,而实际上是将RAM的起始地址0x40000000映射为0x00000000了。
这样,中断执行时相当于在RAM中找到对应中断向量,实现异常处理调试。
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。
即用地址来表示对象。
这个地址绝大多数是由厂家规定好的,用户只能用而不能改。
用户只能在挂外部RAM或FLASH的情况下可进行自定义。
ARM7TDMI的存储器映射可以有0X00000000~0XFFFFFFFF的空间,即4G的映射空间,但所有器件加起来肯定是填不满的。
一般来说,0X00000000依
Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.
次开始存放FLASH——0X00000000,SRAM——0X40000000,BOOTBLOCK,外部存储器0X80000000,VPB(低速外设地址,如GPIO,UART)——
0XE0000000,AHB(高速外设:向量中断控制器,外部存储器控制器)——从0XFFFFFFFF回头。
他们都是从固定位置开始编址的,而占用空间又不大,如AHB只占2MB,所以从中间有很大部分是空白区域,用户若使用这些空白区域,或者定义野指针,就可能出现取指令中止或者取数据中止。
由于系统在上电复位时要从0X00000000开始运行,而第一要运行的就是厂家固化在片子里的BOOTBLOCK,这是判断运行哪个存储器上的程序,检查用户代码是否有效,判断芯片是否加密,芯片是否IAP(在应用编程),芯片是否ISP(在系统编程),所以这个BOOTBLOCK要首先执行。
而芯片中的BOOTBLOCK不能放在FLASH的头部,因为那要存放用户的异常向量表的,以便在运行、中断时跳到这来找入口,所以BOOTBLOCK只能放在FLSAH尾部才能好找到,呵呵。
而ARM7的各芯片的FLASH大小又不一致,厂家为了BOOTBLOCK在芯片中的位置固定,就在编址的2G靠前编址的位置虚拟划分一个区域作为BOOTBLOCK区域,这就是重映射,这样访问<2G即<0X80000000的位置时,就可以访问到在FLASH尾部的BOOTBLOCK区了。
BOOTBLOCK运行完就是要运行用户自己写
的启动代码了,而启动代码中最重要的就是异常向量表,这个表是放在FLASH 的头部首先执行的,而异常向量表中要处理多方面的事情,包括复位、未定义指令、软中断、预取指中止、数据中止、IRQ
Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.
(中断) ,FIQ (快速中断),而这个异常向量表是总表,还包括许多分散的异常向量表,比如在外部存储器,BOOTBLOCK,SRAM中固化的,不可能都由用户直接定义,所以还是需要重映射把那些异常向量表的地址映到总表中。
为存储器分配地址的过程称为存储器映射,那么什么叫存储器重映射呢?为了增加系统的灵活性,系统中有部分地址可以同时出现在不同的地址上,这就叫做存储器重映射。
重映射主要包括引导块“Boot Block”重映射和异常向量表的重映射。
1.引导块“Boot Block”及其重映射Boot Block是芯片设计厂商在LPC2000系列ARM内部固化的一段代码,用户无法对其进行修改或者删除。
这段代码在复位时被首先运行,主要用来判断运行哪个存储器上面的程序,检查用户代码是否有效,判断芯片是否被加密,系统的在应用编程(IAP)以及在系统编程功能(ISP)等。
Boot Block存在于内部Flash,LPC2200系列大小为8kb,它占用了用户的Flash空间,但也有其他的LPC系列不占用FLash空间的,而部分没有内部Flash空间的ARM处理器仍然存在Boot Block。
重映射的原因:Boot Block中有些程序可被用户调用,如擦写片内Flash的IAP代码。
为了增加用户代码的可移植性,所以最好把Boot Block的代码固定的某个地址上。
但由于各芯片的片内Flash大小不尽相同,如果把Boot Block的地址安排在内部Flash结束的位置上,那就无法固定Boot Block的地址。
为了解决上面的问题,于是芯片厂家将Boot Block的地址重映射到片内存储器空间的最高
Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.
端,即接近2Gb的地方,这样无论片内存储器的大小如何,都不会影响Boot Block的地址。
因此当Boot Block中包含可被用户调用的IAP操作的代码时,不用修改IAP的操作地址就可以在不同的LPC系列的ARM上运行了。
2.异常向量表及其重映射ARM内核在发生异常后,会使程序跳转到位于0x0000~0x001C的异常向量表处,再经过向量跳转到异常服务程序。
但ARM单条指令的寻址范围有限,无法用一条指令实现4G范围的跳转,所以应在其后面的0x0020~0x003F 地址上放置跳转目标,这样就可以实现4G范围内的任意跳转,因此一个异常向量表实际上占用了16个字的存储单元。
以下为一张中断向量表:LDR PC, ResetAddrLDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr DCD 0xb9205f80 LDR PC, [PC,#-0xff0] LDR PC, FIQ_Addr ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD
SoftwareInterruptPrefetchAddr DCD PrefetchAbort DataAbortAdd DCD DataAbort Nouse DCD 0 IRQ_Addr DCD 0 FIQ_Addr DCD FIQ_Handler重映射的原因:由于ARM处理器的存储器结构比较复杂,可能同时存在片内存储器和片外存储器等,他们在存储器映射上的起始地址都不一样,因此ARM内核要访问的中断向量表可能不在0x0000~0x003F地址上,因此采用了存储器重映射来实现将存在与不同地方的中断向量表都映射到0x0000~0x003F地址上。
注意:Boot Block也存在中断向量表,而且复位后这段代码首先映射
到0x0000~0x003F地址上,也就是说复位后首先运行的是BootBlock程序。
各个存储区域的中断向量表也不尽相同。