8051與AndesCore的軟件差異與移植
3. 系統(tǒng)相關(guān)事項(xiàng)說(shuō)明
本文引用地址:http://butianyuan.cn/article/277989.htm3.1. 操作模式
8051只有一種mode,AndesCore™有兩種mode,分別是 superuser mode和user mode ,當(dāng)系統(tǒng)上電啟動(dòng)時(shí)是在 superuser mode,或者當(dāng)系統(tǒng)進(jìn)入到中斷或者異常時(shí)也進(jìn)入到superuser mode,當(dāng)從中斷或者是異常返回后,會(huì)返回到user mode 。由于8051沒(méi)有mode切換的問(wèn)題,所以在移植的時(shí)候只需要理解AndesCore™在mode方面的機(jī)制就可以。
3.2. 系統(tǒng)的啟動(dòng)
8051和AndesCore ™的系統(tǒng)啟動(dòng)過(guò)程類似,通常在0 地址存放中斷向量表,第一個(gè)向量表是reset,當(dāng)系統(tǒng)上電或者是reset 后,經(jīng)過(guò)該向量會(huì)跳轉(zhuǎn)到一個(gè)啟動(dòng)函數(shù)中,該啟動(dòng)函數(shù)會(huì)完成系統(tǒng)啟動(dòng)所必要的步驟,比如設(shè)置CPU,初始化SoC ,清理內(nèi)存,初始化 C 運(yùn)行環(huán)境等, 最后完成所有的準(zhǔn)備后跳轉(zhuǎn)到 main函數(shù)。
3.3. 中斷處理
8051有5 個(gè)中斷源,通常中斷向量表只是一個(gè)跳轉(zhuǎn),會(huì)跳到真正的中斷處理函數(shù),8051只能設(shè)置成兩級(jí)的中斷優(yōu)先級(jí)。
AndesCore™包含了9 個(gè)內(nèi)部異常,中斷向量號(hào)對(duì)應(yīng)于從 0 到8, 9 之后對(duì)應(yīng)于外部中斷,在Internal VIC (IVIC )mode時(shí)可支持32個(gè)外部中斷,
當(dāng)External VIC(EVIC) mode時(shí)由外部中斷控制器決定, 最多有64個(gè)。
中斷的處理由以下幾部分組成:
1. 實(shí)現(xiàn)中斷處理函數(shù)
可以用匯編實(shí)現(xiàn)8051 的中斷處理函數(shù),也可以用C 來(lái)實(shí)現(xiàn),在8051中C 實(shí)現(xiàn)的中斷處理函數(shù)會(huì)有一個(gè)"interrupt" 的關(guān)鍵字,如果有寄存器 bank被使用到,還要加上"using"關(guān)鍵字。如果要將中斷處理函數(shù)固定在特定位置還需要使用"at" 關(guān)鍵字,而 AndesCore™使用的是標(biāo)準(zhǔn)的 C 語(yǔ)法,不需要為中斷處理函數(shù)做這些設(shè)置。
2. 中斷向量表的產(chǎn)生
8051 中斷向量表擺放在 0 開(kāi)始的位置,在AndesCore™中硬件可以設(shè)定啟動(dòng)地址,通常設(shè)為 0 地址,也可以是非 0 地址,中斷向量表存放在對(duì)應(yīng)系統(tǒng)啟動(dòng)地址處。在程序編寫(xiě)過(guò)程中可以通過(guò)標(biāo)準(zhǔn)的gnu 語(yǔ)法再加上link script 的sag 工具,以使產(chǎn)生的中斷向量表在鏈接的時(shí)候存放于特定的位置。
3. 中斷配置
在8051中,需要做以下設(shè)置
1. IE 寄存器中Individual Interrupt Enable 位設(shè)1
2. IE 寄存器中EA(Enable All)位設(shè)1
3. 當(dāng)是外部中斷時(shí),配置相關(guān)的pin 為輸入,并設(shè)置對(duì)應(yīng)的觸發(fā)屬性為edge或level 觸發(fā)。
而在AndesCore™中需要做以下設(shè)置:
1 .設(shè)置CPU IVIC 或者 EVIC mode
2 .設(shè)置INT_MASK位
3 .設(shè)置中斷的優(yōu)先級(jí)
4. 關(guān)于異常處理差異
在8051中沒(méi)有異常處理向量,所以在8051中并沒(méi)有這部分的處理函數(shù),在AndesCore™中有一些系統(tǒng)的exception 中斷向量,比如Machine Error,GeneralException, 建議在AndesCore ™上實(shí)現(xiàn)對(duì)應(yīng)的處理函數(shù), 當(dāng)發(fā)生這類異常時(shí)做一些基本的處理。
3.4. 時(shí)序和延遲
在8051中可以采用NOP指令來(lái)延遲,在 AndesCore™中也有NOP指令來(lái)達(dá)到類似目的。
3.5. 電源管理
8051 單片機(jī)中有兩種省電方式,分別是空閑方式和掉電模式, 單片機(jī)處于空閑工作方式時(shí),CPU處于睡眠狀態(tài),它的片內(nèi)其它部件還是會(huì)繼續(xù)工作,片內(nèi)RAM的內(nèi)容和所有專用寄存器的內(nèi)容在空閑方式期間都被保存下來(lái)了, 可以通過(guò)中斷或者硬件復(fù)位來(lái)終止空閑工作方式。單片機(jī)處于掉電工作方式時(shí),片內(nèi)的振蕩器停止了工作,因此它的一切都被迫停止了。但片內(nèi) RAM的內(nèi)容和專用寄存器的內(nèi)容一直保持到掉電方式結(jié)束為止。掉電方式的喚醒方式只有一種,就是硬件復(fù)位。
在AndesCore™上,可以通過(guò)軟件standby 指令使CPU進(jìn)入到低功耗模式,通常標(biāo)準(zhǔn)c 代碼并不能直接控制硬件,Andes 的compiler 提供了intrinsic 函數(shù)來(lái)做到這點(diǎn)。分別是:__nds32_standby_no_wake_grant(), __nds32_standby_wake_grant(),__nds32_standby_wait_done().指定系統(tǒng)進(jìn)入低功耗模式時(shí)被喚醒的方式,分別是外部中斷中斷喚醒,電源管理模塊喚醒,和中斷配合電源管理模塊喚醒,可以根據(jù)系統(tǒng)需要分別設(shè)計(jì)。
4. 從8051移植到AndesCore上注意事項(xiàng)
一個(gè)8051工程,當(dāng)移植到AndesCore™上時(shí)有以下注意事項(xiàng):
1. 內(nèi)存映射,代碼和數(shù)據(jù)擺放位置相關(guān)的設(shè)置。
2. 可以不必考慮變量數(shù)目,或者是函數(shù)的overlay, 因?yàn)樵?2bit 的AndesCore™上開(kāi)發(fā)時(shí)內(nèi)存空間通常不會(huì)像 8051那樣小。
3. 如果空間允許,在 AndesCore™上盡量使用32bit的數(shù)據(jù)類型,這樣效率會(huì)更高。
4. 在8051上用于表示內(nèi)存區(qū)域?qū)傩缘臉?biāo)志如(idata, xdata, bdata, pdata 等)在AndesCore™上可以移除。
5. 在8051上不需要設(shè)置內(nèi)存區(qū)塊模式,比如:small, compact, large 等。
6. 在8051 上用于表示對(duì)像遠(yuǎn)近的屬性"near" 和"far",都可以移除,AndesCore™上的指針的訪問(wèn)可以達(dá)到所有地址空間。
7. 在中斷處理函數(shù)中不需要像8051那樣指定哪塊寄存器塊會(huì)被用到的關(guān)鍵字"using"。
8. 在8051上中斷處理函數(shù)就和普通的函數(shù)一樣,中不需要設(shè)置其它的關(guān)鍵字,如interrupt 。
9. 如果有8051匯編部分移植到 AndesCore™,需要重新實(shí)現(xiàn),盡可能的用c 來(lái)實(shí)現(xiàn),便于維護(hù)和調(diào)試。
10. 在8051中使用到的#progma 相關(guān)部分需要?jiǎng)h除。
11. 在AndesCore™中函數(shù)不需要聲明為"reentrant" 屬性。
12. 如果使用了數(shù)學(xué)運(yùn)算,在8051中默認(rèn)是使用32bit單精度浮點(diǎn),如果要
保持和8051 中相同的精度,需要將函數(shù)名做一些調(diào)整,如將 sin() 改成sinf()。
評(píng)論