---嵌入式系統對功能、可靠性、成本、體積、功耗等均有嚴格要求,以arm體系結構為基礎的各種risc微處理器具有靈活的特性和強大的效能,在嵌入式系統中得到了廣泛的應用。
---s3c2410是三星公司基於arm920t設計的一款處理器,在開發基於s3c2410的系統的過程中,如何讓系統快速穩定地啟動是乙個重要問題。嵌入式系統的資源有限,程式通常都是固化在rom中執行。但在實際應用中,為提高系統的實時性,加快**的執行速度,系統啟動後程式往往要被搬移到ram中,因為ram的訪問速度要比rom快得多,這樣大大提公升系統的效能。啟動程式要完成的任務包括:硬體初始化,系統儲存系統的配置,複製二級中斷向量表。
啟動程式過程
●系統硬體初始化
---系統上電或復位後,程式從位於位址0x0的reset exception vector處開始執行,因此需要在這裡放置bootloader的第一條指令:b resethandler,跳轉到標號為resethandler處進行第一階段的硬體初始化,主要內容為:關看門狗定時器,關中斷,初始化pll和時鐘,初始化儲存器系統。執行完以上程式後,系統進行堆疊和儲存器的初始化。系統堆疊初始化取決於使用者使用了哪些中斷,以及系統需要處理哪些錯誤型別。一般情況下,管理者堆疊必須設定,如果使用了irq中斷,則irq堆疊也必須設定。如果系統使用了外設,則需要設定相關的暫存器,以確定其重新整理頻率、匯流排寬度等資訊。
● 代碼段複製到ram中執行
---因為嵌入式系統的**通常都是固化在rom或者flash中,上電後開始執行。由於rom和flash的讀取速度相對較慢,這樣無疑會降低**的執行速度和系統的執行效率。為此,需要把系統的**複製到ram中執行。使用sdt鏈結器armlink產生的定位資訊,把ro的有效**和資料段到ram中。armlink將編譯後的程式鏈結成elf檔案。映像檔案內部共有三種輸出段:ro段、rw段和zi段。這三種輸出段分別包含了唯讀**及包含在**段中的少量資料、可讀寫的資料、初始化為0的資料,armlink同時還產生了這三種輸出段的起始和終止定位資訊:image$$ro$$base、image$$ro$$limit、image$$rw$$base、image$$limit、image$$linit和image$$zi$$limit。可以在程式中使用這些定位資訊。將rom中的**和資料搬移到ram中,具體程式如下。
---ldr r0, =|image$$ro$$base| /*ro段起始位址*/
---ldr r1, =|image$$ro$$limit| /*ro段結束位址*/
---ldr r2, =|image$$rw$$base|
---ldr r3, =|image$$rw$$limit|
---/*分別求出需要映像的**和資料的長度並累加,放到暫存器r1中*/
---sub r1, r1, r0
---sub r3, r3, r2
---add r1, r1, r3
---/*將需要映象的**和資料複製到ram中去*/
---0 /*標示符*/
---ldr r3, [r0], #4
---str r3, [r2], #4
---subs r1, r1, #4
---bne %b0 /*如果沒有複製完,跳轉到0標示符處的彙編語句,繼續複製,參見arm指令幫助手冊*/
●建立二級中斷向量表
---在arm系統中,中斷向量表位於0x0開始的位址處,意味著無論執行什麼樣的上層軟體,一旦發生中斷,程式就得到flash儲存器中的中斷向量表裡去,降低系統的執行效率。因此在ram中建立自己的二級中斷向量表,當中斷發生後,程式直接從ram中取中斷向量進入中斷子程式。尤其是在中斷頻繁發生的系統裡,這種方法可以大大提高系統的執行效率,具體的實現**如下。
---b resethandler
---b handlerundef /*未定義模式控制代碼*/
---b handlerswi /*swi中斷控制代碼*/
---b handlerpabort /*pabort中斷控制代碼*/
---b handlerdabort /*dabort中斷控制代碼*/
---b. /*保留*/
---b handlerirq /*irq 中斷控制代碼*/
---b handlerfiq /*fiq中斷控制代碼*/
---handlerfiq handler handlefiq
---handlerirq handler handleirq
---handlerundef handler handleundef
---handlerswi handler handleswi
---handlerdabort handler handledabort
---handlerpabort handler handlepabort
---其中handler是乙個巨集,用於查詢中斷處理程式的入口位址。這些位址存放在由handle***指向的表項中,該錶定位在ram高階,基位址為_isr_startaddress。
---^ _isr_startaddress
---handlereset # 4
---handleundef # 4
---handleswi # 4
---handlepabort # 4
---handledabort # 4
---handlereserved # 4
---handleirq # 4
---handlefiq # 4
●mmu的應用
---mmu是儲存器管理單元的縮寫,是用來管理虛擬記憶體系統的器件。mmu通常是cpu的一部分,本身有少量儲存空間存放從虛擬位址到實體地址的匹配表,此表稱作tlb(轉換旁置緩衝區)。所有資料請求都送往mmu,由mmu決定資料是在ram內還是在大容量外部儲存器裝置內。如果資料不在儲存空間內,mmu將產生頁面錯誤中斷。mmu儲存器系統的結構允許對儲存器系統的精細控制,大部分的控制細節由存在儲存器中的轉換表提供。這些表的入口定義了從1kb~1mb的各種儲存器區域的屬性。mmu完成的兩個主要功能是:將虛位址轉換成實體地址,控制儲存器訪問允許。mmu關掉時,虛位址直接輸出到物理位址匯流排。
---經過以上的分析可以發現,系統啟動程式主要是完成了硬體的初始化,以及克服flash或rom讀取速度慢的弱點,提高指令和資料的讀取速度,實現系統的高速執行,並且通過mmu的應用,減少ram的使用,降低系統成本。
參考文獻
1 s3c2410資料手冊
2 arm920t資料手冊
3 王京林.arm7在嵌入式應用中啟動程式
的實現
作者blog:
S3C2410讀寫Nand Flash分析
2009 01 15 16 51 321人閱讀 收藏舉報 s3c2410讀寫nand flash分析 一 結構分析 s3c2410處理器整合了8位nandflash控制器。目前市場上常見的8位nandflash有三星公司的k9f1208 k9f1g08 k9f2g08等。k9f1208 k9f1g0...
s3c2410的nand flash的驅動分析
以前都是把別人寫好的 直接拿過來用,而沒有去關心裡面到底怎麼實現的,昨晚對照著samsung 2410和k 9f1208的晶元資料把這些 讀了一遍,終於明白了對nand flash的操作一步步是怎麼實現的了。以下的這些 可以在vivi或者kernel裡面找到 對乙個nand flash的操作,總體上...
S3C2410下DMA的使用
dma優點是其進行資料傳輸時不需要cpu的干涉,可以大大提高cpu的工作效率。dma大容量資料傳輸中非常重要,比如影象資料傳輸,sd卡資料傳輸,usb資料傳輸等等。s 3c2410有四個dma,每個dma支援工作方式基本相同,但支援的source dest可能略有不同。那麼怎麼使用dma呢,s3c2...