本文就怎么进步单片机的运转速度与读者们打开讨论。
1 问题的提出
1.1 硬件技能布景
单片机的频率越来越高,RAM的拜访速度也来也快,但单片机体系的功率并不一定成份额的进步。
现在,运用的干流单片机有80386EX(50MHz,外部地址/数据总线16位)、MPC860T(66MHz,外部地址/数据总线32位)以及DS80C32(25MHz,外部地址/数据总线8位);运用的SDRAM有HY57系列、K416系列(拜访速度100MHz或133MHz);运用的SRAM 如IDT71024、IDT7256(50MHz);运用的Flash有AT29C512、SST39VF040、AT29C010(8MHz或15MHz)等。可见,SDRAM,SRAM的速度和单片机是匹配的,乃至比单片机的速度更快一点,不需要单片机刺进等候状况。而flash的拜访频率则比单片机慢2~6倍,单片机往往要经过刺进多个等候状况来和它相匹配,何况Flash多为8位,而当时单片机多为16,32位,更多的降低了单片机的作业功能。
依据上述剖析,假如进步Flash的拜访速度,扩展Flash为16位或32位,那么程序履行的速度就快了,单片机的功能也就进步了。假如能够将这一主意变成现实,并且本钱低价的话,那是最好不过的工作。现实上,能够将8位的Flash扩展为16位、乃至32位,但要支付2~4倍的本钱。由于Flash结构及工艺原因,在现在不行能有高达66MHz的商用化且价格低价的Flash。所以,只能经过其它办法来提高单片机的运转速度。
1.2 软件技能布景
首要,看看传统单片机程序的运转原理,为了便于阐明,假定硬件渠道为860T,时钟为50MHz;SDRAM空间4M×32bit,地址规模从0x00000000~0x00FFFFFF,拜访时刻10ns;Flash空间512K×8bit,拜访时刻为100ns,地址规模从0x02800000~0x0287FFFF(至于其它单片机,运转原理大致相同,能够类推)。860T在上电后,PC(Program Counter)=0x2800100,程序从PC指定的当地履行,首要履行初始化代码(BootCode),再履行主程序(AppCode)。程序从Flash中读取指令(code),来完结数据的传输——可能是SDRAM和内部寄存器的传输,SDRAM之间的传输,SDRAM和外设的传输,中止处理等各项作业。可见在程序运转时,很大一部分时刻是从Flash中读取指令,而这个进程是很费时刻的。以假定的860T硬件渠道为例,由于Flash拜访时刻为100ns,所以读一条指令的时刻至少是100ns,也便是说860T读一条指令的时分要等候100ns。(指令cache经过预取指令的办法,能够使实践取指令时刻短一些,但这种办法的作用并不显着,何况许多单片机还没有指令cache。)
860T渠道的内存分配如图1所示。
图1传统单片机的内存分配形式
2 将代码从Flash转移到SDRAM中的原理
经过上述剖析,初始化代码BootCode只在程序发动的时分履行,便是慢一点,也能够承受。真实影响功能的是主程序(AppCode),由于这儿的代码在不断的重复履行,假如能够缩短它的取指令时刻,则单片机的闲暇时刻将大大削减,功能也就进步了许多。SDRAM的速度比较快,假如将代码转移到SDRAM中,取指令时刻就削减了许多;并且SDRAM空间大,不会由于代码占用了一部分空间而影响功能。但这不仅仅是简略的转移进程,有物理存储器地址的改动牵涉在这个进程中。将软件源代码转换成可履行的二进制映像包含三个进程:首要,每一个源文件都有必要被编译或汇编到一个方针文件(object file);第二步,一切的方针文件要连接成一个方针文件,它叫可重定位程序(relocation program);最终,在一个称为重定址(relocation)的进程中,要把物理存储器地址指定给可重定位程序里的每个相对偏移处,生成一个可履行的二进制映像文件。假如在Flash中运转,则一切的物理存储器地址应该在Flash的地址空间中。假如要在RAM中运转,则一切的物理存储器地址应该在Flash的地址空间之中。也便是说,假如要使从Flash中转移到SDRAM中的代码可用,则有必要改动被转移代码的物理存储器地址。
3 转移代码的完结办法
下面结合假定的硬件渠道,详细描述物理存储器地址重定位,代码转移的原理及进程。咱们编写两个c文件——RomTool.c、RAMapp.c。
RomTool.c完结860T初始化,SDRAM的改写,中止及外设的初始化;Flash到SDRAM的代码转移驱动模块及跳转模块。对应的二进制映像文件为RomTool.bin。
RAMapp.c是实践的应用程序, 对应的二进制映像文件为RAMapp .bin。RAMapp.bin被转移后在SDRAM中运转。
3.1 物理存储器地址映射规矩
RomTool.c的物理地址映射规矩为:数据放在开始为0x3000,巨细为0xf0000的SDRAM空间里;代码被烧结在开始为0x02800000,巨细为0x10000的Flash空间里,不会被转移,也在该空间里运转。
所以在RomTool.lnx中指定的定位规矩也应该是这个地址规模,如下:
MEMORY
{
ram1: ORIGIN = 0x00003000, LENGTH = 0xf000
flash: ORIGIN = 0x02800000, LENGTH = 0x1000
}
SECTIONS
{
.data : {} > ram1
.text : {} > flash
}
RamApp.c的物理地址映射规矩为:
数据放在开始为0x3000,巨细为0xf0000的空间里;代码被烧结在开始为0x02810000,巨细为0x70000的Flash中,它要被转移到开始为0x00F00000,巨细为0x70000的SDRAM空间里,即RamApp.Bin实践在SDRAM中运转。