LPC2104的Boot与Remap详解(一)---(原创)的论文
  开场白
  最近在学习arm的过程中,遇到了一些以前在8位机、16位机应用中所没有见过的专业术语。其中,比较困扰和麻烦的两个名词术语就是“boot”与“remap”。同时,在网上也经常见到有网友就这两个技术名词提出疑问。好在当今网络是如此发达,使得我们可以很快就得到许多老师和老鸟的解答。经过这一段时间的阅读与实践,算是将这个概念基本给理出了个头绪,借此机会,以自己的理解总结一下,贴到bbs上来,与广大网友们分享,如有不当之处,板砖且慢,因为我贴此文的目的是抛“砖”引“玉”,不是引“砖”!bow!
  两个专业名词—非易失性存储器和易失性存储器
  非易失性存储器:指掉电后在相当长时间内依然能有效保存数据的存储器。如eeprom, eprom,flash等。
  易失性存储器: 指掉电后迅速丧失存储能力的存储器。如sram,sdram等。
  参考读物:3g时代存储器众生相(电子设计技术2005年第2期)
  ok,一切就绪,let’s go!
  引言
  随着半导体工艺技术与处理器设计技术的不断提高,嵌入式处理器的速度愈来愈快;而非易失性存储器的读取速度却远远跟不上cpu的发展。传统的单片机运行模式——机器代码存储在非易失性存储器(如rom,flash),在运行时由cpu直接从其中取出指令执行——逐渐显得力不从心。如果继续沿用传统的程序运行模式,那么在绝大多数时间内高速cpu将处于空闲等待状态,这既浪费了cpu的计算能力,也无法实现高密度数据流的实时处理与传输。而在短期之内,半导体工业界尚无法实现低成本的非易失性高速存储器技术。为了解决上述处理器和非易失性存储器之间速度不匹配的矛盾,工程师们在嵌入式系统领域内引用了boot技术和remap技术。而要正确理解boot技术和remap技术,必须先建立memory map(存储器映射)的概念。
springboot 原理解析  技术概念描述
  memory map
  计算机最重要的功能单元之一是memory。memory是众多存储单元的集合,为了使cpu准确地到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码。在嵌入式处理器内,集成了多种类型的memory,通常,我们称同一类型的memory为一个memory block。一般情况下,处理器设计者会为每一个memory block分配一个数值连续、数目与其存储单元数相等、以16进制表示的自然数集合作为该memory block的地址编码。这种自然数集合与memory block的对应关系,就是memory map(存储器映射),有时也叫address map(地址映射)。实际上,address map在字面意义上更加贴切。
  需要强调的是,memory map是一个逻辑概念,是计算机系统在(上电)复位后才建立起来的。memory map相当于这样一个数学函数:函数的输入量是地址编码,输出量被寻址单元中的数据。当计算机系统掉电后或复位时,这个数学函数不复存在,只剩下计算机系统中实现这个数学函数的物理基础——电路连接。也可以这样认为:memory map是计算机系统(上电)复位时的预备动作,是一个将cpu所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
  boot/bootload
  boot在计算机专业英文中的意思是“引导”,它是计算机系统(上电)复位后cpu的第一个机器动作。那么,boot引导的是什么呢?简要地说,boot就是引导cpu如何装入机器指令。最简单的boot动作就是8位单片机系统复位后从复位向量中取出跳转指令,转移到用户程序代码段执行的这个过程。
  通常,在计算机系统中,(上电)复位后除了执行boot动作,还跟随着一个load过程。一般情况下,该load从低速非易失性存储器中“搬运”一些数据到高速易失性存储器中。boot和load连续执行,一气呵成,我们称之为bootload。最典型的例子之一就是dsp实时信号处理系统,系统上电后,将存储在eeprom中的实时信号处理程序复制到系统的ram中,然后cpu直接从ram中读取机器指令运行。
  remap
  remap与计算机的异常处理机制是紧密相关的。
  完整的计算机系统必须具备异常处理能力。当异常产生时,cpu在硬件驱动机制下跳转到预先设定的存储器单元中,取出相应的异常处理程序的入口地址, 并根据该入口地址进入异常
