ARM處理器系統初始化過程_第1頁
ARM處理器系統初始化過程_第2頁
ARM處理器系統初始化過程_第3頁
ARM處理器系統初始化過程_第4頁
ARM處理器系統初始化過程_第5頁
已閱讀5頁,還剩109頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、ARM處理器系統初始化過程 1 禁止MMUU,關閉中斷斷,禁止caache;2 根據硬件設設計配制好處處理器時鐘、DDRAM時鐘鐘、定時器時時鐘;3 根據系統中中所用的fllash和DDRAM芯片片容量和電氣氣參數設置它它們的起始地地址、容量、刷刷新頻率等;4 將固化在fflash芯芯片中的程序序搬移到DRRAM內存中中;5 使能cacche,使能能MMU,跳跳轉到DRAAM內存中運運行繼續初始始化,包括根根據具體應用用以及系統中中的硬件配置置初始化各個個功能模塊、安安裝好異 常中斷處理理程序、使能能中斷等;6 進行操作系系統相關初始始化;禁止MMU,關關閉中斷,禁禁止cachhe通過寫系統控

2、制制協處理器的的寄存器1 的第0 位位可以允許和和禁止MMUU。在復位后后這位是0,MMMU 被禁禁止。關閉中斷與打開開中斷中斷是一種高效效的對話機制制,但有時并并不想程序運運行的過程中中中斷運行,比比如正在打印印東西,但程序突然中中斷了,又讓讓另外一個程程序輸出打印印內容,這樣樣在打印機上上就會亂得不不得了,同時有兩份以上上的文件交錯錯地打印在一一張紙上。像像不可剝奪的的資源,就一一定要關閉中中斷,讓它占有這個資源源。在ARMM里,沒有像像x86那樣樣有清除中斷斷指令CLII。那么在AARM里是怎怎么樣實現關中斷和開中斷斷的呢?下面面就來看看AARM的關中中斷和開中斷斷實現。vooid Lo

3、ock(vooid)stmddbsp!, r00mrssr0, cpsrorr rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面這段程序序是通過設置置CPSR的的第6,7位位來實現的,因因為第6,77位是設置為為1時,就不不再響應中斷。void UnnLock(void)stmddbsp!, r00mrssr0, cpsrbic rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面是重新新開中斷的命命令,同樣是是設置CPSSR的第6,77位,但它的的值是0,就就可接收中斷斷了。如果在多個任務務之間進行共共享

4、數據,一一般是需要使使用關中斷和和開中斷實現現數據同步的的,其實中這種關中斷和和開中斷,就就是進入臨界界區和退出臨臨界區。如果果是像PC機機那樣有多個個CPU的話話,關中斷并并不能防止這這種情況。系統的在應用編編程(IAPP)以及在系系統編程功能能(ISP)等等。中斷向量表ARRM要求中斷斷向量表必須須放置在從00地址開始,連連續8X4字字節的空間內內。每當一個個中斷發生以以后,ARMM處理器便強強制把PC指指針置為向量量表中對應中中斷類型的地地址值。因為為每個中斷只只占據向量表表中1個字的的存儲空間,只只能放置一條條ARM指令令,使程序跳跳轉到存儲器器的其他地方方,再執行中中斷處理。中中斷向

5、量表的的程序實現通通常如下表示示:AREAA Boott ,CODDE, REEADONLLYENTRRYB ReesetHaandlerrB UnddefHanndlerBB SWIHHandleerB PrreAborrtHanddlerB DataAAbortHHandleerBB IRQQHandllerB FFIQHanndler其其中關鍵字EENTRY是是指定編譯器器保留這段代代碼,因為編編譯器可能會會認為這是一一段亢余代碼碼而加以優化化。鏈接的時時候要確保這這段代碼被鏈鏈接在0地址址處,并且作作為整個程序序的入口。Q:為什么在在中斷向量表表中不直接LLDR PCC,異常地地址.而

6、是是使用一個標標號,然有再再在后面使用用DCD定義義這個標號AA:因為LDDR指令只能能跳到當前PPC 4kBB范圍內,而而B指令能跳跳轉到32MMB范圍,而而現在這樣在在LDR PPC, xxxxx這這條指令不遠遠處用xxxxxDCCD定義一個個字,而這個個字里面存放放最終異常服服務程序的地地址,這樣可可以實現4GGB全范圍跳跳轉.Q: LDR 不不是可以全空空間跳轉的嗎嗎 ARMM微控制器基基礎與實戰程程序清單5.3.A: LDR偽指指令通過設置置指令緩沖池池才能實現全全范圍跳轉,而LDR指指令則只能實實現4KB范范圍跳轉.MEMMAP=0:開機默默認值,Booot裝載模模式向量表(00

7、x000000000-0 x00000003cc)映射的是是BootBBlock中中的0 x7FFFFE0000-0 x77FFFF003c中的值值;芯片復位位時,啟動bboot裝載載程序,booot裝載程程序檢查P00.14口的的狀態和用戶戶的異常向量量,判斷是進進入ISP狀狀態還是啟動動用戶程序,若若啟動用戶程程序,則自動動設置MEMMMAP=11(片內fllash啟動動)或3(片片外程序存儲儲器啟動)。很奇怪的,我在在實驗中,當當使用無片內內flashh的LPC22210時即即使設置P00.14為高高低都沒關系系,芯片會跳跳過繼而執行行片外flaash中的代代碼. MEMMMAP=11:

