![ARM處理器系統(tǒng)初始化過(guò)程_第1頁(yè)](http://file4.renrendoc.com/view/d1ccde849713cbee2cc86c245d919d4b/d1ccde849713cbee2cc86c245d919d4b1.gif)
![ARM處理器系統(tǒng)初始化過(guò)程_第2頁(yè)](http://file4.renrendoc.com/view/d1ccde849713cbee2cc86c245d919d4b/d1ccde849713cbee2cc86c245d919d4b2.gif)
![ARM處理器系統(tǒng)初始化過(guò)程_第3頁(yè)](http://file4.renrendoc.com/view/d1ccde849713cbee2cc86c245d919d4b/d1ccde849713cbee2cc86c245d919d4b3.gif)
![ARM處理器系統(tǒng)初始化過(guò)程_第4頁(yè)](http://file4.renrendoc.com/view/d1ccde849713cbee2cc86c245d919d4b/d1ccde849713cbee2cc86c245d919d4b4.gif)
![ARM處理器系統(tǒng)初始化過(guò)程_第5頁(yè)](http://file4.renrendoc.com/view/d1ccde849713cbee2cc86c245d919d4b/d1ccde849713cbee2cc86c245d919d4b5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ARM處理器系統(tǒng)初始化過(guò)程 1 禁止MMUU,關(guān)閉中斷斷,禁止caache;2 根據(jù)硬件設(shè)設(shè)計(jì)配制好處處理器時(shí)鐘、DDRAM時(shí)鐘鐘、定時(shí)器時(shí)時(shí)鐘;3 根據(jù)系統(tǒng)中中所用的fllash和DDRAM芯片片容量和電氣氣參數(shù)設(shè)置它它們的起始地地址、容量、刷刷新頻率等;4 將固化在fflash芯芯片中的程序序搬移到DRRAM內(nèi)存中中;5 使能cacche,使能能MMU,跳跳轉(zhuǎn)到DRAAM內(nèi)存中運(yùn)運(yùn)行繼續(xù)初始始化,包括根根據(jù)具體應(yīng)用用以及系統(tǒng)中中的硬件配置置初始化各個(gè)個(gè)功能模塊、安安裝好異 常中斷處理理程序、使能能中斷等;6 進(jìn)行操作系系統(tǒng)相關(guān)初始始化;禁止MMU,關(guān)關(guān)閉中斷,禁禁止cachhe通過(guò)寫(xiě)系統(tǒng)控
2、制制協(xié)處理器的的寄存器1 的第0 位位可以允許和和禁止MMUU。在復(fù)位后后這位是0,MMMU 被禁禁止。關(guān)閉中斷與打開(kāi)開(kāi)中斷中斷是一種高效效的對(duì)話(huà)機(jī)制制,但有時(shí)并并不想程序運(yùn)運(yùn)行的過(guò)程中中中斷運(yùn)行,比比如正在打印印東西,但程序突然中中斷了,又讓讓另外一個(gè)程程序輸出打印印內(nèi)容,這樣樣在打印機(jī)上上就會(huì)亂得不不得了,同時(shí)有兩份以上上的文件交錯(cuò)錯(cuò)地打印在一一張紙上。像像不可剝奪的的資源,就一一定要關(guān)閉中中斷,讓它占有這個(gè)資源源。在A(yíng)RMM里,沒(méi)有像像x86那樣樣有清除中斷斷指令CLII。那么在A(yíng)ARM里是怎怎么樣實(shí)現(xiàn)關(guān)中斷和開(kāi)中斷斷的呢?下面面就來(lái)看看AARM的關(guān)中中斷和開(kāi)中斷斷實(shí)現(xiàn)。vooid Lo
3、ock(vooid)stmddbsp!, r00mrssr0, cpsrorr rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面這段程序序是通過(guò)設(shè)置置CPSR的的第6,7位位來(lái)實(shí)現(xiàn)的,因因?yàn)榈?,77位是設(shè)置為為1時(shí),就不不再響應(yīng)中斷。void UnnLock(void)stmddbsp!, r00mrssr0, cpsrbic rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面是重新新開(kāi)中斷的命命令,同樣是是設(shè)置CPSSR的第6,77位,但它的的值是0,就就可接收中斷斷了。如果在多個(gè)任務(wù)務(wù)之間進(jìn)行共共享
4、數(shù)據(jù),一一般是需要使使用關(guān)中斷和和開(kāi)中斷實(shí)現(xiàn)現(xiàn)數(shù)據(jù)同步的的,其實(shí)中這種關(guān)中斷和和開(kāi)中斷,就就是進(jìn)入臨界界區(qū)和退出臨臨界區(qū)。如果果是像PC機(jī)機(jī)那樣有多個(gè)個(gè)CPU的話(huà)話(huà),關(guān)中斷并并不能防止這這種情況。系統(tǒng)的在應(yīng)用編編程(IAPP)以及在系系統(tǒng)編程功能能(ISP)等等。中斷向量表ARRM要求中斷斷向量表必須須放置在從00地址開(kāi)始,連連續(xù)8X4字字節(jié)的空間內(nèi)內(nèi)。每當(dāng)一個(gè)個(gè)中斷發(fā)生以以后,ARMM處理器便強(qiáng)強(qiáng)制把PC指指針置為向量量表中對(duì)應(yīng)中中斷類(lèi)型的地地址值。因?yàn)闉槊總€(gè)中斷只只占據(jù)向量表表中1個(gè)字的的存儲(chǔ)空間,只只能放置一條條ARM指令令,使程序跳跳轉(zhuǎn)到存儲(chǔ)器器的其他地方方,再執(zhí)行中中斷處理。中中斷向
5、量表的的程序?qū)崿F(xiàn)通通常如下表示示:AREAA Boott ,CODDE, REEADONLLYENTRRYB ReesetHaandlerrB UnddefHanndlerBB SWIHHandleerB PrreAborrtHanddlerB DataAAbortHHandleerBB IRQQHandllerB FFIQHanndler其其中關(guān)鍵字EENTRY是是指定編譯器器保留這段代代碼,因?yàn)榫幘幾g器可能會(huì)會(huì)認(rèn)為這是一一段亢余代碼碼而加以?xún)?yōu)化化。鏈接的時(shí)時(shí)候要確保這這段代碼被鏈鏈接在0地址址處,并且作作為整個(gè)程序序的入口。Q:為什么在在中斷向量表表中不直接LLDR PCC,異常地地址.而
6、是是使用一個(gè)標(biāo)標(biāo)號(hào),然有再再在后面使用用DCD定義義這個(gè)標(biāo)號(hào)AA:因?yàn)長(zhǎng)DDR指令只能能跳到當(dāng)前PPC 4kBB范圍內(nèi),而而B(niǎo)指令能跳跳轉(zhuǎn)到32MMB范圍,而而現(xiàn)在這樣在在LDR PPC, xxxxx這這條指令不遠(yuǎn)遠(yuǎn)處用xxxxxDCCD定義一個(gè)個(gè)字,而這個(gè)個(gè)字里面存放放最終異常服服務(wù)程序的地地址,這樣可可以實(shí)現(xiàn)4GGB全范圍跳跳轉(zhuǎn).Q: LDR 不不是可以全空空間跳轉(zhuǎn)的嗎嗎 ARMM微控制器基基礎(chǔ)與實(shí)戰(zhàn)程程序清單5.3.A: LDR偽指指令通過(guò)設(shè)置置指令緩沖池池才能實(shí)現(xiàn)全全范圍跳轉(zhuǎn),而LDR指指令則只能實(shí)實(shí)現(xiàn)4KB范范圍跳轉(zhuǎn).MEMMAP=0:開(kāi)機(jī)默默認(rèn)值,Booot裝載模模式向量表(00
7、x000000000-0 x00000003cc)映射的是是BootBBlock中中的0 x7FFFFE0000-0 x77FFFF003c中的值值;芯片復(fù)位位時(shí),啟動(dòng)bboot裝載載程序,booot裝載程程序檢查P00.14口的的狀態(tài)和用戶(hù)戶(hù)的異常向量量,判斷是進(jìn)進(jìn)入ISP狀狀態(tài)還是啟動(dòng)動(dòng)用戶(hù)程序,若若啟動(dòng)用戶(hù)程程序,則自動(dòng)動(dòng)設(shè)置MEMMMAP=11(片內(nèi)fllash啟動(dòng)動(dòng))或3(片片外程序存儲(chǔ)儲(chǔ)器啟動(dòng))。很奇怪的,我在在實(shí)驗(yàn)中,當(dāng)當(dāng)使用無(wú)片內(nèi)內(nèi)flashh的LPC22210時(shí)即即使設(shè)置P00.14為高高低都沒(méi)關(guān)系系,芯片會(huì)跳跳過(guò)繼而執(zhí)行行片外flaash中的代代碼. MEMMMAP=11:
8、中斷向量量表就在片內(nèi)內(nèi)flashh中,地址就就是0 x0000000000-0 x000000003c,相當(dāng)當(dāng)于沒(méi)有映射射;MEMMMAP=22:最為主要要的設(shè)置,即即是重映射的的關(guān)鍵之所在在,當(dāng)設(shè)置MMEMMAPP=2 時(shí),中斷斷向量表(00 x000000000-0 x00000003cc)映射的是是片內(nèi)SRAAM中的0 xx400000000-00 x40000003c中中的值,而因因?yàn)槭荢RAAM,所以在在程序運(yùn)行的的過(guò)程中是可可以改變的,這這樣就可以達(dá)達(dá)到重映射的的目的啦(中中斷向量表可可以隨時(shí)修改改)。 MEMMMAP=33:中斷向量量表就在片外外flashh中,中斷向向量表(0
9、xx000000000-00 x00000003c)映射到是片片外flassh中的0 xx800000000-00 x80000003c中中的值;功能能上與MEMMMAP=11時(shí)的差不多多,因?yàn)橐坏┑┏绦蚬袒降絝lashh中,即為只只讀,只是數(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有兩個(gè)個(gè)控制位 MMEMMAPP1:000 BOOTT裝載程序模模式01 Userr FLASSH模式100 用戶(hù)RAAM模式111 用戶(hù)外部部存儲(chǔ)器模式式10模式也也就是RAMM模式 我們們?cè)L問(wèn)地址00X00是跟跟訪(fǎng)問(wèn)RAMM地址0X4400000000中的數(shù)數(shù)據(jù)是完全一一樣的 向RRAM中寫(xiě)進(jìn)進(jìn)數(shù)據(jù) 然后后通過(guò)數(shù)據(jù)窗窗口觀(guān)察0XX0地址的變變化 應(yīng)該是是同步變化的的存儲(chǔ)器類(lèi)型和時(shí)時(shí)序配置 主要
11、是對(duì)對(duì)系統(tǒng)存儲(chǔ)器器控制器(MMMU)的初初始化。由于于存儲(chǔ)器控制制器并不是AARM架構(gòu)的的一部分,不不同芯片的實(shí)實(shí)現(xiàn)方式各不不相同。由于于運(yùn)算能力和和尋址能力的的強(qiáng)大,基于于A(yíng)RM內(nèi)核核的微處理器器系統(tǒng)一般都都需要外擴(kuò)展展各種類(lèi)型的的存儲(chǔ)器。對(duì)對(duì)于存儲(chǔ)器系系統(tǒng)的初始化化一般包括如如下幾個(gè)方面面:存儲(chǔ)器類(lèi)型型、時(shí)序和總總線(xiàn)寬度的配配置存儲(chǔ)器地址址的配置(1)存儲(chǔ)器類(lèi)類(lèi)型 基于A(yíng)RRM微處理系系統(tǒng)的存儲(chǔ)器器一般有如下下幾類(lèi):SAARM,DRRAM,Fllah,同時(shí)時(shí),即使同類(lèi)類(lèi)存儲(chǔ)器也有有訪(fǎng)問(wèn)速度上上的不同。其其中,SRAAM和Flaah屬于靜態(tài)態(tài)存儲(chǔ)器,可可以共用存儲(chǔ)儲(chǔ)器端口,而而DRAM有有動(dòng)
12、態(tài)刷新和和地址復(fù)用等等特征,需要要專(zhuān)門(mén)的存儲(chǔ)儲(chǔ)器端口。(2)時(shí)序 存儲(chǔ)器端端口的接口時(shí)時(shí)序優(yōu)化對(duì)系系統(tǒng)性能影響響非常大,因因?yàn)橄到y(tǒng)運(yùn)行行的速度瓶頸頸一般都存在在于存儲(chǔ)器的的訪(fǎng)問(wèn),因此此希望存儲(chǔ)器器的訪(fǎng)問(wèn)盡可可能快,但又又要考慮由此此帶來(lái)的系統(tǒng)統(tǒng)穩(wěn)定性問(wèn)題題。(3)總線(xiàn)寬度度 ARM微微處理器架構(gòu)構(gòu)支持8/116/32位位的數(shù)據(jù)總線(xiàn)線(xiàn)寬度訪(fǎng)問(wèn)存存儲(chǔ)器和外設(shè)設(shè),對(duì)于特定定的存儲(chǔ)器來(lái)來(lái)說(shuō),需要設(shè)設(shè)定數(shù)據(jù)總線(xiàn)線(xiàn)的寬度。(4)存儲(chǔ)器地地址的配置 ARM微微處理器架構(gòu)構(gòu)理論上可以以支持4GBB的地址空間間,而對(duì)于一一個(gè)實(shí)際的系系統(tǒng)來(lái)說(shuō),配配置的物理地地址遠(yuǎn)沒(méi)有這這么多,因此此,如何配置置存儲(chǔ)器的地地址,也
13、是一一個(gè)重要的問(wèn)問(wèn)題。(5)存儲(chǔ)器地地址重映射 存儲(chǔ)器地地址重映射就就是可以通過(guò)過(guò)軟件配置來(lái)來(lái)改變一塊存存儲(chǔ)器物理地地址的方法,是是當(dāng)前許多先先進(jìn)控制器所所具有的功能能。進(jìn)行地址重映射射的原因:提提高系統(tǒng)的運(yùn)運(yùn)行效率。進(jìn)行地址重映射射的注意:保保證程序流程程的連續(xù)性。有的ARM處理理器不具有地地址重映射的的功能,可以以采樣代碼搬搬移加跳轉(zhuǎn)的的方式完成上上述功能。初初始化堆棧因因 為ARMM有7種執(zhí)行行狀態(tài),每一一種狀態(tài)的堆堆棧指針寄存存器(SP)都都是獨(dú)立的。因因此,對(duì)程序序中需要用到到的每一種模模式都要給SSP定義一個(gè)個(gè)堆棧地址。方方法是改變狀狀 態(tài)寄存器器內(nèi)的狀態(tài)位位,使處理器器切換到不同
14、同的狀態(tài),讓讓后給SP賦賦值。注意:不要切換到到User模模式進(jìn)行Usser模式的的堆棧設(shè)置,因因?yàn)檫M(jìn)入U(xiǎn)sser模式后后就不 能再再操作CPSSR回到別的的模式了,可可能會(huì)對(duì)接下下去的程序執(zhí)執(zhí)行造成影響響。這是一段段堆棧初始化化的代碼示例例,其中只定定義了三種模模式的SP指指針:MRSS R0,CCPSRBIIC R0,R0,#MMODEMAASK 安全全起見(jiàn),屏蔽蔽模式位以外外的其他位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ù),并使用鏈鏈接器定義的的符號(hào)作為這這些區(qū)域的名名稱(chēng)。映像一開(kāi)始總是是存儲(chǔ)在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面執(zhí)行,也也可以轉(zhuǎn)移到到速度更快的的RAM中執(zhí)執(zhí)行;而RWW和 ZI這這兩部分是必必須轉(zhuǎn)移到可可寫(xiě)的RAMM里去。所謂謂應(yīng)用程序執(zhí)執(zhí)行環(huán)境的初初
16、始化,就是是完成必要的的從ROM到到RAM的數(shù)數(shù)據(jù)傳輸和內(nèi)內(nèi)容清零。下下面是在A(yíng)DDS下,一種種常用存儲(chǔ)器器模型的直接接實(shí)現(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個(gè)符號(hào)是由由鏈接器第一一輸出的。|Imagee$RO$Limiit|:表示示RO區(qū)末地地址后面的地地址,即RWW數(shù)據(jù)源的起起始地址|IImage$RW$Base|:RW區(qū)在在RAM里的的執(zhí)行區(qū)起始始地址,也就就是編譯器選選項(xiàng)RW_BBase指定定的地址|IImage$ZI$Base|:ZI區(qū)在在RAM里面面的起始地址址|Imagge$ZII$Limmit|:ZZI區(qū)在RAAM里面的結(jié)結(jié)束地址后面面的一個(gè)地址址程 序先
18、把把ROM里|Imagee$RO$Limtt|開(kāi)始的RRW初始數(shù)據(jù)據(jù)拷貝到RAAM里面|IImage$RW$Base|開(kāi)始的地址址,當(dāng)RAMM這邊的目 標(biāo)地址到達(dá)達(dá)|Imagge$ZII$Basse|后就表表示RW區(qū)的的結(jié)束和ZII區(qū)的開(kāi)始,接接下去就對(duì)這這片ZI區(qū)進(jìn)進(jìn)行清零操作作,直到遇到到結(jié)束地 址址|Imagge$ZII$Limmit|改變變處理器模式式因?yàn)樵诔跏际蓟^(guò)程中,許許多操作需要要在特權(quán)模式式下才能進(jìn)行行(比如對(duì)CCPSR的修修改),所以以要特別注意意不能過(guò)早的的進(jìn)入用戶(hù)模模式。內(nèi)核級(jí)級(jí)的中斷使能能也可以考慮慮在這一步進(jìn)進(jìn)行。如果系系統(tǒng)中另外存存在一個(gè)專(zhuān)門(mén)門(mén)的中斷控制制器,這么
19、做做總是安全的的。呼叫主應(yīng)應(yīng)用程序當(dāng)所所有的系統(tǒng)初初始化工作完完成之后,就就需要把程序序流程轉(zhuǎn)入主主應(yīng)用程序。最最簡(jiǎn)單的一種種情況是:IIMPORTT mainnB maiin直接從啟啟動(dòng)代碼跳轉(zhuǎn)轉(zhuǎn)到應(yīng)用程序序的主函數(shù)入入口,當(dāng)然主主函數(shù)名字可可以由用戶(hù)隨隨便定義。在在A(yíng)RM AADS環(huán)境中中,還另外提提供了一套系系統(tǒng)級(jí)的呼叫叫機(jī)制。IMMPORT _maiinB _main_mainn()是編譯譯系統(tǒng)提供的的一個(gè)函數(shù),負(fù)負(fù)責(zé)完成庫(kù)函函數(shù)的初始化化和初始化應(yīng)應(yīng)用程序執(zhí)行行環(huán)境,最后后自動(dòng)跳轉(zhuǎn)到到main()函數(shù)。ARM 介紹ARM微處理器器的工作狀態(tài)態(tài)一般有兩種種,并可在兩兩種狀態(tài)之間間切換:
20、 第第一種為ARRM狀態(tài),此此時(shí)處理器執(zhí)執(zhí)行32位的的字對(duì)齊的AARM指令; 第二種為為T(mén)humbb狀態(tài),此時(shí)時(shí)處理器執(zhí)行行16位的、半半字對(duì)齊的TThumb指指令。 在程程序的執(zhí)行過(guò)過(guò)程中,微處處理器可以隨隨時(shí)在兩種工工作狀態(tài)之間間切換,并且且,處理器工工作狀態(tài)的轉(zhuǎn)轉(zhuǎn)變并不影響響處理器的工工作模式和相相應(yīng)寄存器中中的內(nèi)容。但但ARM微處處理器在開(kāi)始始執(zhí)行代碼時(shí)時(shí),應(yīng)該處于于A(yíng)RM狀態(tài)態(tài)。 ARMM處理器狀態(tài)態(tài) 進(jìn) 入TThumb狀狀態(tài):當(dāng)操作作數(shù)寄存器的的狀態(tài)位(位位0)為1時(shí)時(shí),可以采用用執(zhí)行BX指指令的方法,使使微處理器從從ARM狀態(tài)態(tài)切換到Thhumb狀態(tài)態(tài)。此外,當(dāng)當(dāng)處理器處 于Th
21、ummb狀態(tài)時(shí)發(fā)發(fā)生異常(如如IRQ、FFIQ、Unndef、AAbort、SSWI等),則則異常處理返返回時(shí),自動(dòng)動(dòng)切換到Thhumb狀態(tài)態(tài)。 進(jìn)入AARM狀態(tài):當(dāng)操作數(shù)寄寄存器的狀態(tài)態(tài)位為0時(shí),執(zhí)執(zhí)行BX指令令時(shí)可以使微微處理器從TThumb狀狀態(tài)切換到AARM狀態(tài)。此此外,在處理理器進(jìn)行異常常處理時(shí),把把PC指針?lè)欧湃氘惓DJ绞芥溄蛹拇嫫髌髦?,并從異異常向量地址址開(kāi)始執(zhí)行程程序,也可以以使處理器切切換到ARMM狀態(tài)。ARM處理器模模式 ARMM微處理器支支持7種運(yùn)行行模式,分別別為: 用戶(hù)戶(hù)模式(ussr):ARRM處理器正正常的程序執(zhí)執(zhí)行狀態(tài)。 快速中斷模模式(fiqq):用于高高速數(shù)
22、據(jù)傳輸輸或通道處理理。 外部中中斷模式(iirq):用用于通用的中中斷處理。 管理模式(svc):操作系統(tǒng)使使用的保護(hù)模模式。 數(shù)據(jù)據(jù)訪(fǎng)問(wèn)終止模模式(abtt):當(dāng)數(shù)據(jù)據(jù)或指令預(yù)取取終止時(shí)進(jìn)入入該模式,可可用于虛擬存存儲(chǔ)及存儲(chǔ)保保護(hù)。 系統(tǒng)統(tǒng)模式(syys):運(yùn)行行具有特權(quán)的的操作系統(tǒng)任任務(wù)。 定義義指令中止模模式(undd):當(dāng)未定定義的指令執(zhí)執(zhí)行時(shí)進(jìn)入該該模式,可用用于支持硬件件協(xié)處理器的的軟件仿真。 ARM處理理器模式 AARM微處理理器的運(yùn)行模模式可以通過(guò)過(guò)軟件改變,也也可以通過(guò)外外部中斷或異異常處理改變變。大多數(shù)的的應(yīng)用程序運(yùn)運(yùn)行在用戶(hù)模模式下,當(dāng)處處理器運(yùn)行在在用戶(hù)模式下下時(shí),某些
23、被被保護(hù)的系統(tǒng)統(tǒng)資源是不能能被訪(fǎng)問(wèn)的。 除用戶(hù)模式式以外,其余余的所有6種種模式稱(chēng)之為為非用戶(hù)模式式,或特權(quán)模模式;其中除除去用戶(hù)模式式和系統(tǒng)模式式以外的5種種又稱(chēng)為異常常模式,常用用于處理中斷斷或異常,以以及需要訪(fǎng)問(wèn)問(wèn)受保護(hù)的系系統(tǒng)資源等情情況。 ARRM寄存器 ARM處理理器共有377個(gè)寄存器。其其中包括:331個(gè)通用寄寄存器,包括括程序計(jì)數(shù)器器(PC)在在內(nèi)。這些寄寄存器都是332位寄存器器。以及6個(gè)個(gè)32位狀態(tài)態(tài)寄存器。 關(guān)于寄存器器這里就不詳詳細(xì)介紹了,有有興趣的人可可以上網(wǎng)找找找,很多這方方面的資料。 異常處理 當(dāng) 正常的的程序執(zhí)行流流程發(fā)生暫時(shí)時(shí)的停止時(shí),稱(chēng)稱(chēng)之為異常,例例如處理
24、一個(gè)個(gè)外部的中斷斷請(qǐng)求。在處處理異常之前前,當(dāng)前處理理器的狀態(tài)必必須保留,這這樣當(dāng)異常處處理完成之后后,當(dāng) 前程程序可以繼續(xù)續(xù)執(zhí)行。處理理器允許多個(gè)個(gè)異常同時(shí)發(fā)發(fā)生,它們將將會(huì)按固定的的優(yōu)先級(jí)進(jìn)行行處理。當(dāng)一一個(gè)異常出現(xiàn)現(xiàn)以后,ARRM微處理器器會(huì)執(zhí)行以下下幾步操作: 進(jìn)入異常常處理的基本本步驟: 將將下一條指令令的地址存入入相應(yīng)連接寄寄存器LR,以以便程序在處處理異常返回回時(shí)能從正確確的位置重新新開(kāi)始執(zhí)行。將將CPSR復(fù)復(fù)制到相應(yīng)的的SPSR中中。根據(jù)異常常類(lèi)型,強(qiáng)制制設(shè)置CPSSR的運(yùn)行模模式位。 強(qiáng)強(qiáng)制PC從相相關(guān)的異常向向量地址取下下一條指令執(zhí)執(zhí)行,從而跳跳轉(zhuǎn)到相應(yīng)的的異常處理程程序處
25、。如果果異常發(fā)生時(shí)時(shí),處理器處處于Thummb狀態(tài),則則當(dāng)異常向量量地址加載入入PC時(shí),處處理器自動(dòng)切切換到ARMM狀態(tài)。 AARM微處理理器對(duì)異常的的響應(yīng)過(guò)程用用偽碼可以描描述為: RR14_ = Retuurn Liink SPPSR_= CPSR CPSR4:0 = Excceptioon Modde Nummber CCPSR55 = 00 ;當(dāng)運(yùn)行行于 ARMM 工作狀態(tài)態(tài)時(shí) If = Reeset oor FIQQ thenn;當(dāng)響應(yīng) FIQ 異異常時(shí),禁止止新的 FIIQ 異常 CPSR6 = 1 PSRR7 = 1 PCC = Exxceptiion Veector Addre
26、ess 異常常處理完畢之之后,ARMM微處理器會(huì)會(huì)執(zhí)行以下幾幾步操作從異異常返回: 將連接寄存存器LR的值值減去相應(yīng)的的偏移量后送送到PC中。 將SPSRR復(fù)制回CPPSR中。 若在進(jìn)入異異常處理時(shí)設(shè)設(shè)置了中斷禁禁止位,要在在此清除每一種異常模式式擁有自己的的物理的R113。應(yīng)用程程序初始化該該R13,使使其指向該異異常模式專(zhuān)用用的棧地址。當(dāng)當(dāng)進(jìn)入異常模模式時(shí),可以以將需要使用用的寄存器保保存在R133所指的棧中中;當(dāng)退出異異常處理程序序時(shí),將保存存在R13所所指的棧中的的寄存器值彈彈出。這樣就就使異常處理理程序不會(huì)破破壞被其中斷斷程序的運(yùn)行行現(xiàn)場(chǎng)。1。請(qǐng)問(wèn)cacche和wrrite-bbuf
27、ferr的關(guān)系,在在WB和caache同時(shí)時(shí)打開(kāi)的時(shí)候候,數(shù)據(jù)是如如何流動(dòng)的呢呢?考慮到WWB的特性,是是不是較大段段的數(shù)據(jù)被寫(xiě)寫(xiě)入WB? WB的設(shè)計(jì)是為為了防止處理理器流水線(xiàn)被被寫(xiě)數(shù)據(jù)總線(xiàn)線(xiàn)操作(寫(xiě)主主存,寫(xiě)外圍圍設(shè)備寄存器器等)拉住。典典型寫(xiě)數(shù)據(jù)總總線(xiàn)時(shí)機(jī)有三三種:一是ccache處處于writte thrrough策策略下的寫(xiě)操操作;二是ccache處處于writte bacck策略下,ddirty數(shù)數(shù)據(jù)由于caache行替替換或者被程程序主動(dòng)清空空而寫(xiě)回主存存,三是不經(jīng)經(jīng)過(guò)cachhe,直接對(duì)對(duì)數(shù)據(jù)總線(xiàn)的的寫(xiě)操作。有有了WB之后后,被寫(xiě) 回回?cái)?shù)據(jù)總線(xiàn)的的內(nèi)容在進(jìn)入入WB之后,處處理器和
28、caache就可可以立刻繼續(xù)續(xù)使用了。這這就是WB和和cachee的關(guān)系。22。還有就是是所謂“caachablle bitt”和“buufferaable bbit”的問(wèn)問(wèn)題,這個(gè)問(wèn)問(wèn)題來(lái)自于aarm-arrmparrtB 的55.4節(jié),那那里有一張表表,我對(duì)這個(gè)個(gè)表死活不理理解。這個(gè)問(wèn)問(wèn)題以前也問(wèn)問(wèn)過(guò),但是沒(méi)沒(méi)有人回答。ARM各系列的的處理器上的的cachee設(shè)計(jì)有所不不同,所以有有的cachhe只有wrrite tthrouggh策略,有有的cachhe只有wrrite bback策略略,還有的ccache是是writee backk策略但允許許一定的wrrite tthrouggh行為
29、,因因此C和B位位的四種組合合對(duì)這三種ccache而而言有不同的的含義。第一一列和第二列列分別針對(duì)wwrite throuugh型caache和wwrite back型型cachee進(jìn)行解釋?zhuān)淦浜x可以參參考我對(duì)第11個(gè)問(wèn)題的回回答,第三列列針對(duì)wriite baack策略但但允許一定的的writee throough行為為的cachhe,第一行行好理解,第第二行之所以以在B位為00的情況下依依然是buffferabble,應(yīng)該該是因?yàn)橛布系脑O(shè)計(jì)原原因(節(jié)省硬硬件資源 或或者由于目標(biāo)標(biāo)設(shè)計(jì)頻率限限制),第三三行的含義是是,當(dāng)C=1,B=0時(shí),caache使用用writee throoug
30、h策略略,WB開(kāi)啟啟,第四行的的含義是,當(dāng)當(dāng)C=1,B=1時(shí)時(shí),cachhe使用wrrite bback策略略,WB開(kāi)啟啟。 可以看看到,對(duì)第 三種類(lèi)型的的cachee,C和B位位不再“嚴(yán)格格”是其本來(lái)來(lái)控制caccheablle和buffferabble的含義義,而是利用用這兩位的“組組合”來(lái)控制制cachee和 WB的的表現(xiàn)行為,這這樣做比另外外再增加一位位來(lái)選擇caache的wwrite back策策略和wriite thhroughh策略硬件上上節(jié)約了資源源,效果上卻卻差不多,少少了cachhe和WB幾幾種意義不大大的組合,應(yīng)應(yīng)該說(shuō)還是挺挺巧妙的。ARM啟動(dòng)代碼碼設(shè)計(jì)參考 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)摘中,并分享給我的朋友 收藏 基于A(yíng)RM的芯芯片多數(shù)為復(fù)復(fù)雜的片上系系統(tǒng),這種復(fù)復(fù)雜系統(tǒng)里的的多數(shù)硬件模模塊都是可配配置的,需要要由軟件來(lái)設(shè)設(shè)置其需要的的工作狀態(tài)。因因此在用戶(hù)的的應(yīng) 用程序序之前,需要要由專(zhuān)門(mén)的一一段代碼來(lái)完完成對(duì)系統(tǒng)的的初始化。由由于這類(lèi)代碼碼直接面對(duì)處處理器內(nèi)核和和硬件控制器器進(jìn)行編程,一一般都是用匯匯編語(yǔ)言。一一般通用的內(nèi)內(nèi)容包 括: 中斷向量量表 初始化化存儲(chǔ)器系統(tǒng)統(tǒng) 初始化堆堆棧 初始化化有特殊要求求的斷口,設(shè)設(shè)備 初始化化用戶(hù)程序執(zhí)執(zhí)行環(huán)境 改改變處理器模模式 呼叫主主應(yīng)用程序 1.中中斷向
33、量表 ARM要求求中斷向量表表必須放置在在從0地址開(kāi)開(kāi)始,連續(xù)88X4字節(jié)的的空間內(nèi)。 每當(dāng)一個(gè)中中斷發(fā)生以后后,ARM處處理器便強(qiáng)制制把PC指針針置為向量表表中對(duì)應(yīng)中斷斷類(lèi)型的地址址值。因?yàn)槊棵總€(gè)中斷只占占據(jù)向量表中中1個(gè)字的存存儲(chǔ)空間,只只能放置一條條ARM指令令,使程序跳跳轉(zhuǎn)到存儲(chǔ)器器的其他地方方,再執(zhí)行中中斷處理。 中斷向量表表的程序?qū)崿F(xiàn)現(xiàn)通常如下表表示: ARREABooot,CCODE,READOONLY EENTRY BResettHandller BUnndefHaandlerr BSWIHHandleer BPreeAborttHandller BDaataAboortHan
34、ndler B BIRQHHandleer BFIQQHandller 其中中關(guān)鍵字ENNTRY是指指定編譯器保保留這段代碼碼,因?yàn)榫幾g譯器可能會(huì)認(rèn)認(rèn)為這是一段段亢余代碼而而加以?xún)?yōu)化。鏈鏈接的時(shí)候要要確保這段代代碼被鏈接在在0地址處,并并且作為整個(gè)個(gè)程序的入口口。 2.初始化存存儲(chǔ)器系統(tǒng) (1)存儲(chǔ)儲(chǔ)器類(lèi)型和時(shí)時(shí)序配置 通通常Flassh和SRAAM同屬于靜靜態(tài)存儲(chǔ)器類(lèi)類(lèi)型,可以合合用同一個(gè)存存儲(chǔ)器端口;而DRAMM因?yàn)橛袆?dòng)態(tài)態(tài)刷新和地址址線(xiàn)復(fù)用等特特性,通常配配有專(zhuān)用的存存儲(chǔ)器端口。 存儲(chǔ)器端口口的接口時(shí)序序優(yōu)化是非常常重要的,這這會(huì)影響到整整個(gè)系統(tǒng)的性性能。因?yàn)橐灰话阆到y(tǒng)運(yùn)行行的速度瓶頸頸
35、都存在于存存儲(chǔ)器訪(fǎng)問(wèn),所所以存儲(chǔ)器訪(fǎng)訪(fǎng)問(wèn)時(shí)序應(yīng)盡盡可能的快;而同時(shí)又要要考慮到由此此帶來(lái)的穩(wěn)定定性問(wèn)題。 (2)存儲(chǔ)儲(chǔ)器地址分布布 一種典型型的情況是啟啟動(dòng)ROM的的地址重映射射。3.初始化化堆棧 因?yàn)闉锳RM有77種執(zhí)行狀態(tài)態(tài),每一種狀狀態(tài)的堆棧指指針寄存器(SSP)都是獨(dú)獨(dú)立的。因此此,對(duì)程序中中需要用到的的每一種模式式都要給SPP 定義一個(gè)個(gè)堆棧地址。方方法是改變狀狀態(tài)寄存器內(nèi)內(nèi)的狀態(tài)位,使使處理器切換換到不同的狀狀態(tài),讓后給給SP賦值。注注意:不要切切換到Useer模式進(jìn)行行User模模式的堆棧設(shè)設(shè) 置,因?yàn)闉檫M(jìn)入U(xiǎn)seer模式后就就不能再操作作CPSR回回到別的模式式了,可能會(huì)會(huì)對(duì)接
36、下去的的程序執(zhí)行造造成影響。 這是一段堆堆棧初始化的的代碼示例,其其中只定義了了三種模式的的SP指針: MRSR0,CPSR BICR0,R0,#MMODEMAASK安安全起見(jiàn),屏屏蔽模式位以以外的其他位位 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)境 映 像像一開(kāi)始總是是存儲(chǔ)在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面執(zhí)行,也也可以轉(zhuǎn)移到到速度更快的的RAM中執(zhí)執(zhí)行;而RWW和ZI這兩兩部 分是必必須轉(zhuǎn)移到可可寫(xiě)的RAMM里去。所謂謂應(yīng)用程序執(zhí)執(zhí)行環(huán)境的初初始化,就是是完成必要的的從ROM到到RAM的數(shù)數(shù)據(jù)傳輸和內(nèi)內(nèi)容清零。 下面是在A(yíng)ADS下,一一種常用存儲(chǔ)儲(chǔ)器模型的直直接實(shí)現(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ū)崒?shí)現(xiàn)了RW數(shù)數(shù)據(jù)的拷貝和和ZI區(qū)域的的清零功能。其其中引用到的的4個(gè)符號(hào)是是由鏈接器第第一輸出的。 |Imagge$ROO$Limmit|:表表示RO區(qū)末末地址后面的的地址,即RRW數(shù)據(jù)源的的起始地址 |I
39、magge$RWW$Basse|:RWW區(qū)在RAMM里的執(zhí)行區(qū)區(qū)起始地址,也也就是編譯器器選項(xiàng)RW_Base指指定的地址 |Imagge$ZII$Basse|:ZII區(qū)在RAMM里面的起始始地址 |IImage$ZI$Limitt|:ZI區(qū)區(qū)在RAM里里面的結(jié)束地地址后面的一一個(gè)地址 程程 序先把RROM里|IImage$RO$Limt|開(kāi)始的RWW初始數(shù)據(jù)拷拷貝到RAMM里面|Immage$RW$BBase|開(kāi)開(kāi)始的地址,當(dāng)當(dāng)RAM這邊邊的目 標(biāo)地地址到達(dá)|IImage$ZI$Base|后就表示RRW區(qū)的結(jié)束束和ZI區(qū)的的開(kāi)始,接下下去就對(duì)這片片ZI區(qū)進(jìn)行行清零操作,直直到遇到結(jié)束束地 址|
40、IImage$ZI$Limitt| 6.改變處理器器模式 因?yàn)闉樵诔跏蓟^(guò)過(guò)程中,許多多操作需要在在特權(quán)模式下下才能進(jìn)行(比比如對(duì)CPSSR的修改),所所以要特別注注意不能過(guò)早早的進(jìn)入用戶(hù)戶(hù)模式。 內(nèi)內(nèi)核級(jí)的中斷斷使能也可以以考慮在這一一步進(jìn)行。如如果系統(tǒng)中另另外存在一個(gè)個(gè)專(zhuān)門(mén)的中斷斷控制器,這這么做總是安安全的。 77.呼叫主主應(yīng)用程序 當(dāng)所有的系系統(tǒng)初始化工工作完成之后后,就需要把把程序流程轉(zhuǎn)轉(zhuǎn)入主應(yīng)用程程序。最簡(jiǎn)單單的一種情況況是: IMMPORTmain Bmaiin 直接從從啟動(dòng)代碼跳跳轉(zhuǎn)到應(yīng)用程程序的主函數(shù)數(shù)入口,當(dāng)然然主函數(shù)名字字可以由用戶(hù)戶(hù)隨便定義。 在A(yíng)RMADS環(huán)境境中,還
41、另外外提供了一套套系統(tǒng)級(jí)的呼呼叫機(jī)制。 IMPORRT_mmain BB_maiin _main()是編譯系系統(tǒng)提供的一一個(gè)函數(shù),負(fù)負(fù)責(zé)完成庫(kù)函函數(shù)的初始化化和初始化應(yīng)應(yīng)用程序執(zhí)行行環(huán)境,最后后自動(dòng)跳轉(zhuǎn)到到main()函數(shù)。ARM中B _Mainn和B Maain的區(qū)別別轉(zhuǎn)第一種答案如下下: 在軟件仿真的情情況下,執(zhí)行行“B _main”指指令,能使程程序跳到C文文件的maiin函數(shù),但但用硬件仿真真時(shí),還沒(méi)執(zhí)執(zhí)行到maiin函數(shù)時(shí)就就進(jìn)入了異常常中斷。 原因是執(zhí)行“BB _maain”指令令后,程序先先跳到_mmain庫(kù)函函數(shù)的入口,再再進(jìn)行一些初初始化操作,最最后再跳入用用戶(hù)的maiin函
42、數(shù)。但但在初始化過(guò)過(guò)程中,由于于堆棧或其它它原 因造成成程序出錯(cuò)。有有兩種方法可可以解決這個(gè)個(gè)問(wèn)題。第一一:將“B _maiin”指令直直接改成“BB mainn”,使程序序不進(jìn)行初始始化而直接跳跳入用戶(hù)的mmain()函數(shù)。第二二:合理初始始化堆棧。由由于考慮到剛剛接觸ARMM和將問(wèn)題簡(jiǎn)簡(jiǎn)單化,我選選擇了第一種種方法。第二種答案如下下:IMPORT _maiin BL TargeetReseetInittB _maiin1、此后流程將將跳轉(zhuǎn)到ADDS提供的啟啟動(dòng)代碼_main函函數(shù)處,負(fù)責(zé)責(zé)完成庫(kù)函數(shù)數(shù)的初始化及及相關(guān)功能,并并最終引導(dǎo)處處理器入口用用戶(hù)代碼maain()函函數(shù),其代碼碼流程
43、為:嵌入式系統(tǒng)在進(jìn)進(jìn)入應(yīng)用主程程序之前必須須有一個(gè)初始始化的過(guò)程,該該過(guò)程完成系系統(tǒng)的啟動(dòng)和和初始化功能能,初始化過(guò)過(guò)程可以分成成兩部分來(lái)看看: _mainn負(fù)責(zé)設(shè)置運(yùn)運(yùn)行映像存儲(chǔ)儲(chǔ)器映射; _rt_eentry負(fù)負(fù)責(zé)庫(kù)函數(shù)的的初始化。_main完成成代碼和數(shù)據(jù)據(jù)的復(fù)制,并并把ZI數(shù)據(jù)據(jù)區(qū)清零,這這一步當(dāng)代碼碼和數(shù)據(jù)區(qū)在在存儲(chǔ)和運(yùn)行行時(shí) 處于不不同的存儲(chǔ)器器位置時(shí)有意意義。接著_main跳跳進(jìn)_rt_entryy,進(jìn)行STTACK和HHEAP等的的初始化。最最后_rt_entryy跳進(jìn)應(yīng)用程程序的入口 main()。當(dāng)應(yīng)用用程序執(zhí)行完完時(shí),_rtt_entrry又將控制制權(quán)交還給CC庫(kù)函數(shù),函
44、函數(shù)mainn()在A(yíng)DDS中有特殊殊的意義。當(dāng)當(dāng)一個(gè)程序工工程項(xiàng)目中存存在 maiin()時(shí),連連接器會(huì)把_main和和_rt_eentry中中的初始化代代碼連接進(jìn)來(lái)來(lái);如果沒(méi)有有main()函數(shù),初初始化過(guò)程就就不會(huì)被連接接,初始化過(guò)過(guò)程中一 些些標(biāo)準(zhǔn)的C庫(kù)庫(kù)函數(shù)失效。而而用戶(hù)應(yīng)用程程序初始化過(guò)過(guò)程并未顯式式的完成這些些堆棧初始化化及數(shù)據(jù)拷貝貝操作,應(yīng)用用程序?qū)?dòng)動(dòng)不成功。2、_maiin()為編編譯系統(tǒng)提供供的一個(gè)庫(kù)函函數(shù),使用_mainn標(biāo)號(hào)引導(dǎo)系系統(tǒng)時(shí)必須將將應(yīng)用程序的的入口數(shù)定義義為mainn();3、若希望系統(tǒng)統(tǒng)進(jìn)入應(yīng)用程程序前自動(dòng)完完成系統(tǒng)調(diào)用用(如庫(kù)函數(shù)數(shù)的初始化、RRW、
45、ZI數(shù)數(shù)據(jù)從 Fllash到RRAM的拷貝貝(加載映像像執(zhí)執(zhí)行映像)等等)的初始化化過(guò)程,必須須使用_mmain標(biāo)號(hào)號(hào)以跳至ADDS提供的初初始化函數(shù)庫(kù)庫(kù),這種情況況一般 需做做一些庫(kù)函數(shù)數(shù)移植及重定定向問(wèn)題解決決;這一點(diǎn)上上,應(yīng)用程序序入口必須以以main函函數(shù)標(biāo)識(shí);4、若所有的初初始化步驟都都已顯式的完完成(如堆棧棧初始化、加加載映像到執(zhí)執(zhí)行映像RWW、ZI數(shù)據(jù)據(jù)的 拷貝等等),應(yīng)用程程序入口函數(shù)數(shù)XXXX()可以任意意定義(非mmain,這這樣可以避免免自動(dòng)鏈接上上_maiin,從而跳跳過(guò)_maain),初初始化完成后后直接 B XXXXX即可,這這一點(diǎn)上,mmain()函數(shù)并不具具有特
46、殊性;5、若必須的初初始化步驟都都未顯示的完完成,一意孤孤行的B XXXXX,程程序運(yùn)行的結(jié)結(jié)果將不可預(yù)預(yù)料。一個(gè)典典型的例子是是:若用戶(hù)并并未顯示完成成加載映像執(zhí)行行映像的數(shù)據(jù)據(jù)初始化而直直接B XXXXX,則應(yīng)應(yīng)用程序中所所有的全局變變量并不會(huì)被被預(yù)期的初始始化,而所有有的ZI變量量也不會(huì)被預(yù)預(yù)期的清零;6、本人在調(diào)試試LPC22294 LCCD模塊時(shí)才才認(rèn)識(shí)到上述述第五點(diǎn)(55、)的重要要性:程序指指令流并沒(méi)有有錯(cuò),但LCCD上顯示的的全部是亂碼碼。我用兩種種方法解決了了這一bugg:(1)將所有的的字庫(kù)數(shù)據(jù)定定義為connst常量,程程序運(yùn)行正確確;(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文件的編編寫(xiě)、分析scatterr基本點(diǎn):11. 編譯后后輸出的映像像文件中各段段是首尾相連連的,中間沒(méi)沒(méi)有空閑的區(qū)區(qū)域,它們的的先后關(guān)系是是根據(jù)鏈接時(shí)時(shí)參數(shù)的先后后次序決定的的 armllinkerr -fille1.o file22.o 2. sccatterr用于將編譯譯后的映像文文件中的特定定段加載到多多個(gè)分散的指指定內(nèi)存區(qū)域域3. 有22類(lèi)域r
50、eggion:執(zhí)執(zhí)行域(exxecutiion reegion,一一般是ramm區(qū)域)和加加載域(looad reegion,一一般是romm區(qū)域)4. 加載域:就是編譯之之后得到的二二進(jìn)制文件燒燒寫(xiě)到romm中的這一段段區(qū)域,所有有的代碼ROO、預(yù)定義變變量RW、堆堆棧之類(lèi)清不不清空無(wú)關(guān)緊緊要的大片內(nèi)內(nèi)存區(qū)域ZII,都包括在在其中5. 執(zhí)行域:就就是把加載域域進(jìn)行解壓壓縮后的樣樣子。比如:RO沒(méi)有變變動(dòng)還是在RROM中,RRW被移到了了SRAM中中,而ZI被被放置在SDDRAM中66. scaatter本本身并不能對(duì)對(duì)映像實(shí)現(xiàn)解壓縮,編編譯器讀入sscatteer文件之后后會(huì)根據(jù)其中中的各種
51、地址址生成啟動(dòng)代代碼,實(shí)現(xiàn)對(duì)對(duì)映像的加載載,而這一段段代碼就 是是* (InnRoot$Secttions)它是_mmain()的一部分。這這就是在匯編編啟動(dòng)代碼的的最后跳轉(zhuǎn)到到_maiin() 而而不是跳向mmain()的原因之一一。7. 起起始地址與加加載域重合的的執(zhí)行域成為為root regioon,* (InRooot$Seectionns)必須放放在這個(gè)執(zhí)行行域中,否則則鏈接的時(shí)候候會(huì)報(bào)錯(cuò)。*(+RO)包含了* (InRooot$SSectioons),所所以如果在rroot rregionn中用到了*(+RO)可以不再指指定* (IInRoott$Secctionss),scatt
52、err語(yǔ)法: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為長(zhǎng)度為11的spacce,指定棧棧頂?shù)刂?SDRRAM2 +0 UNIINIT heap.o (+ZZI) 注解:1. RROM_LOOAD是加載載域。這里只只有一個(gè),也也可以有多個(gè)個(gè)(rom地地址不連續(xù)的的情況)2. ROM、SSRAM、SSDRAM11、SDRAAM2是執(zhí)行行域,有多個(gè)個(gè)。第一個(gè)執(zhí)執(zhí)行域必須和和加載域地址址重合,因?yàn)闉锳RM的復(fù)復(fù)位地址就是是加載域的起起始地址(有有bootsstrap的的話(huà)加載域址址就是boootstraap執(zhí)行完后后的跳轉(zhuǎn)地址址)3. vvectorrs.o (+RO, +FIRSST) 中斷斷向量表放在在最開(kāi)頭4. ROM 0 x000000000
54、0 0 x0003FFFFFF; 加載載域名 起始始地址 最大大允許長(zhǎng)度;最大允許許長(zhǎng)度也可可以省略,但但缺點(diǎn)是編譯譯器不會(huì)檢查查段是否溢出出和別的段重重疊了。起起始地址= +0表示示緊接著上一一段開(kāi)始的連連續(xù)地址。55. * (InRooot$Seectionns)是復(fù)制制代碼的代碼碼6. UNNINT關(guān)鍵鍵字表示不進(jìn)進(jìn)行初始化清清零值得注意的是:在一個(gè)sccatterr文件中,同同一個(gè).o文文件不能出現(xiàn)現(xiàn)2次,即使使是在2個(gè)不不同的加載域域中也不可以以,否則會(huì)報(bào)報(bào)錯(cuò):Ambbiguouus sellectorrs fouund foor *.oo,錯(cuò)誤的例例子:LOAD1 00 x0000
55、00000 EEXE1 Init.o LOAD2 00 xFFFFF0000 EEXE2 Init.o 想起了中學(xué)里哲哲學(xué)課上老師師讓解釋為什什么人不能兩兩次踏入同一一條河流,當(dāng)當(dāng)年稀里糊涂涂的寫(xiě)的答案案,老師批了了個(gè)大差,回回去有沒(méi)有補(bǔ)補(bǔ)上,今天居居然在這里遇遇到了老問(wèn)題題。推測(cè)測(cè)是編譯器自自動(dòng)生成的sscatteer載入代碼碼InRooot$Seectionns不支持把把同一objj搬移2次。這 就帶來(lái)一個(gè)問(wèn)題:如果希望把同一段代碼(如中斷跳轉(zhuǎn)表)載入2份拷貝到不同的地址,咋整?一個(gè)笨辦法是自己寫(xiě)一段代碼搬移程序來(lái)代替編譯器自動(dòng)生成的搬移 代碼,但前提是需要搞懂映像文件的組織,增加了工作量
56、。投機(jī)一點(diǎn)的方法是在makefile中把一個(gè).o文件復(fù)制并重新起一個(gè)名字,然后把它們傳遞給 armlink。另外,猜測(cè)scatter語(yǔ)法可能包含諸如+duplicate之類(lèi)的關(guān)鍵字來(lái)允許同一段的多個(gè)副本,懶得翻ARM手冊(cè),請(qǐng)哪位知情者留 言告知,謝過(guò)將程序執(zhí)行到CC文件的maain函數(shù)我的第一個(gè)實(shí)實(shí)驗(yàn) 將將程序執(zhí)行到到C文件的mmain函數(shù)數(shù) 實(shí)驗(yàn)?zāi)康?運(yùn)用ADS編寫(xiě)寫(xiě)一個(gè)小程序序,使程序能能夠從起始的的匯編代碼運(yùn)運(yùn)行到C程序序的mainn()函數(shù)(這這也可稱(chēng)作非非常簡(jiǎn)單的起起動(dòng)代碼),并并通過(guò)仿真器器連接目標(biāo)板板,最終能夠夠在A(yíng)T911SAM7SS64里正確確運(yùn)行。 實(shí)驗(yàn)程序和參參數(shù)設(shè)置 1
57、連接器的選選項(xiàng)設(shè)置 選項(xiàng)設(shè)置如圖22-1所示。因因?yàn)樵贏(yíng)T991SAM77S64中FFLASH存存儲(chǔ)器的地址址是以0 x00開(kāi)始,而SSRAM的地地址是以0 xx002000000開(kāi)始始,所以我將將下圖中的RRO Basse和RW Base分分別設(shè)置成了了0 x0和00 x002000000。其其它設(shè)置請(qǐng)參參考有關(guān)書(shū)籍籍。 圖2-1. 選選項(xiàng)設(shè)置圖 2啟動(dòng)代碼 在A(yíng)RM應(yīng)用系系統(tǒng)中,芯片片復(fù)位后,在在進(jìn)入C語(yǔ)言言的 maiin()函數(shù)數(shù)前,都要執(zhí)執(zhí)行一段啟動(dòng)動(dòng)代碼。該代代碼一般都是是用匯編語(yǔ)言言編寫(xiě),用來(lái)來(lái)完成系統(tǒng)運(yùn)運(yùn)行環(huán)境和應(yīng)應(yīng)用程序的初初始化,詳情情請(qǐng)參考有關(guān)關(guān)書(shū)籍。由于于本實(shí)驗(yàn)的 目的很
58、簡(jiǎn)單單,就是想讓讓程序復(fù)位后后,進(jìn)入maain()函函數(shù),所以有有些初始化代代碼盡量精簡(jiǎn)簡(jiǎn),留下了下下述代碼。另另外,_mmain是CC語(yǔ)言的內(nèi)部部庫(kù)函數(shù),可可以在 進(jìn)入入用戶(hù)maiin()之前前完成內(nèi)部RRAM的初始始化工作,類(lèi)類(lèi)似KeillC51中的的starttup.a551。當(dāng)執(zhí)行行完_maain這段代代碼后,再跳跳轉(zhuǎn)到 maain()函函數(shù)。 AREA innit,COODE,REEADONLLY CODE322 Mode_USSR EQQU 0 xx10 ;CCPSR中各各種處理器模模式對(duì)應(yīng)的控控制位 I_Bit EQU 0 x800 ;CPSSR中的中斷斷禁止位 F_Bit EQ
59、U 0 x400 USR_Staack EEQU 00 x002003000 ;定義RAAM的最高地地址,無(wú)重映映射 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 ;改成用用戶(hù)模式且禁禁止IRQ和和FIQ中斷斷 LDR SPP,=USRR_Stacck IMPORTT _mmain b _mainn ;跳轉(zhuǎn)轉(zhuǎn)到_maain執(zhí)行,它它位于C運(yùn)行行時(shí)庫(kù)中 END 3C語(yǔ)言主函函數(shù) 在C語(yǔ)言主函數(shù)數(shù)中做了一個(gè)個(gè)死循環(huán),如如下述所示。 int maiin(voiid) whi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史九年級(jí)下冊(cè):第11課 《蘇聯(lián)的社會(huì)主義建設(shè)》 聽(tīng)課評(píng)課記錄
- 《溝通中外文明的“絲綢之路”》名師聽(tīng)課評(píng)課記錄(新部編人教版七年級(jí)上冊(cè)歷史)
- 生物醫(yī)藥產(chǎn)業(yè)園監(jiān)理合同(2篇)
- 電力價(jià)格調(diào)整合同(2篇)
- 五年級(jí)上冊(cè)數(shù)學(xué)聽(tīng)評(píng)課記錄《7.1 誰(shuí)先走》(3)-北師大版
- 部編人教版歷史九年級(jí)上冊(cè)第15課《探尋新航路》聽(tīng)課評(píng)課記錄
- 湘教版數(shù)學(xué)八年級(jí)上冊(cè)《小結(jié)練習(xí)》聽(tīng)評(píng)課記錄5
- 人教版數(shù)學(xué)七年級(jí)上冊(cè)3.2《解一元一次方程(一)-合并同類(lèi)項(xiàng)與移項(xiàng)》聽(tīng)評(píng)課記錄1
- 五年級(jí)上冊(cè)數(shù)學(xué)聽(tīng)評(píng)課記錄-總復(fù)習(xí)2-北師大版
- 新版湘教版秋八年級(jí)數(shù)學(xué)上冊(cè)第二章三角形課題三角形的內(nèi)角和定理聽(tīng)評(píng)課記錄
- 必修3《政治與法治》 選擇題專(zhuān)練50題 含解析-備戰(zhàn)2025年高考政治考試易錯(cuò)題(新高考專(zhuān)用)
- 二零二五版電商企業(yè)兼職財(cái)務(wù)顧問(wèn)雇用協(xié)議3篇
- 課題申報(bào)參考:流視角下社區(qū)生活圈的適老化評(píng)價(jià)與空間優(yōu)化研究-以沈陽(yáng)市為例
- 《openEuler操作系統(tǒng)》考試復(fù)習(xí)題庫(kù)(含答案)
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 2024-2025學(xué)年人教版生物八年級(jí)上冊(cè)期末綜合測(cè)試卷
- 大數(shù)據(jù)背景下網(wǎng)絡(luò)輿情成因及治理
- 道教系統(tǒng)諸神仙位寶誥全譜
- 中國(guó)經(jīng)濟(jì)轉(zhuǎn)型導(dǎo)論-政府與市場(chǎng)的關(guān)系課件
- 新視野大學(xué)英語(yǔ)讀寫(xiě)教程 第三版 Book 2 unit 8 教案 講稿
- 村務(wù)公開(kāi)表格
評(píng)論
0/150
提交評(píng)論