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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

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

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

9、xx000000000-00 x00000003c)映射到是片片外flassh中的0 xx800000000-00 x80000003c中中的值;功能能上與MEMMMAP=11時的差不多多,因為一旦旦程序固化到到flashh中,即為只只讀,只是數(shù)數(shù)值映射而已已!設(shè)置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中的數(shù)數(shù)據(jù)是完全一一樣的 向RRAM中寫進(jìn)進(jìn)數(shù)據(jù) 然后后通過數(shù)據(jù)窗窗口觀察0XX0地址的變變化 應(yīng)該是是同步變化的的存儲器類型和時時序配置 主要

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

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

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

14、同的狀態(tài),讓讓后給SP賦賦值。注意:不要切換到到User模模式進(jìn)行Usser模式的的堆棧設(shè)置,因因為進(jìn)入Usser模式后后就不 能再再操作CPSSR回到別的的模式了,可可能會對接下下去的程序執(zhí)執(zhí)行造成影響響。這是一段段堆棧初始化化的代碼示例例,其中只定定義了三種模模式的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初始化化應(yīng)用程序執(zhí)執(zhí)行環(huán)境如果果使用分散加加載描述文件件調(diào)整堆棧和和堆放置,則則鏈接器創(chuàng)建建 _usser_innitiall_stacckheapp() 函數(shù)數(shù),并使用鏈鏈接器定義的的符號作為這這些區(qū)域的名名稱。映像一開始總是是存儲在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面執(zhí)行,也也可以轉(zhuǎn)移到到速度更快的的RAM中執(zhí)執(zhí)行;而RWW和 ZI這這兩部分是必必須轉(zhuǎn)移到可可寫的RAMM里去。所謂謂應(yīng)用程序執(zhí)執(zhí)行環(huán)境的初初

16、始化,就是是完成必要的的從ROM到到RAM的數(shù)數(shù)據(jù)傳輸和內(nèi)內(nèi)容清零。下下面是在ADDS下,一種種常用存儲器器模型的直接接實現(xiàn):LDDR r0,=|Imaage$RRO$Liimit| 得到RW數(shù)數(shù)據(jù)源的起始始地址LDRR r1,=|Imagge$RWW$Basse| RWW區(qū)在RAMM里的執(zhí)行區(qū)區(qū)起始地址LLDR r22,=|Immage$ZI$BBase| ZI區(qū)在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程序?qū)崿F(xiàn)了了RW數(shù)據(jù)的的拷貝和ZII區(qū)域的清零零功能。其中中引用到的44個符號是由由鏈接器第一一輸出的。|Imagee$RO$Limiit|:表示示RO區(qū)末地地址后面的地地址,即RWW數(shù)據(jù)源的起起始地址|IImage$RW$Base|:RW區(qū)在在RAM里的的執(zhí)行區(qū)起始始地址,也就就是編譯器選選項RW_BBase指定定的地址|IImage$ZI$Base|:ZI區(qū)在在RAM里面面的起始地址址|Imagge$ZII$Limmit|:ZZI區(qū)在RAAM里面的結(jié)結(jié)束地址后面面的一個地址址程 序先

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

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

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

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

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

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

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

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

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

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

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

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

30、h策略略,WB開啟啟,第四行的的含義是,當(dāng)當(dāng)C=1,B=1時時,cachhe使用wrrite bback策略略,WB開啟啟。 可以看看到,對第 三種類型的的cachee,C和B位位不再“嚴(yán)格格”是其本來來控制caccheablle和buffferabble的含義義,而是利用用這兩位的“組組合”來控制制cachee和 WB的的表現(xiàn)行為,這這樣做比另外外再增加一位位來選擇caache的wwrite back策策略和wriite thhroughh策略硬件上上節(jié)約了資源源,效果上卻卻差不多,少少了cachhe和WB幾幾種意義不大大的組合,應(yīng)應(yīng)該說還是挺挺巧妙的。ARM啟動代碼碼設(shè)計參考 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 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏 基于ARM的芯芯片多數(shù)為復(fù)復(fù)雜的片上系系統(tǒng),這種復(fù)復(fù)雜系統(tǒng)里的的多數(shù)硬件模模塊都是可配配置的,需要要由軟件來設(shè)設(shè)置其需要的的工作狀態(tài)。因因此在用戶的的應(yīng) 用程序序之前,需要要由專門的一一段代碼來完完成對系統(tǒng)的的初始化。由由于這類代碼碼直接面對處處理器內(nèi)核和和硬件控制器器進(jìn)行編程,一一般都是用匯匯編語言。一一般通用的內(nèi)內(nèi)容包 括: 中斷向量量表 初始化化存儲器系統(tǒng)統(tǒng) 初始化堆堆棧 初始化化有特殊要求求的斷口,設(shè)設(shè)備 初始化化用戶程序執(zhí)執(zhí)行環(huán)境 改改變處理器模模式 呼叫主主應(yīng)用程序 1.中中斷向

33、量表 ARM要求求中斷向量表表必須放置在在從0地址開開始,連續(xù)88X4字節(jié)的的空間內(nèi)。 每當(dāng)一個中中斷發(fā)生以后后,ARM處處理器便強(qiáng)制制把PC指針針置為向量表表中對應(yīng)中斷斷類型的地址址值。因為每每個中斷只占占據(jù)向量表中中1個字的存存儲空間,只只能放置一條條ARM指令令,使程序跳跳轉(zhuǎn)到存儲器器的其他地方方,再執(zhí)行中中斷處理。 中斷向量表表的程序?qū)崿F(xiàn)現(xiàn)通常如下表表示: ARREABooot,CCODE,READOONLY EENTRY BResettHandller BUnndefHaandlerr BSWIHHandleer BPreeAborttHandller BDaataAboortHan

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

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