8、中斷向量量表就在片內內flashh中,地址就就是0 x0000000000-0 x000000003c,相當當于沒有映射射;MEMMMAP=22:最為主要要的設置,即即是重映射的的關鍵之所在在,當設置MMEMMAPP=2 時,中斷斷向量表(00 x000000000-0 x00000003cc)映射的是是片內SRAAM中的0 xx400000000-00 x40000003c中中的值,而因因為是SRAAM,所以在在程序運行的的過程中是可可以改變的,這這樣就可以達達到重映射的的目的啦(中中斷向量表可可以隨時修改改)。 MEMMMAP=33:中斷向量量表就在片外外flashh中,中斷向向量表(0

9、xx000000000-00 x00000003c)映射到是片片外flassh中的0 xx800000000-00 x80000003c中中的值;功能能上與MEMMMAP=11時的差不多多,因為一旦旦程序固化到到flashh中,即為只只讀,只是數數值映射而已已!設置MEMMAAP; Memorry Mappping (whenn Inteerruptt Vecttors aare inn RAM)MEMMAAP EQU 0 xEE01FC0040 ; Memmory MMappinng Conntrol IF :DEF:REMAPP LDR R0, =MEMMMAP IF :DEF:EXTME

10、EM_MODDE MOV R1, #3 ELIFF :DEFF:RAM_MODE MOV R1, #2 ELSEE MOV R1, #1 ENDIIF STR R1, R0 ENDIIFMEMMMAP有兩個個控制位 MMEMMAPP1:000 BOOTT裝載程序模模式01 Userr FLASSH模式100 用戶RAAM模式111 用戶外部部存儲器模式式10模式也也就是RAMM模式 我們們訪問地址00X00是跟跟訪問RAMM地址0X4400000000中的數數據是完全一一樣的 向RRAM中寫進進數據 然后后通過數據窗窗口觀察0XX0地址的變變化 應該是是同步變化的的存儲器類型和時時序配置 主要

11、是對對系統存儲器器控制器(MMMU)的初初始化。由于于存儲器控制制器并不是AARM架構的的一部分,不不同芯片的實實現方式各不不相同。由于于運算能力和和尋址能力的的強大,基于于ARM內核核的微處理器器系統一般都都需要外擴展展各種類型的的存儲器。對對于存儲器系系統的初始化化一般包括如如下幾個方面面:存儲器類型型、時序和總總線寬度的配配置存儲器地址址的配置(1)存儲器類類型 基于ARRM微處理系系統的存儲器器一般有如下下幾類:SAARM,DRRAM,Fllah,同時時,即使同類類存儲器也有有訪問速度上上的不同。其其中,SRAAM和Flaah屬于靜態態存儲器,可可以共用存儲儲器端口,而而DRAM有有動

12、態刷新和和地址復用等等特征,需要要專門的存儲儲器端口。(2)時序 存儲器端端口的接口時時序優化對系系統性能影響響非常大,因因為系統運行行的速度瓶頸頸一般都存在在于存儲器的的訪問,因此此希望存儲器器的訪問盡可可能快,但又又要考慮由此此帶來的系統統穩定性問題題。(3)總線寬度度 ARM微微處理器架構構支持8/116/32位位的數據總線線寬度訪問存存儲器和外設設,對于特定定的存儲器來來說,需要設設定數據總線線的寬度。(4)存儲器地地址的配置 ARM微微處理器架構構理論上可以以支持4GBB的地址空間間,而對于一一個實際的系系統來說,配配置的物理地地址遠沒有這這么多,因此此,如何配置置存儲器的地地址,也

13、是一一個重要的問問題。(5)存儲器地地址重映射 存儲器地地址重映射就就是可以通過過軟件配置來來改變一塊存存儲器物理地地址的方法,是是當前許多先先進控制器所所具有的功能能。進行地址重映射射的原因:提提高系統的運運行效率。進行地址重映射射的注意:保保證程序流程程的連續性。有的ARM處理理器不具有地地址重映射的的功能,可以以采樣代碼搬搬移加跳轉的的方式完成上上述功能。初初始化堆棧因因 為ARMM有7種執行行狀態,每一一種狀態的堆堆棧指針寄存存器(SP)都都是獨立的。因因此,對程序序中需要用到到的每一種模模式都要給SSP定義一個個堆棧地址。方方法是改變狀狀 態寄存器器內的狀態位位,使處理器器切換到不同

14、同的狀態,讓讓后給SP賦賦值。注意:不要切換到到User模模式進行Usser模式的的堆棧設置,因因為進入Usser模式后后就不 能再再操作CPSSR回到別的的模式了,可可能會對接下下去的程序執執行造成影響響。這是一段段堆棧初始化化的代碼示例例,其中只定定義了三種模模式的SP指指針:MRSS R0,CCPSRBIIC R0,R0,#MMODEMAASK 安全全起見,屏蔽蔽模式位以外外的其他位OORR R11,R0,#IRQMOODEMSRR CPSRR_cxfss,R1LDDR SP,=UndeefStacckORR R1,R00,#FIQQMODEMMSR CPPSR_cxxsf,R11LDR

