新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM嵌入式系統(tǒng)初始化過程

ARM嵌入式系統(tǒng)初始化過程

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
基于ARM內(nèi)核微處理器的系統(tǒng)一般為復(fù)雜的片上系統(tǒng),這種復(fù)雜系統(tǒng)的多數(shù)硬件模塊都是可配 置的,需要軟件設(shè)置為特定的工作狀態(tài),因此在用戶的應(yīng)用程序之前,需要有一些專門的代碼完成對(duì)系統(tǒng)的初始化。由于這類代碼直接面對(duì)ARM處理器內(nèi)核和硬件 控制器,一般都使用匯編語言完成。初始化代碼完成的操作與具有的硬件平臺(tái)相關(guān),但一般包括一下的內(nèi)容:
--初始化異常向量表(中斷向量表)
--初始化存儲(chǔ)器系統(tǒng)
--初始化堆棧
--初始化有特殊要求的端口和設(shè)備
--初始化應(yīng)用程序的運(yùn)行環(huán)境
--調(diào)用主應(yīng)用程序
1、初始化異常向量表(中斷向量表)
ARM微處理器結(jié)構(gòu)要求中斷向量表必須放置在從0x00地址開始的連續(xù)8×4字節(jié)的空間內(nèi),每當(dāng)一個(gè)中斷(異常)發(fā)生以后,ARM微處理器便強(qiáng)制把PC置 為對(duì)應(yīng)的中斷向量。由于每個(gè)中斷只占用向量表中一個(gè)字(4個(gè)字節(jié))的存儲(chǔ)空間,只能放一條ARM指令,所以通常為跳轉(zhuǎn)指令,使程序從向量表跳轉(zhuǎn)到存儲(chǔ)器的 其他位置,執(zhí)行真正的中斷處理。
具體代碼實(shí)現(xiàn)如下:
AREA Init,CODE,READONLY
ENTRY
B Reset_Handler ;異常復(fù)位
B Undef_Handler ;未定義指令異常
B SWI_Handler ;軟件中斷
B PreAbort_Handler ;指令預(yù)取中止
B DataAbord_Handler ;數(shù)據(jù)中止
B . ;系統(tǒng)保留
B IRQ_Handler ;普通外部中斷
B FIQ_Handler ;快速外部中斷
..........
2、初始化存儲(chǔ)器系統(tǒng)
主要是對(duì)系統(tǒng)存儲(chǔ)器控制器(MMU)的初始化。由于存儲(chǔ)器控制器并不是ARM架構(gòu)的一部分,不同芯片的實(shí)現(xiàn)方式各不相同。由于運(yùn)算能力和尋址能力的強(qiáng)大, 基于ARM內(nèi)核的微處理器系統(tǒng)一般都需要外擴(kuò)展各種類型的存儲(chǔ)器。對(duì)于存儲(chǔ)器系統(tǒng)的初始化一般包括如下幾個(gè)方面:
--存儲(chǔ)器類型、時(shí)序和總線寬度的配置
--存儲(chǔ)器地址的配置
(1)存儲(chǔ)器類型
基于ARM微處理系統(tǒng)的存儲(chǔ)器一般有如下幾類:SARM,DRAM,Flah,同時(shí),即使同類存儲(chǔ)器也有訪問速度上的不同。其中,SRAM和Flah屬于 靜態(tài)存儲(chǔ)器,可以共用存儲(chǔ)器端口,而DRAM有動(dòng)態(tài)刷新和地址復(fù)用等特征,需要專門的存儲(chǔ)器端口。
(2)時(shí)序
存儲(chǔ)器端口的接口時(shí)序優(yōu)化對(duì)系統(tǒng)性能影響非常大,因?yàn)橄到y(tǒng)運(yùn)行的速度瓶頸一般都存在于存儲(chǔ)器的訪問,因此希望存儲(chǔ)器的訪問盡可能快,但又要考慮由此帶來的 系統(tǒng)穩(wěn)定性問題。
(3)總線寬度
ARM微處理器架構(gòu)支持8/16/32位的數(shù)據(jù)總線寬度訪問存儲(chǔ)器和外設(shè),對(duì)于特定的存儲(chǔ)器來說,需要設(shè)定數(shù)據(jù)總線的寬度。
(4)存儲(chǔ)器地址的配置
ARM微處理器架構(gòu)理論上可以支持4GB的地址空間,而對(duì)于一個(gè)實(shí)際的系統(tǒng)來說,配置的物理地址遠(yuǎn)沒有這么多,因此,如何配置存儲(chǔ)器的地址,也是一個(gè)重要 的問題。
(5)存儲(chǔ)器地址重映射
存儲(chǔ)器地址重映射就是可以通過軟件配置來改變一塊存儲(chǔ)器物理地址的方法,是當(dāng)前許多先進(jìn)控制器所具有的功能。
進(jìn)行地址重映射的原因:提高系統(tǒng)的運(yùn)行效率。
進(jìn)行地址重映射的注意:保證程序流程的連續(xù)性。
有的ARM處理器不具有地址重映射的功能,可以采樣代碼搬移加跳轉(zhuǎn)的方式完成上述功能。
3、初始化堆棧
由于ARM微處理器有7中運(yùn)行模式,每一種模式的堆棧指針(SP)都是獨(dú)立的(其中系統(tǒng)模式和用戶模式使用相同的SP)。因此,需要對(duì)每一種模式的SP進(jìn) 行初始化。
采用的方法是:改變當(dāng)前程序狀態(tài)寄存器(CPSR)內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后初始化SP。但是對(duì)用戶模式下SP的初始化應(yīng)該放在最后, 因?yàn)锳RM微處理器進(jìn)入用戶模式之后就無法再切換到其他模式。
設(shè)置堆棧應(yīng)該注意的問題是:堆棧的大小根據(jù)需要確定,要盡可能給堆棧分配高速存儲(chǔ)器(例如片內(nèi)的SRAM)。堆棧性能的提高對(duì)提高系統(tǒng)整體性能的影響非常 顯著。
初始化堆棧的代碼如下:
MRS R0, CPSR
BIC R0, R0, #MODEMASK
ORR R1, R0, #IRQMODE
MSR CPSR_c, R1
LDR SP, =IRQStack
BIC R0, R0, #MODEMASK
ORR R1, R0, #FIQMODE
MSR CPSR_c, R1
LDR SP, =FIQStack
.........
4、初始化應(yīng)用程序和有特殊要求的端口和設(shè)備
該部分的初始化由具體的系統(tǒng)和用戶需求決定,一般的外設(shè)初始化可以放在系統(tǒng)初始化以后進(jìn)行。比較典型的應(yīng)用是驅(qū)動(dòng)一些簡單的輸出設(shè)備,例如LED等,用來 指示系統(tǒng)啟動(dòng)的進(jìn)程和狀態(tài)。初始化應(yīng)用程序的運(yùn)行環(huán)境,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸,初始化有特殊要求的端口、設(shè)備和應(yīng)用程序的運(yùn)行環(huán)境。
5、改變處理器的模式
ARM微處理器支持7種模式,其中:
超級(jí)模式(Supervisor):復(fù)位后的缺省模式。
多種特權(quán)模式變化:主要完成各模式的堆棧設(shè)置,注意不要進(jìn)入用戶模式。
用戶模式:用戶程序運(yùn)行模式。
6、調(diào)用應(yīng)用主程序
當(dāng)完成所有的系統(tǒng)初始化工作之后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最常見的操作是:
IMPORT C_Entry
......
B C_Entry


評(píng)論


技術(shù)專區(qū)

關(guān)閉