8051 與 AndesCoreTM 的軟件差異與移植
1. 8051 與 AndesCoreTM
本文引用地址:http://2s4d.com/article/277992.htm本文將介紹使用 8051 與 AndesCore?差異事項(xiàng),并對(duì)兩種 CPU 系統(tǒng)相關(guān)事 項(xiàng)做說(shuō)明,后面再介紹從 8051 移植到 AndesCore?上注意事項(xiàng),舉中斷向量表 及異常處理函數(shù)的例子說(shuō)明差異及移植,最后簡(jiǎn)要介紹 AndesCore?在 MCU 應(yīng) 用的三款CPU:N705,N801 和 N968A。
2. 8051 與 AndesCoreTM 常見(jiàn)差異事項(xiàng)
2.1. 位寬的差異
位寬是指處理器一次執(zhí)行指令的數(shù)據(jù)帶寬。8051 是 8 位寬的處理器, 而 AndesCore?是 32 位寬的處理器,支持 32 位與 16 位的混合指令集,位數(shù)越寬, 在數(shù)據(jù)的處理方面就更有效率。
8051 指令例子: MOV A, Rn ; 寄存器傳送到累加 INC A ; 累加器加 1 AndesCore?指令例子: 1. 32 位指令 MOVI Rt, imm20s ; 將一個(gè)立即數(shù) imm20s 賦于寄存器 Rt ADDI Rt, Ra, imm15s ; 將一個(gè)立即數(shù) imm15s 與 Ra 相加結(jié)果賦于 Rt 2. 16 位指令: 在操作數(shù)范圍較小時(shí),可以被編譯成 16 位指令 MOVI55 Rt5, imm5s ; ADDI333 Rt3, Ra3, imm3u ; |
2.2. 指令差異
8051 匯編語(yǔ)言共有 111 條指令集,AndeStar?的 V3m 指令集有 157 條, AndeStar?的 V3 指令集有 200 多條,兩種 CPU 的指令集大概可以分為以下幾 類(lèi):算術(shù)運(yùn)算,如加,減,乘,除等操作;數(shù)據(jù)傳送,如數(shù)據(jù)在寄存器,內(nèi)存間 的傳送,賦值等;邏輯跳轉(zhuǎn),如函數(shù)呼叫,無(wú)條件跳轉(zhuǎn),條件跳轉(zhuǎn),中斷返回等; 在 AndesCore?中還有特權(quán)模式的指令部分,關(guān)于兩種指令集的具體差別,可 以分別參考對(duì)應(yīng)的指令集介紹文檔。
2.3. 地址空間映像差異
AndesCore?使用 memory map 方式映像地址空間,主要有兩種,內(nèi)存的空 間映射,如其中的 RAM 或 ROM 地址,它們用于存放程序運(yùn)行時(shí)的代碼和數(shù)據(jù), 在 AndesCore?上代碼在 link 后,程序運(yùn)行的代碼和數(shù)據(jù)地址會(huì)最終確定, Andes 提供了一個(gè)簡(jiǎn)便的 link script 工具 sag,可以很方便的對(duì)系統(tǒng)中可用的內(nèi) 存空間進(jìn)行分配設(shè)定。
另一個(gè)是外設(shè)所對(duì)應(yīng)的地址空間,可以通過(guò)查看 SoC 對(duì)應(yīng)的手冊(cè)了解對(duì)應(yīng)的 外設(shè)映射的空間范圍及相應(yīng)的使用方法。
2.4. 堆棧設(shè)置差異
8051 的堆棧的起始位置是固定的(部分衍生 8051 可以做程序設(shè)定),它通 常固定在片內(nèi)的 RAM 中,8051 內(nèi)存空間有限,非常小,程序中所使用的變量 存放于特定的數(shù)據(jù)空間中,并不會(huì)放在堆??臻g,所以在 8051 中所需要的堆棧 空間很小。而對(duì)于 AndesCore?來(lái)說(shuō),堆棧可以設(shè)置在任意合適的 RAM 上。程 序運(yùn)行時(shí)所有的局部變量都存放在堆棧中,只需要確保在設(shè)計(jì)系統(tǒng)的時(shí)候有足夠 的堆??臻g。在 AndesCore?中有$sp 寄存器表示棧頂位置,這需要在系統(tǒng)上電 或者是系統(tǒng) reset 后初始化時(shí)進(jìn)行設(shè)置。
2.5. 代碼和數(shù)據(jù)的存儲(chǔ)差異
在 8051 系列單片機(jī)中,數(shù)據(jù)存儲(chǔ)區(qū)可以分為內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)以及外部數(shù)據(jù) 存儲(chǔ)區(qū)。
內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)有幾個(gè)區(qū)別:data,bdata,idata。
data : 片內(nèi) RAM 直接尋址區(qū)。bdata: 片內(nèi) RAM 位尋址區(qū)。idata: 片內(nèi) RAM
間接尋址區(qū)。
外部數(shù)據(jù)存儲(chǔ)區(qū)又有:xdata,pdata。
xdata 和 pdata:是外部存儲(chǔ)區(qū),有些芯片會(huì)帶有 XRAM。
在有些開(kāi)發(fā)工具中,如 Keil,可以通過(guò)設(shè)置存儲(chǔ)模式來(lái)處理,存儲(chǔ)模式?jīng)Q定 了默認(rèn)的存儲(chǔ)器類(lèi)型,此存儲(chǔ)器類(lèi)型將應(yīng)用于函數(shù)參數(shù),局部變量和定義時(shí)未包含 存儲(chǔ)器類(lèi)型的變量。
SMALL 所有的變量存放在片內(nèi) RAM(data 區(qū)間)
COMPACT 所有的變量存放在外部存儲(chǔ)區(qū)(pdata 區(qū)間)
LARGE 所有的變量存放在外部存儲(chǔ)區(qū)(xdata 區(qū)間)
AndesCore?以內(nèi)存映射的方式,內(nèi)存空間不會(huì)有特別的限制,就是說(shuō)不會(huì) 像 8051 那樣需放在某處區(qū)間,這樣的設(shè)計(jì)更方便靈活,允許程序代碼和數(shù)據(jù)在 可用的空間里自由放置。
有時(shí)候需要將某段代碼或者數(shù)據(jù)存放在指定的位置上,在 8051 中,可以在 代碼中使用"at"關(guān)鍵字,但該關(guān)鍵字是 8051 中所特有的,會(huì)造成可移植性和維 護(hù)的問(wèn)題,在 AndesCore?上,提供了一種簡(jiǎn)便的 link script 工具,如上所提到 的 sag 工具,在 C 代碼中使用 GNU 標(biāo)準(zhǔn)的語(yǔ)法格式,在 link 之后相應(yīng)的代碼和 數(shù)據(jù)將存放于指定的位置,這樣可以避免在代碼中使用"at"該平臺(tái)相關(guān)的屬性設(shè) 置。
2.6. 數(shù)據(jù)類(lèi)型及對(duì)齊差異
8051 和 AndesCore?是不同類(lèi)型的 CPU,它們所使用的數(shù)據(jù)類(lèi)型所對(duì)應(yīng)的寬 度也不同,如下表所示:
Type | AndesCore? | 8051 | Notes |
char | 8-bit signed | 8-bit signed | |
short | 16-bit | 16-bit | |
int | 32-bit | 16-bit | int is smaller on 8051 |
long | 32-bit | 32-bit | |
long long | 64-bit | N/A | |
float | 32-bit | 32-bit | |
double | 64-bit | 32-bit | 8051 has no 64-bit floating point type |
long double | 64-bit | N/A |
在鏈接完成后數(shù)據(jù)通常都會(huì)按照本身的屬性對(duì)齊,比如 int 類(lèi)型則會(huì) 4 bytes對(duì)齊,short 則會(huì) 2 bytes 對(duì)齊。這樣的存放方式可以提高 CPU 對(duì)數(shù)據(jù)讀取時(shí)的 效率。雖然 AndesCore?是 32bit 的 CPU, 在只需要 8bit 和 16bit 的數(shù)據(jù)時(shí)能 節(jié)省存儲(chǔ)空間,但在處理 16bit 和 32bit 的數(shù)據(jù)上則有更高效。
在 8051 中有 sbit 關(guān)鍵字用于設(shè)置對(duì)特殊功能寄存器 SFR 的直接訪問(wèn),8051的特殊功能寄存器分布在內(nèi)存地址 0x80 到 0xFF 處,如下表:
F8H | FFH | |||||||
F0H | B * | F7H | ||||||
E8H | EFH | |||||||
E0h | ACC * | E7H | ||||||
D8H | DFH | |||||||
D0H | PSW * | D7H | ||||||
C8H | T2CON * | RCAP2L | RCAP2H | TL2 | TH2 | CFH | ||
C0h | C7H | |||||||
B8H | IP * | BFH | ||||||
B0h | P3 * | B7H | ||||||
A8h | IE * | AFH | ||||||
A0H | P2 * | A7H | ||||||
98H | SCON * | SBUF | 9FH | |||||
90H | P1 * | 97H | ||||||
88h | TCON * | TMOD | TL0 | TL1 | TH0 | TH1 | 8FH | |
80H | P0 * | SP | DPL | DPH | PCON | 87H |
sbit 是 8051 擴(kuò)展的變量類(lèi)型,非標(biāo)準(zhǔn) C 語(yǔ)法,移植的時(shí)候需要將其修改成標(biāo)準(zhǔn) C 操作語(yǔ)法,另外在 AndesCore?中,所有的寄存器都是單獨(dú)存在的,不 會(huì)占用內(nèi)存的空間。
2.7. 指針使用差異
8051 中兩種類(lèi)型的指針,分別是存儲(chǔ)器指針和通用指針,通用指針由 3 個(gè)字 節(jié)組成,第一個(gè)字節(jié)用來(lái)指明對(duì)應(yīng)的內(nèi)存類(lèi)型,所以這種類(lèi)型的指針類(lèi)型占用空 間更大也更慢,存儲(chǔ)器指針只能用來(lái)訪問(wèn)指定類(lèi)型的存儲(chǔ)器空間。
通用指針: 通用指針的聲明和標(biāo)準(zhǔn) C 語(yǔ)言中一樣 char *s; /* string ptr */ int *numptr; /* int ptr */ long *state; /* long ptr */ 存儲(chǔ)器指針: char data *str; /* ptr to string in data */ int xdata *numtab; /* ptr to int(s) in xdata */ |
而在 AndesCore?上指針不會(huì)有這方面的限制,它是一個(gè) 32bit 的數(shù)據(jù),普通的寄存 器就 可以 存放指針 內(nèi)容 ,可 以訪問(wèn)到 系統(tǒng) 4G 范圍內(nèi)的 空間 (N705,N801 地址空間只有 16M,N968A 以上的 CPU 地址空間可達(dá) 4G)。
2.8. 函數(shù)聲明差異
在 8051 中由于堆棧空間有限,如果有函數(shù)是可重入的,需要在函數(shù)聲明的 時(shí)候用關(guān) 鍵字 reentrant 做說(shuō)明。 8051 的中斷處理 函數(shù)則 需要 使用關(guān)鍵字 interrupt 聲明,中斷處理函數(shù)有時(shí)也需要用 using 關(guān)鍵字指明哪一寄存器組會(huì)被 使用到。
在 AndesCore?中,都采用標(biāo)準(zhǔn)的 C 語(yǔ)法,在聲明函數(shù)時(shí)并不需要這些附加 的聲明。AndesCore?遵行底層的 ABI 機(jī)制,編譯器處理底層的寄存器及堆棧相 關(guān)機(jī)制。對(duì)于上層用戶來(lái)說(shuō)是透明的。
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論