15、 SSP,=FIIQStacckORR R1,R00,#SVCCMODEMSR CCPSR_ccxsf,RR1LDR SP,=SSVCStaack初始化化應用程序執執行環境如果果使用分散加加載描述文件件調整堆棧和和堆放置,則則鏈接器創建建 _usser_innitiall_stacckheapp() 函數數,并使用鏈鏈接器定義的的符號作為這這些區域的名名稱。映像一開始總是是存儲在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面執行,也也可以轉移到到速度更快的的RAM中執執行;而RWW和 ZI這這兩部分是必必須轉移到可可寫的RAMM里去。所謂謂應用程序執執行環境的初初

16、始化,就是是完成必要的的從ROM到到RAM的數數據傳輸和內內容清零。下下面是在ADDS下,一種種常用存儲器器模型的直接接實現:LDDR r0,=|Imaage$RRO$Liimit| 得到RW數數據源的起始始地址LDRR r1,=|Imagge$RWW$Basse| RWW區在RAMM里的執行區區起始地址LLDR r22,=|Immage$ZI$BBase| ZI區在RRAM里面的的起始地址CCMP r00,r1 比比較它們是否否相等BEQQ %F100 CMP r1,r33LDRCCC r2,r0,#4STRCCC r2,r1,#4BCCC %B011 LDR r1,=|Imagee$ZI$

17、Limiit|MOVV r2,#02 CMMP r3,r1STRRCC r22,r3,#4BCCC %B22程序實現了了RW數據的的拷貝和ZII區域的清零零功能。其中中引用到的44個符號是由由鏈接器第一一輸出的。|Imagee$RO$Limiit|:表示示RO區末地地址后面的地地址,即RWW數據源的起起始地址|IImage$RW$Base|:RW區在在RAM里的的執行區起始始地址,也就就是編譯器選選項RW_BBase指定定的地址|IImage$ZI$Base|:ZI區在在RAM里面面的起始地址址|Imagge$ZII$Limmit|:ZZI區在RAAM里面的結結束地址后面面的一個地址址程 序先

18、把把ROM里|Imagee$RO$Limtt|開始的RRW初始數據據拷貝到RAAM里面|IImage$RW$Base|開始的地址址,當RAMM這邊的目 標地址到達達|Imagge$ZII$Basse|后就表表示RW區的的結束和ZII區的開始,接接下去就對這這片ZI區進進行清零操作作,直到遇到到結束地 址址|Imagge$ZII$Limmit|改變變處理器模式式因為在初始始化過程中,許許多操作需要要在特權模式式下才能進行行(比如對CCPSR的修修改),所以以要特別注意意不能過早的的進入用戶模模式。內核級級的中斷使能能也可以考慮慮在這一步進進行。如果系系統中另外存存在一個專門門的中斷控制制器,這么

19、做做總是安全的的。呼叫主應應用程序當所所有的系統初初始化工作完完成之后,就就需要把程序序流程轉入主主應用程序。最最簡單的一種種情況是:IIMPORTT mainnB maiin直接從啟啟動代碼跳轉轉到應用程序序的主函數入入口,當然主主函數名字可可以由用戶隨隨便定義。在在ARM AADS環境中中,還另外提提供了一套系系統級的呼叫叫機制。IMMPORT _maiinB _main_mainn()是編譯譯系統提供的的一個函數,負負責完成庫函函數的初始化化和初始化應應用程序執行行環境,最后后自動跳轉到到main()函數。ARM 介紹ARM微處理器器的工作狀態態一般有兩種種,并可在兩兩種狀態之間間切換:

20、 第第一種為ARRM狀態,此此時處理器執執行32位的的字對齊的AARM指令; 第二種為為Thumbb狀態,此時時處理器執行行16位的、半半字對齊的TThumb指指令。 在程程序的執行過過程中,微處處理器可以隨隨時在兩種工工作狀態之間間切換,并且且,處理器工工作狀態的轉轉變并不影響響處理器的工工作模式和相相應寄存器中中的內容。但但ARM微處處理器在開始始執行代碼時時,應該處于于ARM狀態態。 ARMM處理器狀態態 進 入TThumb狀狀態:當操作作數寄存器的的狀態位(位位0)為1時時,可以采用用執行BX指指令的方法,使使微處理器從從ARM狀態態切換到Thhumb狀態態。此外,當當處理器處 于Th

21、ummb狀態時發發生異常(如如IRQ、FFIQ、Unndef、AAbort、SSWI等),則則異常處理返返回時,自動動切換到Thhumb狀態態。 進入AARM狀態:當操作數寄寄存器的狀態態位為0時,執執行BX指令令時可以使微微處理器從TThumb狀狀態切換到AARM狀態。此此外,在處理理器進行異常常處理時,把把PC指針放放入異常模式式鏈接寄存器器中,并從異異常向量地址址開始執行程程序,也可以以使處理器切切換到ARMM狀態。ARM處理器模模式 ARMM微處理器支支持7種運行行模式,分別別為: 用戶戶模式(ussr):ARRM處理器正正常的程序執執行狀態。 快速中斷模模式(fiqq):用于高高速數