36、下去的的程序執(zhí)行造造成影響。 這是一段堆堆棧初始化的的代碼示例,其其中只定義了了三種模式的的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.初始始化有特殊要要求的端口,設(shè)設(shè)

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

38、,=|Immage$ZI$BBase|;ZII區(qū)在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 程序?qū)崒崿F(xiàn)了RW數(shù)數(shù)據(jù)的拷貝和和ZI區(qū)域的的清零功能。其其中引用到的的4個符號是是由鏈接器第第一輸出的。 |Imagge$ROO$Limmit|:表表示RO區(qū)末末地址后面的的地址,即RRW數(shù)據(jù)源的的起始地址 |I

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

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

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

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

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

44、函數(shù)mainn()在ADDS中有特殊殊的意義。當(dāng)當(dāng)一個程序工工程項目中存存在 maiin()時,連連接器會把_main和和_rt_eentry中中的初始化代代碼連接進(jìn)來來;如果沒有有main()函數(shù),初初始化過程就就不會被連接接,初始化過過程中一 些些標(biāo)準(zhǔn)的C庫庫函數(shù)失效。而而用戶應(yīng)用程程序初始化過過程并未顯式式的完成這些些堆棧初始化化及數(shù)據(jù)拷貝貝操作,應(yīng)用用程序?qū)觿硬怀晒Α?、_maiin()為編編譯系統(tǒng)提供供的一個庫函函數(shù),使用_mainn標(biāo)號引導(dǎo)系系統(tǒng)時必須將將應(yīng)用程序的的入口數(shù)定義義為mainn();3、若希望系統(tǒng)統(tǒng)進(jìn)入應(yīng)用程程序前自動完完成系統(tǒng)調(diào)用用(如庫函數(shù)數(shù)的初始化、RRW、

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

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

47、aain接著將將應(yīng)用入口改改為int main(void) 而非innt Maiin(voiid),程序序也得到正確確的執(zhí)行;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.)建議議和我一樣的的初學(xué)者還是是乖乖的B _maiin接著將應(yīng)應(yīng)用入口設(shè)置置為mainn()函數(shù)的的好。ARM編程:SScatteer文件的編編寫、分析scatterr基本點:11. 編譯后后輸出的映像像文件中各段段是首尾相連連的,中間沒沒有空閑的區(qū)區(qū)域,它們的的先后關(guān)系是是根據(jù)鏈接時時參數(shù)的先后后次序決定的的 armllinkerr -fille1.o file22.o 2. sccatterr用于將編譯譯后的映像文文件中的特定定段加載到多多個分散的指指定內(nèi)存區(qū)域域3. 有22類域r

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

51、地址址生成啟動代代碼,實現(xiàn)對對映像的加載載,而這一段段代碼就 是是* (InnRoot$Secttions)它是_mmain()的一部分。這這就是在匯編編啟動代碼的的最后跳轉(zhuǎn)到到_maiin() 而而不是跳向mmain()的原因之一一。7. 起起始地址與加加載域重合的的執(zhí)行域成為為root regioon,* (InRooot$Seectionns)必須放放在這個執(zhí)行行域中,否則則鏈接的時候候會報錯。*(+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,指定棧棧頂?shù)刂?SDRRAM2 +0 UNIINIT heap.o (+ZZI) 注解:1. RROM_LOOAD是加載載域。這里只只有一個,也也可以有多個個(rom地地址不連續(xù)的的情況)2. ROM、SSRAM、SSDRAM11、SDRAAM2是執(zhí)行行域,有多個個。第一個執(zhí)執(zhí)行域必須和和加載域地址址重合,因為為ARM的復(fù)復(fù)位地址就是是加載域的起起始地址(有有bootsstrap的的話加載域址址就是boootstraap執(zhí)行完后后的跳轉(zhuǎn)地址址)3. vvectorrs.o (+RO, +FIRSST) 中斷斷向量表放在在最開頭4. ROM 0 x000000000

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

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

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

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

58、簡單單,就是想讓讓程序復(fù)位后后,進(jìn)入maain()函函數(shù),所以有有些初始化代代碼盡量精簡簡,留下了下下述代碼。另另外,_mmain是CC語言的內(nèi)部部庫函數(shù),可可以在 進(jìn)入入用戶maiin()之前前完成內(nèi)部RRAM的初始始化工作,類類似KeillC51中的的starttup.a551。當(dāng)執(zhí)行行完_maain這段代代碼后,再跳跳轉(zhuǎn)到 maain()函函數(shù)。 AREA innit,COODE,REEADONLLY CODE322 Mode_USSR EQQU 0 xx10 ;CCPSR中各各種處理器模模式對應(yīng)的控控制位 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 ;跳轉(zhuǎn)轉(zhuǎn)到_maain執(zhí)行,它它位于C運行行時庫中 END 3C語言主函函數(shù) 在C語言主函數(shù)數(shù)中做了一個個死循環(huán),如如下述所示。 int maiin(voiid) whi

溫馨提示

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

評論

0/150

提交評論