这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » ARM菜鸟成长记--之二

共1条 1/1 1 跳转至

ARM菜鸟成长记--之二

助工
2014-12-18 19:44:25     打赏

这次主要说说第一次搞ARM特别是从51直接跳到ARM的必须面对的几个概念:REMAP、Bootloader、Flashloader。


1、REMAP:
    提到REMAP。首先应想到什么是MAP,英语不好,开始就断章取义,MAP就是地图嘛,Memory Map就是存储器地图,不过这个地图的参考坐标不是经纬度,而是地址,进而叫做存储器映射。由于要适应不同存储器容量要求的用途,ARM处理器本身的RAM、ROM并不是足够大,所以很多时候要外扩一些存储器,Norflash、NANDFlash、SDRAM、SRAM……而对于ARM来说怎么识别这些不同的存储器呢,只能给每个分配一个独立的地址,就相当于每个人有不同的名字。片内存储器的地址一般出厂就固化好的,片外的话就根据每个存储器所连接的外部总线片选而具有不同的地址。


    所以REMAP,顾名思义就是存储器的重新映射,即某些存储器的地址又发生了变化。我就很不理解了,这地址本来就不好记,还变来变去的,麻不麻烦呀,学51的时候咋就没这玩意呢?后来查了些资料,有些明白了,51是8位机,更重要的是51的主频不高,8位的ROM或Flash足够匹配51的主频,不用插入等待指令,所以程序直接在ROM或Flash中跑影响不到系统的速度。而ARM就不同了,ARM是32位机,但是Flash一般是8位或16位,32位的也有吧,好像价格很高。而且ARM的制品很高,动辄上百M,所以Flash的工艺达不到这个速度。如果程序跑在Flash中就要插入过多的等待指令,所以会影响ARM的性能。而RAM一般存取速度比较快,很容易构成32位,可以与高速的ARM匹配。更重要的是ARM上电后必须从0x0地址处取得指令,因此上电后必须将ROM或Flash映射位0X0地址处,当时还产生了一个弱智的想法,既然RAM这么好,为啥还要ROM或Flash,直接将程序下载到RAM中不就得了,后来才猛地想到RAM是易失型存储器,掉电后啥也没了,再上电后0X0处啥都没有。而且还有一条,ARM的中断向量表,既存放各个中断入口地址的地方,一般放在0x0处,即ROM或Flash中,为了加快中断响应速度,也应该将0X0映射到RAM中去。因此,ARM一般从ROM或Flash启动完成初始化,然后将应用程序拷贝到RAM,然后跳到RAM执行。


    刚才说的是,为啥要REMAP,接下来说怎么REMAP。开始的时候我就不清楚,都说REMAP,那怎么才能完成REMAP呢?都是手册看得少呀,其实上面说的已经很清楚了,我们用的at91sam9260更是简单,有专门的寄存器可以配置,MATRIX_MRCR—Master Remap Control Register,向这个寄存器相应位写1就可以了。网上还看到Samsung的某些ARM可以通过编程相应Bank寄存器改变其起始地址,来实现REMAP。


    下面以我们的at91sam9260的板子为例详细说说我对at91sam9260 REMAP的理解,开始Flash没有任何程序,当然也没有REMAP,此时将BMS接高,然后上电,此时的0X0地址处位于片内的ROM,由于ROM内好像固化了引导程序,所以此时串口会输出“Rom Boot…>”字样。而内部的SRAM0的起始地址还是在0x20 0000处,而片外Norflash起始地址是0x1000 0000处。然后我们利用h-flasher或J-Flash将生成的Bin文件下载到Norflash内,即起始地址为0x1000 0000处。然后将BMS接低,此时Norflash被映射在0X0地址处,即此时Norflash的起始地址为0X0,(你可能要问那ROM的地址现在在哪儿呢?我也不知道,因为Norflash的地址范围是0X0~0X1F FFFF,而ROM的起始地址默认是0X10 0000,恰好在Norflash的范围内,所以此时ROM哪儿去了?)此时上电,因为0X0地址处即Norflash起始地址有八个合法的中断向量,程序会从Norflash启动,接着执行启动代码,初始化SMC、PMC,然后Copy中断向量表到内部SRAM0,然后,将MATRIX_MRCR寄存器相应位置1,实现REMAP,此时,Norflash的起始地址又变回0X1000 0000,而内部的SRAM0的起始地址又变回0x0了,系统如果发生异常,将从地址0X0处即内部SRAM0取中断向量,而内部SRAM的访问速度显然高于外部的Norflash,所以提高程序性能。这是我对at91sam9260 REMAP的理解,欢迎讨论指教。


2、Bootloader:


    说实话,这个概念到现在也不是很明白。可能对于裸奔的系统来说,Bootloader这个概念本身就比较模糊吧,望文生义的话,Boot,靴子,Load,穿上靴子走路才比较舒服(这个比喻好像比较烂喔),对于ARM来说,初始化好,并将向量表以及数据什么的拷贝到RAM,运行起来才顺畅。就是传说中的引导装载。所以我理解的Bootloader就是完成ARM的初始化、建立中断向量表并映射到RAM中、将数据段和必要的代码段拷贝到RAM、完成REMAP、跳转到Main,这一系列过程。说白了就是启动代码干的活。这个理解我自己都感觉很牵强,还请大家多多指点。


3、Flashloader:
    这个概念更是模糊,总感觉跟Bootloader差不多,只不过Flashloader可以实现对Flash的读写、擦除等操作,并与调试软件配合实现将程序下载到Flash中。IAR中有一个选项:Use Flashloader,不过好像一般都是针对片内Flash的,我们的板子是外扩的Norflash,好像就没有用到这个东东。


接下来准备说说基于KEIL MDK下的启动代码的理解。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]