22、據傳輸輸或通道處理理。 外部中中斷模式(iirq):用用于通用的中中斷處理。 管理模式(svc):操作系統使使用的保護模模式。 數據據訪問終止模模式(abtt):當數據據或指令預取取終止時進入入該模式,可可用于虛擬存存儲及存儲保保護。 系統統模式(syys):運行行具有特權的的操作系統任任務。 定義義指令中止模模式(undd):當未定定義的指令執執行時進入該該模式,可用用于支持硬件件協處理器的的軟件仿真。 ARM處理理器模式 AARM微處理理器的運行模模式可以通過過軟件改變,也也可以通過外外部中斷或異異常處理改變變。大多數的的應用程序運運行在用戶模模式下,當處處理器運行在在用戶模式下下時,某些

23、被被保護的系統統資源是不能能被訪問的。 除用戶模式式以外,其余余的所有6種種模式稱之為為非用戶模式式,或特權模模式;其中除除去用戶模式式和系統模式式以外的5種種又稱為異常常模式,常用用于處理中斷斷或異常,以以及需要訪問問受保護的系系統資源等情情況。 ARRM寄存器 ARM處理理器共有377個寄存器。其其中包括:331個通用寄寄存器,包括括程序計數器器(PC)在在內。這些寄寄存器都是332位寄存器器。以及6個個32位狀態態寄存器。 關于寄存器器這里就不詳詳細介紹了,有有興趣的人可可以上網找找找,很多這方方面的資料。 異常處理 當 正常的的程序執行流流程發生暫時時的停止時,稱稱之為異常,例例如處理

24、一個個外部的中斷斷請求。在處處理異常之前前,當前處理理器的狀態必必須保留,這這樣當異常處處理完成之后后,當 前程程序可以繼續續執行。處理理器允許多個個異常同時發發生,它們將將會按固定的的優先級進行行處理。當一一個異常出現現以后,ARRM微處理器器會執行以下下幾步操作: 進入異常常處理的基本本步驟: 將將下一條指令令的地址存入入相應連接寄寄存器LR,以以便程序在處處理異常返回回時能從正確確的位置重新新開始執行。將將CPSR復復制到相應的的SPSR中中。根據異常常類型,強制制設置CPSSR的運行模模式位。 強強制PC從相相關的異常向向量地址取下下一條指令執執行,從而跳跳轉到相應的的異常處理程程序處

25、。如果果異常發生時時,處理器處處于Thummb狀態,則則當異常向量量地址加載入入PC時,處處理器自動切切換到ARMM狀態。 AARM微處理理器對異常的的響應過程用用偽碼可以描描述為: RR14_ = Retuurn Liink SPPSR_= CPSR CPSR4:0 = Excceptioon Modde Nummber CCPSR55 = 00 ;當運行行于 ARMM 工作狀態態時 If = Reeset oor FIQQ thenn;當響應 FIQ 異異常時,禁止止新的 FIIQ 異常 CPSR6 = 1 PSRR7 = 1 PCC = Exxceptiion Veector Addre

26、ess 異常常處理完畢之之后,ARMM微處理器會會執行以下幾幾步操作從異異常返回: 將連接寄存存器LR的值值減去相應的的偏移量后送送到PC中。 將SPSRR復制回CPPSR中。 若在進入異異常處理時設設置了中斷禁禁止位,要在在此清除每一種異常模式式擁有自己的的物理的R113。應用程程序初始化該該R13,使使其指向該異異常模式專用用的棧地址。當當進入異常模模式時,可以以將需要使用用的寄存器保保存在R133所指的棧中中;當退出異異常處理程序序時,將保存存在R13所所指的棧中的的寄存器值彈彈出。這樣就就使異常處理理程序不會破破壞被其中斷斷程序的運行行現場。1。請問cacche和wrrite-bbuf

27、ferr的關系,在在WB和caache同時時打開的時候候,數據是如如何流動的呢呢?考慮到WWB的特性,是是不是較大段段的數據被寫寫入WB? WB的設計是為為了防止處理理器流水線被被寫數據總線線操作(寫主主存,寫外圍圍設備寄存器器等)拉住。典典型寫數據總總線時機有三三種:一是ccache處處于writte thrrough策策略下的寫操操作;二是ccache處處于writte bacck策略下,ddirty數數據由于caache行替替換或者被程程序主動清空空而寫回主存存,三是不經經過cachhe,直接對對數據總線的的寫操作。有有了WB之后后,被寫 回回數據總線的的內容在進入入WB之后,處處理器和

28、caache就可可以立刻繼續續使用了。這這就是WB和和cachee的關系。22。還有就是是所謂“caachablle bitt”和“buufferaable bbit”的問問題,這個問問題來自于aarm-arrmparrtB 的55.4節,那那里有一張表表,我對這個個表死活不理理解。這個問問題以前也問問過,但是沒沒有人回答。ARM各系列的的處理器上的的cachee設計有所不不同,所以有有的cachhe只有wrrite tthrouggh策略,有有的cachhe只有wrrite bback策略略,還有的ccache是是writee backk策略但允許許一定的wrrite tthrouggh行為

