8051與AndesCore的軟件差異與移植
本文將介紹使用8051與AndesCore™差異事項,并對兩種CPU系統相關(guān)事項做說(shuō)明,后面再介紹從 8051移植到AndesCore ™上注意事項,舉中斷向量表及異常處理函數的例子說(shuō)明差異及移植,最后簡(jiǎn)要介紹AndesCore™在MCU應用的三款CPU: N705,N801 和N968A。
2. 8051與AndesCore常見(jiàn)差異事項
2.1. 位寬的差異
位寬是指處理器一次執行指令的數據帶寬。8051 是8 位寬的處理器, 而AndesCore™是32位寬的處理器,支持32位與 16位的混合指令集,位數越寬,在數據的處理方面就更有效率。
2.2. 指令差異
8051 匯編語(yǔ)言共有111 條指令集,AndeStar™的V3m指令集有 157 條,AndeStar™的V3指令集有 200 多條,兩種 CPU的指令集大概可以分為以下幾類(lèi):算術(shù)運算,如加,減,乘,除等操作;數據傳送,如數據在寄存器,內存間的傳送,賦值等;邏輯跳轉,如函數呼叫,無(wú)條件跳轉,條件跳轉,中斷返回等;在A(yíng)ndesCore ™中還有特權模式的指令部分,關(guān)于兩種指令集的具體差別,可以分別參考對應的指令集介紹文檔。
2.3. 地址空間映射差異
AndesCore™使用memory map 方式映射地址空間,主要有兩種,內存的空間映射,如其中的RAM或ROM地址,它們用于存放程序運行時(shí)的代碼和數據,在A(yíng)ndesCore™上代碼在link 后,程序運行的代碼和數據地址會(huì )最終確定,Andes 提供了一個(gè)簡(jiǎn)便的 link script 工具sag ,可以很方便的對系統中可用的內存空間進(jìn)行分配設定。
另一個(gè)是外設所對應的地址空間,可以通過(guò)查看SoC 對應的手冊了解對應的外設映射的空間范圍及相應的使用方法。
2.4. 堆棧設置差異
8051的堆棧的起始位置是固定的(部分衍生 8051可以做程序設定),它通常固定在片內的RAM中,8051 內存空間有限,非常小,程序中所使用的變量存放于特定的數據空間中,并不會(huì )放在堆??臻g,所以在 8051中所需要的堆??臻g很小。而對于 And esCore™來(lái)說(shuō),堆??梢栽O置在任意合適的 RAM上。程序運行時(shí)所有的局部變量都存放在堆棧中,只需要確保在設計系統的時(shí)候有足夠的堆??臻g。在 AndesCore™中有$ sp寄存器表示棧頂位置,這需要在系統上電或者是系統reset 后初始化時(shí)進(jìn)行設置。
2.5. 代碼和數據的存儲差異
在8051 系列單片機中,數據存儲區可以分為內部數據存儲區以及外部數據存儲區。
內部數據存儲區有幾個(gè)區別:data ,bdata,idata。
data : 片內RAM直接尋址區。bdata: 片內RAM位尋址區。idata: 片內 RAM間接尋址區。
外部數據存儲區又有:xdata,pdata。
xdata 和pdata:是外部存儲區,有些芯片會(huì )帶有 XRAM 。
在有些開(kāi)發(fā)工具中,如K eil,可以通過(guò)設置存儲模式來(lái)處理,存儲模式?jīng)Q定了默認的存儲器類(lèi)型, 此存儲器類(lèi)型將應用于函數參數, 局部變量和定義時(shí)未包含存儲器類(lèi)型的變量。
SMALL 所有的變量存放在片內 RAM(data 區間)
COMPACT 所有的變量存放在外部存儲區(pdata 區間)
LARGE 所有的變量存放在外部存儲區(xdata 區間)
AndesCore™以?xún)却嬗成涞姆绞?,內存空間不會(huì )有特別的限制,就是說(shuō)不會(huì )像8051那樣需放在某處區間,這樣的設計更方便靈活,允許程序代碼和數據在可用的空間里自由放置。
有時(shí)候需要將某段代碼或者數據存放在指定的位置上,在8051 中,可以在代碼中使用"at" 關(guān)鍵字,但該關(guān)鍵字是 8051 中所特有的,會(huì )造成可移植性和維護的問(wèn)題,在 AndesCore™上,提供了一種簡(jiǎn)便的 link script 工具,如上所提到的sag 工具,在 C 代碼中使用GNU標準的語(yǔ)法格式,在 link 之后相應的代碼和數據將存放于指定的位置,這樣可以避免在代碼中使用"at" 該平臺相關(guān)的屬性設置。
2.6. 數據類(lèi)型及對齊差異
8051和AndesCore ™是不同類(lèi)型的CPU,它們所使用的數據類(lèi)型所對應的寬度也不同,如下表所示:
在鏈接完成后數據通常都會(huì )按照本身的屬性對齊,比如int 類(lèi)型則會(huì )4 bytes對齊,short則會(huì )2 bytes對齊。這樣的存放方式可以提高 CPU對數據讀取時(shí)的效率。雖然AndesCore™是32bit的CPU, 在只需要8bit 和16bit的數據時(shí)能節省存儲空間,但在處理16bit 和32bit的數據上則有更高效。
在8051中有sbit 關(guān)鍵字用于設置對特殊功能寄存器 SFR的直接訪(fǎng)問(wèn),8051的特殊功能寄存器分布在內存地址0x80到0xFF處,如下表:
sbit 是8051擴展的變量類(lèi)型,非標準 C 語(yǔ)法,移植的時(shí)候需要將其修改成標準C 操作語(yǔ)法,另外在A(yíng)ndesCore™中,所有的寄存器都是單獨存在的,不會(huì )占用內存的空間。
2.7. 指針使用差異
8051中兩種類(lèi)型的指針,分別是存儲器指針和通用指針,通用指針由3 個(gè)字節組成,第一個(gè)字節用來(lái)指明對應的內存類(lèi)型,所以這種類(lèi)型的指針類(lèi)型占用空間更大也更慢,存儲器指針只能用來(lái)訪(fǎng)問(wèn)指定類(lèi)型的存儲器空間。
而在A(yíng)ndesCore™上指針不會(huì )有這方面的限制,它是一個(gè) 32bit的數據,普通的寄存器就可以存放指針內容,可以訪(fǎng)問(wèn)到系統4G 范圍內的空間(N705,N801地址空間只有 16M,N968A以上的 CPU地址空間可達4G)。
2.8. 函數聲明差異
在8051中由于堆??臻g有限,如果有函數是可重入的,需要在函數聲明的時(shí)候用關(guān)鍵字reentrant 做說(shuō)明。8051 的中斷處理函數則需要使用關(guān)鍵字interrupt 聲明,中斷處理函數有時(shí)也需要用 using 關(guān)鍵字指明哪一寄存器組會(huì )被使用到。
在A(yíng)ndesCore™中,都采用標準的 C 語(yǔ)法,在聲明函數時(shí)并不需要這些附加的聲明。AndesCore™遵行底層的ABI 機制,編譯器處理底層的寄存器及堆棧相關(guān)機制。對于上層用戶(hù)來(lái)說(shuō)是透明的。
評論