




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ARM初始化代碼分析2008年 05月13 日 星期二 15:21介紹由于多種原因基于 ARM 的 AT91 的大多數應用代碼使用 C 語言編寫。 然而, 啟動順序要求初始化 ARM 處理器和嚴重依賴于寄存器結構的關鍵設備和內存映射處理機,和存儲器重映射操作。由于這個原因, C 啟動序列必須用匯編編寫。這個應用筆記描述了一個 AT91 的 C 代碼啟動序列示例。他是使用 ARM ADS1.1 開發工具為AT91 評估板寫的基于 C 啟動序列。更多的可用 C 啟動序列示例見 AT91 庫。在上電并且復位后 C啟動序列激活執行。C 啟動次序在設計 ARM 嵌入式應用設計中主要的考慮是規劃內存圖。特
2、別是位于地址0x0 的存儲器。復位后,處理器從地址 0x0 處的指令處開始執行,因此必須能夠從此處取得可執行代碼。在嵌入式系統中,這需要初始化后在地址 0xO 處是 NVM( 非揮發存儲器 )。最 簡單的規劃是在存儲器映射中將 ROM 定位在地址 0 。當它首先執行位于 0x00 地址的第一條指令后應用程序能夠指向自動的實際入口。但是這也有一個缺 點,ROM位窄(8、16位)且比RAM慢,存取他需要更多的等待周期。這將減緩處理器處理通過矢量表的異常尤其是中斷。況且,如果矢量表在 ROM 中,他 不能夠被代碼編輯。由于 RAM 較 ROM 存取速度快且位寬,如果在 RAM 中 0x00 處存儲器
3、作為矢量表和中斷句柄更好。雖然在通常運行中 RAM 被定 位在 0x0 處數必需的,如果上電后 RAM 定位在地址 0x0,復位指令入口處沒有一個合法的可執行指令。所以上電后ROM 必須定位在 0x0 以保證此處有一合法的復位矢量。從復位到正常運行的存儲器圖變換通常通過執行一個REMAP( 重映射)來完成。許多基于 ARM 的嵌入式應用程序包含在 ROM 中且在復位后執行。 當編寫嵌入式操作系統,沒有操作系統從復位后執行的嵌入式應用程序時有幾個因素必須考慮,包括:* 變換 ROM 到 RAM ,以改善執行速度。*初始化執行環境。例如異常向量,堆棧、I/O 引腳* 初始化應用例如,從 ROM 中
4、到 RAM 中拷貝初始化值付值給初始化變量并且清除其他變 量為 0。*連接嵌入式執行映像到存儲器中放置程序和代碼的指定區域。對于沒有操作系統的嵌入式應用, rom 中的代碼必須提供一個方法以初始化他自己并且開始執C 代碼之前執行一些初始化。行。復位后不會自動初始化,因此應用程序入口在它調用復位后定位在地址零的初始化代碼,必須:* 為初始化代碼標記入口標記*設置異常向量。*初始化內存系統*初始化堆棧指針寄存器* 初始化任何臨界 I/O 器件* 初始化中斷系統需求的任何 RAM 變量* 使能中斷(如果通過初始化句柄)*如果需要的話改變處理器模式* 如果需要的話改變處理器狀態環境初始化完成后,應用程
5、序初始化繼續并且將進入C 代碼入口。C 啟動文件是上電后第一個執行的文件并且從復位后執行微控制器初始化然后調用其他應用程 序的主例程。主程序將是一個死循環且不應該返回。ROM 必須在地ARM 內核復位后從地址零處開始執行。對于嵌入式系統。這意味著系統復位后 址 0。由于 ROM 的限制, 異常處理的速度將受到影響并且異常向量不能被編輯。一個通用的策略是 重映射 ROM 到 RAM 中并且啟動后從 ROM 拷貝異常向量到 RAM.C 啟動示例這個事例基于 AT91 開發板、 使在 AT91 軟件庫中本筆記和其他筆記包含一個普通的啟動文件。用 ARM ADS 1.1 開發工具在外接閃存中調試。這個
6、文件必須被編輯以適應用戶的需要。每個AT91評估板描述在 AT91庫的softwaretargets子目錄中。每個這些子目錄中包含下列文件:*<target>.h 文件,用 C 描述的線路板組件*<target>.inc文件,用匯編描述的線路板組件例。* 一個或多個cstartup.s,使用 ARM SDT、ARM ADS 和 GREEN HILL MULTI 200 的標準引導示AT91 庫提供C 啟動文件解釋如何引導 AT91 零件并且如何分支到 MAIN 主函數。 啟動代碼提供一個如何考慮零件的特殊性引導 AT91 零件以達到板子指定特性和調試級別需求的實例。初始
7、化代碼的區域定義和入口指針在 ARM 匯編語言源文件中,開始片斷必須通過 AREA 偽指令標記。這個偽指令片斷并且設置它的屬性。 屬性被放置在名字之后, 通過逗號分割。 以上代碼示例定義一個名為 RESET 的只讀代碼段。一個可執行映像必須有一個入口指針。被放置在ROM 中的可執行映像通常在 0x0 放置一個入口指針。在初始化代碼中使用匯編偽指令定義一個入口指針。J;-區域定義JAREAreset,CODE,READONL YJ;定義入口指針ENTRY設置異常向量異常向量被設置為一個連續的指向到最近的標號或連接到子程序分支的地址空間。在程序的正 常執行流程中,程序計數器增加使能處理器操作過內部
8、或外部源產生的事件。在通常運行中異常發 生后使處理器轉移執行。這樣的事件的例子是:* 外部產生中斷*處理器企圖執行一個不明確的指令當這樣一個中斷發生時,保護以前的處理器狀態是必須的,以便當適當的異常程序完成后執行 中的程序能夠繼續執行。初 始化代碼必須設置所需的異常向量 (見表一)。如果 ROM 定位在地址 0,向量包含指向每個0。為保 證一個合法的跳轉他們必須0x01000000 ,并且僅能夠由 NRST 中斷或異常的操作硬指令序列。在重映射前,這些向量被映射在地址 是一個關聯地址模式。重映射后,這些向量被應設在地址內部中斷改變回去。處 理器的異常句柄通過向量表控制。向量表是一個32字節(b
9、yte)的保留區域,通常在內寸PC 指令以便繼續執行適圖的底部。每個向量分配一個字的( word)空間,并且當前的保留字示于表一。因為此處有足夠的 空間包含句柄的全部代碼,每個例外向量的入口包含一個分支指令或調入 當的處理。表一。異常向量DCDEBI_CSR_5;-異常向量(重映射前)B itReset;resetundefvecB defvec; Undefined InstructionswivecB ivec; Software InterruptpabtvecB btvec;Prefetch AbortdabtvecB btvec;Data AbortrsvdvecB rsvdvec;
10、 reservedirqvecirqvec; reservedfiqvec圖一。fiqvec; reserved異常向量圖外部總線接口初始化平臺EBI 平臺被用來配置內存控制器。 EBI 依賴于器件、時鐘和外部內存存取時間。這些植被定義 在相應目標器件的“ INCLUDE FILE ”,例如對于 AT91EB55 評估板的 eb55.inc 文件。;-EBI 初始化數據InitTableEBIDCDEBI_CSR_0DCDEBI_CSR_1DCDEBI_CSR_2DCDEBI_CSR_3DCDEBI_CSR_4DCDEBI_CSR_6DCDEBI_CSR_7DCD0x00000001 ; RE
11、MAP 命令DCD0x00000006 ; 6存儲器區域PtEBIBaseDCDEBI_BASE ; EBI Base Address ,標準讀復位處理位于地址零的代碼從這開始執行。應該注意的是,他被連接到0x100 0000。;- 重映射前復位處理InitReset加速引導過程復位后, 擴展總線界面沒有配置為片選0 和片選 0-8 的等待狀態分離。 在重映射命令前, 片選 0配置能夠通過編程具有精確引導內存特性的EBI_CSR0 來編輯。,重映射后底部地址變得有效, 但等待狀態的新數目能夠被立即改變。如果希望引導更快的話這是所希望的。;- 加速引導過程;-調入 EBI 系統的底部地址和 CS
12、R0 的初始值ldr r0, ptEBIBaseldr r1, InitTableEBI;相對值;- 通過禁止片選 0 的等待狀態加速代碼執行str r1, r0低級初始化當臨界狀態時應該考慮外圍設備在使能終端前必須被初始化。如果這些外圍設備在此處沒有被初始化,當中斷使能時可能引起虛假的中斷。低級初始化bl low_level_init例如:在 AT91EB55 評估板上,啟動 PLL( 鎖相環)。在復位時, AT91M55800 微控制器使用低速時鐘 ( 32.786KHZ 啟動以減小系統啟動時的電源需求并 且主振蕩器是禁止的。 PLL 能夠通過設置高級電源管理控制來運行主振蕩器來啟動以加速
13、啟動過程。_low_level_init 函數在相應的評估板的 AT91 軟件庫中在匯編文件中定義。AIC 。高級中斷控制器設置 復位后,高級中斷控制器( AIC )沒有配置。 C 啟動文件通過設置缺省中斷向量來初始化缺省中斷操作函數定義在 AT91 函數庫中。這些函數能夠在應用代碼中被重新定義。中斷缺省操作的初始化見圖 2;- 高級終端控制器配置;- 設置缺省向量;- 調入 AIC 基礎地址和缺省操作地址addr0, pc,#-(8+.-AicData) ; 這里是讀取相對值 ldmia r0, r1-r4 ;- 設置偽造向量 str r4, r1, #AIC_SPU ; r4 = 偽操作s
14、tr;- 設置缺省中斷操作向量r2, r1, #AIC_SVR ; SVR0 for FIQaddr1, r1, #AIC_SVRmovr0, #31;計數器LoopAic1str r3, r1, r0, LSL #2 ; SVRs for IRQssubs r0, r0, #1; do not save FIQbhi LoopAic1b EndInitAic;- 缺省中斷操作AicDataDCD AIC_BASE ; AIC Base AddressIMPORT at91_default_fiq_handlerIMPORT at91_default_irq_handlerIMPORT at9
15、1_spurious_handlerPtDefaultHandlerDCD at91_default_fiq_handlerDCD at91_default_irq_handlerDCD at91_spurious_handlerEndInitAic圖 2 ,中斷的缺省操作初始化高級中斷控制器拷貝異常向量到內部 RAM異常向量必須拷貝到內部 RAM 中。為保證在重映射操作中內核執行合法向量,在重映射前執3。行這個操作是重要的。這里僅僅有五個偏移作為引導使用。見表;- 在重映射前在內部 RAM 中設置異常向量b SetupRamVectorsVectorTableldr pc, pc, #&am
16、p;18 ; SoftReset 軟件復位ldr pc, pc, #&18 ; UndefHandler 未定義操作ldr pc, pc, #&18 ; SWIHandlerldr pc, pc, #&18 ; PrefetchAbortHandlerldr pc, pc, #&18 ; DataAbortHandlernop; Reservedldr pc, pc,#-0xF20 ; IRQ : read the AIC 讀 AICldr pc, pc,#-0xF20 ; FIQ : read the AIC;- 僅僅有五個偏移量作為向量使用DCD SoftR
17、esetDCD UndefHandlerDCD SWIHandlerDCD PrefetchAbortHandlerDCD DataAbortHandler;- 運行在絕對地址的向量執行函數SoftResetb SoftResetUndefHandlerb UndefHandlerSWIHandlerb SWIHandlerPrefetchAbortHandlerb PrefetchAbortHandlerDataAbortHandlerb DataAbortHandlerSetupRamVectorsmov r8, #RAM_BASE_BOOT ; 在 RAM 0x300000 的硬件向量a
18、dd r9, pc,#-(8+.-VectorTable) ; 從哪兒度相對值ldmia r9!, r0-r7; 讀 8 向量stmia r8!, r0-r7; 存儲他們到 RAM 中ldmia r9!, r0-r4; 讀 5 絕對操作地址圖 3 ,在 RAM 中拷貝異常向量存儲器控制初始化和重映射命令復位后 AT91 系列的 RAM 映射在地址 0x0030 0000。連接到片選 0 的存儲器映射在地址 0。當重映射命令執行時,擴展存儲器映射在片選寄存器0 定義的地址。內部 ram 定義在地址 0 以允許在0x0 和 0x20 之間的異常向量能夠由軟件編輯。;- 內存控制器初始化; 得到芯片
19、地址;- 拷貝內存控制器的鏡像sub r10, pc,#(8+.-InitTableEBI); 選擇寄存器鏡像ldr r12, PtInitRemap;得到真實的跳轉地址; ( 重映射后 );- Copy Chip Select Register Image to Memory Controller and command remap; -拷貝片選寄存器鏡像到內存控制器和重映射命令ldmia r10!, r0-r9,r11; 調入完整鏡像和; EBI 基礎地址stmia r11!, r0-r9; 存儲完整鏡像包括; 重映射命令;-J跳轉到rom新地址mov pc, r12; jump and
20、break the pipelinePtInitRemapDCD InitRemap; address where to jump after REMAP0x100 0000;- From here, the code is executed from its link address, ie. 0x100 0000.;- 從此處,代碼開始從他的連接地址開始執行,例如,InitRemapARM 處理器流水線保證 "mov pc,r12" 指令在重映射指令執行前得到讀取。重映射后,下一條指 令被從RAM中讀取并且"mov pc,r12"指令執行完成跳轉到
21、ROM中r12(0x100011C)以前的裝載地址5。因此如圖 4 所示同時打斷流水線。重映射后的“新”存儲器圖描述見圖圖 4 ,重映射命令期間 arm 內核流水線重映射前重映射后mov PC,r12 后省的每個一個字。用戶堆棧沒有定義并且由外接RAM 的自由空間所限。流水線存儲器圖 5 ,重映射后內存圖初始化堆棧寄存器快速中斷、中斷、異常終止未定義和。管理堆棧定位在內部存儲器的頂部以加速操作速度。用 戶(應用程序,C)堆棧定位在擴展存儲器頂部。初始化代碼初始化堆棧指針寄存器。依賴于中斷和異常要求,下面一些或所有堆棧指針需要初 始化:*管理堆棧必須經常初始化* 如果使用 IRQ 中斷的話則 I
22、RQ 中斷堆棧必須初始化。必須在中斷使能前完成初始化。*如果使用 FIQ 中斷的話則 FIQ 中斷堆棧必須初始化。必須在中斷使能前完成初始化。* 數據和預取操作的 Abort-stack 必須初始化。*未定義指令操作的未定義指令堆棧必須初始化。通常, Abort-state 和未定義指令在簡單嵌入式系統中不使用。然而,初始化他們用于調試目的中斷堆棧依賴于中斷操作調整??焖僦袛嘈枰歉鼉炘降?。J;- 堆棧大小定義JIRQ_STACK_SIZE EQU (3*8*4); 3 wordsFIQ_STACK_SIZE EQU (3*4); 3 wordsABT_STACK_SIZE EQU (1*4)
23、; 1 wordUND_STACK_SIZE EQU (1*4); 1 word假定使用 IRQ_ENTRY/IRQ_EXIT宏指令,當使用向量時中斷堆棧需要當改變到用戶模式執行應用程序時用戶堆棧指針能夠被設置。3 個字 * 優先級 8*4 字節。3 個字 *4 字節,沒有優先級。其他堆棧定義為使用缺堆棧頂部定義; Defined in partTOP_EXCEPTION_STACK EQU RAM_LIMITTOP_APPLICATION_STACK EQU EXT_SRAM_LIMIT ; Defined in Target設置每種模式的堆棧ldr r0, =TOP_EXCEPTION_S
24、TACKmsr設置快速中斷模式和設置 FIQ 模式堆棧CPSR_c, #ARM_MODE_FIQ:OR:I_BIT:OR:F_BITmovr13, r0; 初始化 FIQsubr0, r0, #FIQ_STACK_SIZE設置中斷模式和設置 FIQ 模式堆棧msrCPSR_c, #ARM_MODE_IRQ:OR:I_BIT:OR:F_BITmovr13, r0; Init stack IRQsubr0, r0, #IRQ_STACK_SIZE設置異常終止模式和設置異常終止模式堆棧msrCPSR_c, #ARM_MODE_ABORT:OR:I_BIT:OR:F_BITmovr13, r0; Init stack Abortsubr0, r0, #ABT_STACK_SIZE設置未定義指令模式和設
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 名班主任引領活動方案
- 后半年裝飾公司活動方案
- 呂梁黨建活動方案
- 聽診體檢活動方案
- 吳橋縣憲法日活動方案
- 呈貢文廟活動方案
- 廠慶活動戶外策劃方案
- 南瓜課程活動方案
- 合作公司專屬活動方案
- 同心同行拓展活動方案
- 公安輔警合同模板
- 大學生創新創業教育(2023秋學期)學習通超星期末考試答案章節答案2024年
- 中建2024裝配式建筑+鋁模一體化施工技術手冊
- 農作物四級種子生產技術規程 第1部分:小麥DB41-T 293.1-2014
- TSG ZF001-2006《安全閥安全技術監察規程》
- 自動尋優控制系統在生料立磨中的應用實踐
- 土地延期合同范本
- 四川省綿陽市涪城區2024-2025學年七年級上學期開學考試語文試題(解析版)
- DL∕T 796-2012 風力發電場安全規程
- 部編版八年級升九年級歷史暑假預習知識清單(填空+答案)
- 四川省自貢市2023-2024學年七年級下學期期末數學試題(解析版)
評論
0/150
提交評論