29、,因因此C和B位位的四種組合合對這三種ccache而而言有不同的的含義。第一一列和第二列列分別針對wwrite throuugh型caache和wwrite back型型cachee進行解釋,其其含義可以參參考我對第11個問題的回回答,第三列列針對wriite baack策略但但允許一定的的writee throough行為為的cachhe,第一行行好理解,第第二行之所以以在B位為00的情況下依依然是buffferabble,應該該是因為硬件件上的設計原原因(節省硬硬件資源 或或者由于目標標設計頻率限限制),第三三行的含義是是,當C=1,B=0時,caache使用用writee throoug

30、h策略略,WB開啟啟,第四行的的含義是,當當C=1,B=1時時,cachhe使用wrrite bback策略略,WB開啟啟。 可以看看到,對第 三種類型的的cachee,C和B位位不再“嚴格格”是其本來來控制caccheablle和buffferabble的含義義,而是利用用這兩位的“組組合”來控制制cachee和 WB的的表現行為,這這樣做比另外外再增加一位位來選擇caache的wwrite back策策略和wriite thhroughh策略硬件上上節約了資源源,效果上卻卻差不多,少少了cachhe和WB幾幾種意義不大大的組合,應應該說還是挺挺巧妙的。ARM啟動代碼碼設計參考 HYPERL

31、INK JavaScript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,re

32、sizable=yes);saveit.focus(); o 收藏到我的網摘中,并分享給我的朋友 收藏 基于ARM的芯芯片多數為復復雜的片上系系統,這種復復雜系統里的的多數硬件模模塊都是可配配置的,需要要由軟件來設設置其需要的的工作狀態。因因此在用戶的的應 用程序序之前,需要要由專門的一一段代碼來完完成對系統的的初始化。由由于這類代碼碼直接面對處處理器內核和和硬件控制器器進行編程,一一般都是用匯匯編語言。一一般通用的內內容包 括: 中斷向量量表 初始化化存儲器系統統 初始化堆堆棧 初始化化有特殊要求求的斷口,設設備 初始化化用戶程序執執行環境 改改變處理器模模式 呼叫主主應用程序 1.中中斷向

33、量表 ARM要求求中斷向量表表必須放置在在從0地址開開始,連續88X4字節的的空間內。 每當一個中中斷發生以后后,ARM處處理器便強制制把PC指針針置為向量表表中對應中斷斷類型的地址址值。因為每每個中斷只占占據向量表中中1個字的存存儲空間,只只能放置一條條ARM指令令,使程序跳跳轉到存儲器器的其他地方方,再執行中中斷處理。 中斷向量表表的程序實現現通常如下表表示: ARREABooot,CCODE,READOONLY EENTRY BResettHandller BUnndefHaandlerr BSWIHHandleer BPreeAborttHandller BDaataAboortHan

34、ndler B BIRQHHandleer BFIQQHandller 其中中關鍵字ENNTRY是指指定編譯器保保留這段代碼碼,因為編譯譯器可能會認認為這是一段段亢余代碼而而加以優化。鏈鏈接的時候要要確保這段代代碼被鏈接在在0地址處,并并且作為整個個程序的入口口。 2.初始化存存儲器系統 (1)存儲儲器類型和時時序配置 通通常Flassh和SRAAM同屬于靜靜態存儲器類類型,可以合合用同一個存存儲器端口;而DRAMM因為有動態態刷新和地址址線復用等特特性,通常配配有專用的存存儲器端口。 存儲器端口口的接口時序序優化是非常常重要的,這這會影響到整整個系統的性性能。因為一一般系統運行行的速度瓶頸頸

35、都存在于存存儲器訪問,所所以存儲器訪訪問時序應盡盡可能的快;而同時又要要考慮到由此此帶來的穩定定性問題。 (2)存儲儲器地址分布布 一種典型型的情況是啟啟動ROM的的地址重映射射。3.初始化化堆棧 因為為ARM有77種執行狀態態,每一種狀狀態的堆棧指指針寄存器(SSP)都是獨獨立的。因此此,對程序中中需要用到的的每一種模式式都要給SPP 定義一個個堆棧地址。方方法是改變狀狀態寄存器內內的狀態位,使使處理器切換換到不同的狀狀態,讓后給給SP賦值。注注意:不要切切換到Useer模式進行行User模模式的堆棧設設 置,因為為進入Useer模式后就就不能再操作作CPSR回回到別的模式式了,可能會會對接

36、下去的的程序執行造造成影響。 這是一段堆堆棧初始化的的代碼示例,其其中只定義了了三種模式的的SP指針: MRSR0,CPSR BICR0,R0,#MMODEMAASK安安全起見,屏屏蔽模式位以以外的其他位位 ORRR1,R0,#IIRQMODDE MSRRCPPSR_cxxfs,R11 LDRSP,=UndeefStacck ORRRR11,R0,#FIQMOODE MSSRCCPSR_ccxsf,RR1 LDRRSPP,=FIQQStackk ORRR1,R0,#SSVCMODDE MSRRCPPSR_cxxsf,R11 LDRSP,=SVCSStack 4.初始始化有特殊要要求的端口,設設

37、備 5.初始化應用用程序執行環環境 映 像像一開始總是是存儲在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面執行,也也可以轉移到到速度更快的的RAM中執執行;而RWW和ZI這兩兩部 分是必必須轉移到可可寫的RAMM里去。所謂謂應用程序執執行環境的初初始化,就是是完成必要的的從ROM到到RAM的數數據傳輸和內內容清零。 下面是在AADS下,一一種常用存儲儲器模型的直直接實現: LDRr0,=|Imaage$RRO$Liimit|;得到RWW數據源的起起始地址 LLDRr1,=|Imagge$RWW$Basse|;RRW區在RAAM里的執行行區起始地址址 LDRr22

38、,=|Immage$ZI$BBase|;ZII區在RAMM里面的起始始地址 CMMPr0,r11;比較較它們是否相相等 BEEQ%F1 00CMPr1,r3 LLDRCCr2,r0,#4 STTRCCr2,rr1,#44 BCCC%B0 1LLDRr1,=|Imagge$ZII$Limmit| MOVr2,#0 2CMMPr3,r11 STRRCCrr2,r33,#4 BCC%BB2 程序實實現了RW數數據的拷貝和和ZI區域的的清零功能。其其中引用到的的4個符號是是由鏈接器第第一輸出的。 |Imagge$ROO$Limmit|:表表示RO區末末地址后面的的地址,即RRW數據源的的起始地址 |I

39、magge$RWW$Basse|:RWW區在RAMM里的執行區區起始地址,也也就是編譯器器選項RW_Base指指定的地址 |Imagge$ZII$Basse|:ZII區在RAMM里面的起始始地址 |IImage$ZI$Limitt|:ZI區區在RAM里里面的結束地地址后面的一一個地址 程程 序先把RROM里|IImage$RO$Limt|開始的RWW初始數據拷拷貝到RAMM里面|Immage$RW$BBase|開開始的地址,當當RAM這邊邊的目 標地地址到達|IImage$ZI$Base|后就表示RRW區的結束束和ZI區的的開始,接下下去就對這片片ZI區進行行清零操作,直直到遇到結束束地 址|

40、IImage$ZI$Limitt| 6.改變處理器器模式 因為為在初始化過過程中,許多多操作需要在在特權模式下下才能進行(比比如對CPSSR的修改),所所以要特別注注意不能過早早的進入用戶戶模式。 內內核級的中斷斷使能也可以以考慮在這一一步進行。如如果系統中另另外存在一個個專門的中斷斷控制器,這這么做總是安安全的。 77.呼叫主主應用程序 當所有的系系統初始化工工作完成之后后,就需要把把程序流程轉轉入主應用程程序。最簡單單的一種情況況是: IMMPORTmain Bmaiin 直接從從啟動代碼跳跳轉到應用程程序的主函數數入口,當然然主函數名字字可以由用戶戶隨便定義。 在ARMADS環境境中,還

41、另外外提供了一套套系統級的呼呼叫機制。 IMPORRT_mmain BB_maiin _main()是編譯系系統提供的一一個函數,負負責完成庫函函數的初始化化和初始化應應用程序執行行環境,最后后自動跳轉到到main()函數。ARM中B _Mainn和B Maain的區別別轉第一種答案如下下: 在軟件仿真的情情況下,執行行“B _main”指指令,能使程程序跳到C文文件的maiin函數,但但用硬件仿真真時,還沒執執行到maiin函數時就就進入了異常常中斷。 原因是執行“BB _maain”指令令后,程序先先跳到_mmain庫函函數的入口,再再進行一些初初始化操作,最最后再跳入用用戶的maiin函

42、數。但但在初始化過過程中,由于于堆棧或其它它原 因造成成程序出錯。有有兩種方法可可以解決這個個問題。第一一:將“B _maiin”指令直直接改成“BB mainn”,使程序序不進行初始始化而直接跳跳入用戶的mmain()函數。第二二:合理初始始化堆棧。由由于考慮到剛剛接觸ARMM和將問題簡簡單化,我選選擇了第一種種方法。第二種答案如下下:IMPORT _maiin BL TargeetReseetInittB _maiin1、此后流程將將跳轉到ADDS提供的啟啟動代碼_main函函數處,負責責完成庫函數數的初始化及及相關功能,并并最終引導處處理器入口用用戶代碼maain()函函數,其代碼碼流程

43、為:嵌入式系統在進進入應用主程程序之前必須須有一個初始始化的過程,該該過程完成系系統的啟動和和初始化功能能,初始化過過程可以分成成兩部分來看看: _mainn負責設置運運行映像存儲儲器映射; _rt_eentry負負責庫函數的的初始化。_main完成成代碼和數據據的復制,并并把ZI數據據區清零,這這一步當代碼碼和數據區在在存儲和運行行時 處于不不同的存儲器器位置時有意意義。接著_main跳跳進_rt_entryy,進行STTACK和HHEAP等的的初始化。最最后_rt_entryy跳進應用程程序的入口 main()。當應用用程序執行完完時,_rtt_entrry又將控制制權交還給CC庫函數,函

