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