让单片机运行速度更快一些
发布时间:2008/5/28 0:00:00 访问次数:726
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(programcounter)=0x2800100,程序从pc指定的地方执行,首先执行初始化代码(bootcode),再执行主程序(appcode)。程序从flash中读取指令(code),来完成数据的传输——可能是sdram和内部寄存器的传输,sdram之间的传输,sdram和外设的传输,中断处理等各项工作。可见在程序运行时,很大一部分时间是从flash中读取指令,而这个过程是很费时间的。以假定的860t硬件平台为例,因为flash访问时间为100ns,所以读一条指令的时间至少是100ns,也就是说860t读一条指令的时候要等待100ns。(指令cache通过预取指令的方式,可以使实际取指令时间短一些,但这种方法的效果并不明显,况且很多单片机还没有指令cache。)
860t平台的内存分配如图1所示。
2将代码从flash搬运到sdram中的原理
通过上述分析,初始化代码bootcode只在程序启动的时候执行,就是慢一点,也可以接受。真正影响性能的是主程序(appcode),因为这里的代码在不停的重复执行,如果可以缩短它的取指令时间,则单片机的空闲时间将大大减少,性能也就提高了很多。sdram的速度比较快,如果将代码搬运到sdram中,取指令时间就减少了很多;而且sdram空间大,不会因为代码占用了一部分空间而影响性能。但这不仅仅是简单的搬运过程,有物理存储器地址的变化牵涉在这个过程中。将软件源代码转换成可执行的二进制映像包括三个步骤:首先,每一个源文件都必须被编译或汇编到一个目标文件(objectfile);第二步,所有的目标文件要连接成一个目标文件,它叫可重定位程序(relocationprogram);最后,在一个称为重定址(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的物理地址映射规则为:
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(programcounter)=0x2800100,程序从pc指定的地方执行,首先执行初始化代码(bootcode),再执行主程序(appcode)。程序从flash中读取指令(code),来完成数据的传输——可能是sdram和内部寄存器的传输,sdram之间的传输,sdram和外设的传输,中断处理等各项工作。可见在程序运行时,很大一部分时间是从flash中读取指令,而这个过程是很费时间的。以假定的860t硬件平台为例,因为flash访问时间为100ns,所以读一条指令的时间至少是100ns,也就是说860t读一条指令的时候要等待100ns。(指令cache通过预取指令的方式,可以使实际取指令时间短一些,但这种方法的效果并不明显,况且很多单片机还没有指令cache。)
860t平台的内存分配如图1所示。
2将代码从flash搬运到sdram中的原理
通过上述分析,初始化代码bootcode只在程序启动的时候执行,就是慢一点,也可以接受。真正影响性能的是主程序(appcode),因为这里的代码在不停的重复执行,如果可以缩短它的取指令时间,则单片机的空闲时间将大大减少,性能也就提高了很多。sdram的速度比较快,如果将代码搬运到sdram中,取指令时间就减少了很多;而且sdram空间大,不会因为代码占用了一部分空间而影响性能。但这不仅仅是简单的搬运过程,有物理存储器地址的变化牵涉在这个过程中。将软件源代码转换成可执行的二进制映像包括三个步骤:首先,每一个源文件都必须被编译或汇编到一个目标文件(objectfile);第二步,所有的目标文件要连接成一个目标文件,它叫可重定位程序(relocationprogram);最后,在一个称为重定址(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的物理地址映射规则为: