这次首要说说第一次搞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下的发动代码的了解。