处理程序。这个保存有异常处理程序入口地址的存储器单元就是通常所说的“异常入口”,单片机系统中也叫“中断入口”。实际的计算机系统有多种类型的异常,cpu设计人员为了简化芯片设计,一般将所有的异常入口集中起来置于非易失性存储器中,并在系统上电时映射到一个固定的连续地址空间上。位于这个地址空间上的异常入口集合就是“异常向量表”。
  系统上电后的异常向量表是从低速非易失性存储器映射得到的。随着处理器速度的不断提高,很自然地,人们希望计算机系统在异常处理时也充分发挥出cpu的处理能力,而非易失性存储器的读取速度使得cpu只能以多个空闲等待同期来获取异常向量,这样就限制了cpu计算能力的充分发挥。尤其是非易失性存储器位宽小于cpu位宽时,这种负面的影响更加明显。于是,remap技术被引入,以提高系统对异常的实时响应能力。
  从remap这个英文单词的构成不难看出,它是对此前已确立的存储器映射的再次修改。从本质上讲,map和remap是一样的,都是将地址编码资源分配给存储器块,只不过二者产生的时间不同:前者在系统上电的时刻发生,是任何计算机系统都必需的;而后者在系统上电后稳定运行的时刻发生,对计算机系统设计人员来说是可选的。典型的8位单片机系统中,就没有使用remap技术。
  完整的remap过程实际上通常始于系统的bootload过程。具体执行动作为:bootload将非易失性存储器中的异常向量复制到高速易失性存储器块的一端,然后执行remap命令,将位于高速易失性存储器中的异常向量块映射到异常向量表地址空间上。此后,系统若产生异常,cpu将从已映射到异常微量表地址空间的高速非易失性存储器中读取异常向量。具体到典型的arm7嵌入式系统中,就是由bootload程序将片内或片外的flash/rom中的异常向量复制到片内的sram中指定的存在器单元中,然后再执行remap命令。由于片内的sram数据位宽通常与cpu数据位宽相等,因而cpu可以无等待地全速跳入异常处理程序,获得最佳的实时异常响应。 
  〉boot-〉remap,最后一个remap过程是用户可选的,可执行也可不执行。每当系统复位以后,lpc2000处理器就顺次执行上述四个过程,下面分析这几个阶段。为简化起见,以总线不开放的lpc2104处理器为例。
  lpc2106的片上存储器分类
  lpc2104片内的存储器类型只有两种:flash块和sram块。其中,部分flash存储器块在芯片出厂前由philips写入了bootload程序和64字节的异常向量表。为方便讨论,我们称这部分flas
h块为bootload子块,其大小为8kb。如前所述,在处理器未上电之前或复位时,flash块和sram块仅仅是两个没有地址编码的物理存储器,与地址编码尚未建立起实际的映射关系。
  memory map
  lpc2104处理器(上电)复位以后,flash块和sram块的地址映射结果为:sram占据0x40000000—0x40003fff范围的地址编码空间;flash占据0x00000000—0x0001ffff范围的地址编码空间。该映射结果是个中间态,只存在极短的时间,应用系统开发人员无法看到这个中间态。处理器内核外围模块的地址映射结果为0xe0000000—0xffffffff。
  异常向量部分,共计64字节大小。用户可以编程决定何时remap、remap之后是否再修改异常向量表以及如何修改异常向量表等等。需要强调的是,引发remap动作的指令与建立sram块中异常向量的所有功能代码全部驻留在flash块的用户编程区中,是用户应用软件的一部分。
  曾经有网友对philips在lpc2000系列处理器中引入这个可选的remap功能提出质疑:lpc2000系列处理器片内的flash块被分割成了两组,每组都配备了相互独立的128位宽度的读取缓冲,
在绝大多数情况下,cpu从flash块的访问是全速进行的,不存在有等待的状况;另一方面,一般应用lpc2000的嵌入式系统并不需要动态地改变异常向量表。因此,对片内sram进行remap后,并不能提高处理器对异常的响应能力,实际意义不大。
  事实上,lpc2000系列处理器引入sram的remap功能对于iap操作具有重要的意义。相对于其它基于arm7dmi内核的处理器而言,lpc2000系列处理器有一个独具特的功能—iap。在iap擦除/写入操作时,片上flash块,包括该块上的异常向量部分,是无法被访问读取的,为了在iap擦除/写入操作时有效地响应异常,必须在调用iap擦除/写入操作之前,将sram中的异常向量部分提前映射到系统的异常向量表地址空间上。(待续)
 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。