44、函數mainn()在ADDS中有特殊殊的意義。當當一個程序工工程項目中存存在 maiin()時,連連接器會把_main和和_rt_eentry中中的初始化代代碼連接進來來;如果沒有有main()函數,初初始化過程就就不會被連接接,初始化過過程中一 些些標準的C庫庫函數失效。而而用戶應用程程序初始化過過程并未顯式式的完成這些些堆棧初始化化及數據拷貝貝操作,應用用程序將啟動動不成功。2、_maiin()為編編譯系統提供供的一個庫函函數,使用_mainn標號引導系系統時必須將將應用程序的的入口數定義義為mainn();3、若希望系統統進入應用程程序前自動完完成系統調用用(如庫函數數的初始化、RRW、

45、ZI數數據從 Fllash到RRAM的拷貝貝(加載映像像執執行映像)等等)的初始化化過程,必須須使用_mmain標號號以跳至ADDS提供的初初始化函數庫庫,這種情況況一般 需做做一些庫函數數移植及重定定向問題解決決;這一點上上,應用程序序入口必須以以main函函數標識;4、若所有的初初始化步驟都都已顯式的完完成(如堆棧棧初始化、加加載映像到執執行映像RWW、ZI數據據的 拷貝等等),應用程程序入口函數數XXXX()可以任意意定義(非mmain,這這樣可以避免免自動鏈接上上_maiin,從而跳跳過_maain),初初始化完成后后直接 B XXXXX即可,這這一點上,mmain()函數并不具具有特

46、殊性;5、若必須的初初始化步驟都都未顯示的完完成,一意孤孤行的B XXXXX,程程序運行的結結果將不可預預料。一個典典型的例子是是:若用戶并并未顯示完成成加載映像執行行映像的數據據初始化而直直接B XXXXX,則應應用程序中所所有的全局變變量并不會被被預期的初始始化,而所有有的ZI變量量也不會被預預期的清零;6、本人在調試試LPC22294 LCCD模塊時才才認識到上述述第五點(55、)的重要要性:程序指指令流并沒有有錯,但LCCD上顯示的的全部是亂碼碼。我用兩種種方法解決了了這一bugg:(1)將所有的的字庫數據定定義為connst常量,程程序運行正確確;(2)將B Main 修改成B _m

47、aain接著將將應用入口改改為int main(void) 而非innt Maiin(voiid),程序序也得到正確確的執行;Initiallizingg memoory reequireed by C coddeThe iniitial valuees forr any initiializeed varriablees (RWW) musst be copieed froom ROMM to RRAM.All othher ZII variiabless mustt be iinitiaalizedd to zzero. The llibrarry iniitialiizatioon co

48、dde callledat _maain peerformms thee copyying aand innitiallizatiion.Using tthe maain fuunctioonWhen thhe commpilerr comppiles a funnctionn callled maain(), it ggeneraates aa refeerencee to tthesymbol _maiin to forcee the linkeer to incluude thhe bassic C run-ttime ssystemm fromm the ANSIC libraary.

49、 (The ssymboll _maain iss markked ass an eentry pointt.)建議議和我一樣的的初學者還是是乖乖的B _maiin接著將應應用入口設置置為mainn()函數的的好。ARM編程:SScatteer文件的編編寫、分析scatterr基本點:11. 編譯后后輸出的映像像文件中各段段是首尾相連連的,中間沒沒有空閑的區區域,它們的的先后關系是是根據鏈接時時參數的先后后次序決定的的 armllinkerr -fille1.o file22.o 2. sccatterr用于將編譯譯后的映像文文件中的特定定段加載到多多個分散的指指定內存區域域3. 有22類域r

50、eggion:執執行域(exxecutiion reegion,一一般是ramm區域)和加加載域(looad reegion,一一般是romm區域)4. 加載域:就是編譯之之后得到的二二進制文件燒燒寫到romm中的這一段段區域,所有有的代碼ROO、預定義變變量RW、堆堆棧之類清不不清空無關緊緊要的大片內內存區域ZII,都包括在在其中5. 執行域:就就是把加載域域進行解壓壓縮后的樣樣子。比如:RO沒有變變動還是在RROM中,RRW被移到了了SRAM中中,而ZI被被放置在SDDRAM中66. scaatter本本身并不能對對映像實現解壓縮,編編譯器讀入sscatteer文件之后后會根據其中中的各種

51、地址址生成啟動代代碼,實現對對映像的加載載,而這一段段代碼就 是是* (InnRoot$Secttions)它是_mmain()的一部分。這這就是在匯編編啟動代碼的的最后跳轉到到_maiin() 而而不是跳向mmain()的原因之一一。7. 起起始地址與加加載域重合的的執行域成為為root regioon,* (InRooot$Seectionns)必須放放在這個執行行域中,否則則鏈接的時候候會報錯。*(+RO)包含了* (InRooot$SSectioons),所所以如果在rroot rregionn中用到了*(+RO)可以不再指指定* (IInRoott$Secctionss),scatt

52、err語法:ROOM_LOAAD 0 x0000000000 ROM 00 x000000000 0 x0033FFFFFF vectoors.o (+RO,+FIRSST) * (InRooot$SSectioons) ; Alll librrary ssectioons thhat muust bee in aa roott regiion *(+RO) SRRAM 0 xx004000000 00 x003FFFFFF * (+RW,+ZI) SDRRAM1 00 x410000000 UNINIIT stacck.o (+ZI) ; staack.s中中定義了toop_of_stack

53、k為長度為11的spacce,指定棧棧頂地址 SDRRAM2 +0 UNIINIT heap.o (+ZZI) 注解:1. RROM_LOOAD是加載載域。這里只只有一個,也也可以有多個個(rom地地址不連續的的情況)2. ROM、SSRAM、SSDRAM11、SDRAAM2是執行行域,有多個個。第一個執執行域必須和和加載域地址址重合,因為為ARM的復復位地址就是是加載域的起起始地址(有有bootsstrap的的話加載域址址就是boootstraap執行完后后的跳轉地址址)3. vvectorrs.o (+RO, +FIRSST) 中斷斷向量表放在在最開頭4. ROM 0 x000000000

54、0 0 x0003FFFFFF; 加載載域名 起始始地址 最大大允許長度;最大允許許長度也可可以省略,但但缺點是編譯譯器不會檢查查段是否溢出出和別的段重重疊了。起起始地址= +0表示示緊接著上一一段開始的連連續地址。55. * (InRooot$Seectionns)是復制制代碼的代碼碼6. UNNINT關鍵鍵字表示不進進行初始化清清零值得注意的是:在一個sccatterr文件中,同同一個.o文文件不能出現現2次,即使使是在2個不不同的加載域域中也不可以以,否則會報報錯:Ambbiguouus sellectorrs fouund foor *.oo,錯誤的例例子:LOAD1 00 x0000

55、00000 EEXE1 Init.o LOAD2 00 xFFFFF0000 EEXE2 Init.o 想起了中學里哲哲學課上老師師讓解釋為什什么人不能兩兩次踏入同一一條河流,當當年稀里糊涂涂的寫的答案案,老師批了了個大差,回回去有沒有補補上,今天居居然在這里遇遇到了老問題題。推測測是編譯器自自動生成的sscatteer載入代碼碼InRooot$Seectionns不支持把把同一objj搬移2次。這 就帶來一個問題:如果希望把同一段代碼(如中斷跳轉表)載入2份拷貝到不同的地址,咋整?一個笨辦法是自己寫一段代碼搬移程序來代替編譯器自動生成的搬移 代碼,但前提是需要搞懂映像文件的組織,增加了工作量

56、。投機一點的方法是在makefile中把一個.o文件復制并重新起一個名字,然后把它們傳遞給 armlink。另外,猜測scatter語法可能包含諸如+duplicate之類的關鍵字來允許同一段的多個副本,懶得翻ARM手冊,請哪位知情者留 言告知,謝過將程序執行到CC文件的maain函數我的第一個實實驗 將將程序執行到到C文件的mmain函數數 實驗目的 運用ADS編寫寫一個小程序序,使程序能能夠從起始的的匯編代碼運運行到C程序序的mainn()函數(這這也可稱作非非常簡單的起起動代碼),并并通過仿真器器連接目標板板,最終能夠夠在AT911SAM7SS64里正確確運行。 實驗程序和參參數設置 1

57、連接器的選選項設置 選項設置如圖22-1所示。因因為在AT991SAM77S64中FFLASH存存儲器的地址址是以0 x00開始,而SSRAM的地地址是以0 xx002000000開始始,所以我將將下圖中的RRO Basse和RW Base分分別設置成了了0 x0和00 x002000000。其其它設置請參參考有關書籍籍。 圖2-1. 選選項設置圖 2啟動代碼 在ARM應用系系統中,芯片片復位后,在在進入C語言言的 maiin()函數數前,都要執執行一段啟動動代碼。該代代碼一般都是是用匯編語言言編寫,用來來完成系統運運行環境和應應用程序的初初始化,詳情情請參考有關關書籍。由于于本實驗的 目的很

58、簡單單,就是想讓讓程序復位后后,進入maain()函函數,所以有有些初始化代代碼盡量精簡簡,留下了下下述代碼。另另外,_mmain是CC語言的內部部庫函數,可可以在 進入入用戶maiin()之前前完成內部RRAM的初始始化工作,類類似KeillC51中的的starttup.a551。當執行行完_maain這段代代碼后,再跳跳轉到 maain()函函數。 AREA innit,COODE,REEADONLLY CODE322 Mode_USSR EQQU 0 xx10 ;CCPSR中各各種處理器模模式對應的控控制位 I_Bit EQU 0 x800 ;CPSSR中的中斷斷禁止位 F_Bit EQ

59、U 0 x400 USR_Staack EEQU 00 x002003000 ;定義RAAM的最高地地址,無重映映射 ENTRY BB InittResett ; 0 x00 Resett handdler undefveec B unddefvecc ; 0 x04 Undeffined Instrructioon swivec B swiivec ; 0 x08 Softwware IInterrrupt pabtvecc B pabbtvec ; 0 x0CC Preffetch Abortt dabtvecc B dabbtvec ; 0 x100 Dataa Aborrt rsvdv

60、ecc B rsvvdvec ; 0 x144 reseerved irqvec B iirqvecc ; 0 x18 IRQ fiqvec B ffiqvecc ; 0 x1c FIQ InitResset MSR CPPSR_c,#Modee_USR | I_BBit | F_Bitt ;改成用用戶模式且禁禁止IRQ和和FIQ中斷斷 LDR SPP,=USRR_Stacck IMPORTT _mmain b _mainn ;跳轉轉到_maain執行,它它位于C運行行時庫中 END 3C語言主函函數 在C語言主函數數中做了一個個死循環,如如下述所示。 int maiin(voiid) whi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論