freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

arm處理器系統(tǒng)初始化過程(已修改)

2025-07-11 08:42 本頁面
 

【正文】 ARM處理器系統(tǒng)初始化過程 1 禁止MMU,關(guān)閉中斷,禁止cache;2 根據(jù)硬件設(shè)計配制好處理器時鐘、DRAM時鐘、定時器時鐘。3 根據(jù)系統(tǒng)中所用的flash和DRAM芯片容量和電氣參數(shù)設(shè)置它們的起始地址、容量、刷新頻率等;4 將固化在flash芯片中的程序搬移到DRAM內(nèi)存中;5 使能cache,使能MMU,跳轉(zhuǎn)到DRAM內(nèi)存中運行繼續(xù)初始化,包括根據(jù)具體應(yīng)用以及系統(tǒng)中的硬件配置初始化各個功能模塊、安裝好異 常中斷處理程序、使能中斷等;6 進行操作系統(tǒng)相關(guān)初始化。禁止MMU,關(guān)閉中斷,禁止cache通過寫系統(tǒng)控制協(xié)處理器的寄存器1 的第0 位可以允許和禁止MMU。在復(fù)位后這位是0,MMU 被禁止。關(guān)閉中斷與打開中斷中斷是一種高效的對話機制,但有時并不想程序運行的過程中中斷運行,比如正在打印東西,但程序突然中斷了,又讓另外一個程序輸出打印內(nèi)容,這樣在打印機上就會亂得不得了,同時有兩份以上的文件交錯地打印在一張紙上。像不可剝奪的資源,就一定要關(guān)閉中斷,讓它占有這個資源。在ARM里,沒有像x86那樣有清除中斷指令CLI。那么在ARM里是怎么樣實現(xiàn)關(guān)中斷和開中斷的呢?下面就來看看ARM的關(guān)中斷和開中斷實現(xiàn)。void Lock(void){stmdbsp!, {r0}mrsr0, cpsrorr r0,r0,0xC0msr cpsr_cxsf,r0ldmia sp!,{r0}}上面這段程序是通過設(shè)置CPSR的第6,7位來實現(xiàn)的,因為第6,7位是設(shè)置為1時,就不再響應(yīng)中斷。void UnLock(void){stmdbsp!, {r0}mrsr0, cpsrbic r0,r0,0xC0msr cpsr_cxsf,r0ldmia sp!,{r0}}上面是重新開中斷的命令,同樣是設(shè)置CPSR的第6,7位,但它的值是0,就可接收中斷了。如果在多個任務(wù)之間進行共享數(shù)據(jù),一般是需要使用關(guān)中斷和開中斷實現(xiàn)數(shù)據(jù)同步的,其實中這種關(guān)中斷和開中斷,就是進入臨界區(qū)和退出臨界區(qū)。如果是像PC機那樣有多個CPU的話,關(guān)中斷并不能防止這種情況。系統(tǒng)的在應(yīng)用編程(IAP)以及在系統(tǒng)編程功能(ISP)等。中斷向量表ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。每當(dāng)一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應(yīng)中斷類型的地址值。因為每個中斷只占據(jù)向量表中1個字的存儲空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行中斷處理。中斷向量表的程序?qū)崿F(xiàn)通常如下表示:AREA Boot ,CODE, READONLYENTRYB ResetHandlerB UndefHandlerB SWIHandlerB PreAbortHandlerB DataAbortHandlerBB IRQHandlerB FIQHandler其中關(guān)鍵字ENTRY是指定編譯器保留這段代碼,因為編譯器可能會認為這是一段亢余代碼而加以優(yōu)化。鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。Q:為什么在中斷向量表中不直接LDR PC,異常地址.而是使用一個標(biāo)號,然有再在后面使用DCD定義這個標(biāo)號A:因為LDR指令只能跳到當(dāng)前PC 4kB范圍內(nèi),而B指令能跳轉(zhuǎn)到32MB范圍,而現(xiàn)在這樣在LDR PC, xxxx這條指令不遠處用xxxxDCD定義一個字,而這個字里面存放最終異常服務(wù)程序的地址,這樣可以實現(xiàn)4GB全范圍跳轉(zhuǎn).Q: LDR 不是可以全空間跳轉(zhuǎn)的嗎 《ARM微控制器基礎(chǔ)與實戰(zhàn)》.A: LDR偽指令通過設(shè)置指令緩沖池才能實現(xiàn)全范圍跳轉(zhuǎn),而LDR指令則只能實現(xiàn)4KB范圍跳轉(zhuǎn).MEMMAP=0:開機默認值,Boot裝載模式向量表(0x000000000x0000003c)映射的是BootBlock中的0x7FFFE0000x7FFFF03c中的值;芯片復(fù)位時,啟動boot裝載程序,判斷是進入ISP狀態(tài)還是啟動用戶程序,若啟動用戶程序,則自動設(shè)置MEMMAP=1(片內(nèi)flash啟動)或3(片外程序存儲器啟動)。很奇怪的,我在實驗中,芯片會跳過繼而執(zhí)行片外flash中的代碼. MEMMAP=1:中斷向量表就在片內(nèi)flash中,地址就是0x000000000x0000003c,相當(dāng)于沒有映射;MEMMAP=2:最為主要的設(shè)置,即是重映射的關(guān)鍵之所在,當(dāng)設(shè)置MEMMAP=2 時,中斷向量表(0x000000000x0000003c)映射的是片內(nèi)SRAM中的0x400000000x4000003c中的值,而因為是SRAM,所以在程序運行的過程中是可以改變的,這樣就可以達到重映射的目的啦(中斷向量表可以隨時修改)。 MEMMAP=3:中斷向量表就在片外flash中,中斷向量表(0x000000000x0000003c)映射到是片外flash中的0x800000000x8000003c中的值;功能上與MEMMAP=1時的差不多,因為一旦程序固化到flash中,即為只讀,只是數(shù)值映射而已!設(shè)置MEMMAP。 Memory Mapping (when Interrupt Vectors are in RAM)MEMMAP EQU 0xE01FC040 Memory Mapping Control IF :DEF:REMAP LDR R0, =MEMMAP IF :DEF:EXTMEM_MODE MOV R1, 3 ELIF :DEF:RAM_MODE MOV R1, 2 ELSE MOV R1, 1 ENDIF STR R1, [R0] ENDIFMEMMAP有兩個控制位 MEMMAP[1:0]00 BOOT裝載程序模式01 User FLASH模式10 用戶RAM模式11 用戶外部存儲器模式10模式也就是RAM模式 我們訪問地址0X00是跟訪問RAM地址0X40000000中的數(shù)據(jù)是完全一樣的 向RAM中寫進數(shù)據(jù) 然后通過數(shù)據(jù)窗口觀察0X0地址的變化 應(yīng)該是同步變化的存儲器類型和時序配置 主要是對系統(tǒng)存儲器控制器(MMU)的初始化。由于存儲器控制器并不是ARM架構(gòu)的一部分,不同芯片的實現(xiàn)方式各不相同。由于運算能力和尋址能力的強大,基于ARM內(nèi)核的微處理器系統(tǒng)一般都需要外擴展各種類型的存儲器。對于存儲器系統(tǒng)的初始化一般包括如下幾個方面:--存儲器類型、時序和總線寬度的配置--存儲器地址的配置(1)存儲器類型 基于ARM微處理系統(tǒng)的存儲器一般有如下幾類:SARM,DRAM,Flah,同時,即使同類存儲器也有訪問速度上的不同。其中,SRAM和Flah屬于靜態(tài)存儲器,可以共用存儲器端口,而DRAM有動態(tài)刷新和地址復(fù)用等特征,需要專門的存儲器端口。(2)時序 存儲器端口的接口時序優(yōu)化對系統(tǒng)性能影響非常大,因為系統(tǒng)運行的速度瓶頸一般都存在于存儲器的訪問,因此希望存儲器的訪問盡可能快,但又要考慮由此帶來的系統(tǒng)穩(wěn)定性問題。(3)總線寬度 ARM微處理器架構(gòu)支持8/16/32位的數(shù)據(jù)總線寬度訪問存儲器和外設(shè),對于特定的存儲器來說,需要設(shè)定數(shù)據(jù)總線的寬度。(4)存儲器地址的配置 ARM微處理器架構(gòu)理論上可以支持4GB的地址空間,而對于一個實際的系統(tǒng)來說,配置的物理地址遠沒有這么多,因此,如何配置存儲器的地址,也是一個重要的問題。(5)存儲器地址重映射 存儲器地址重映射就是可以通過軟件配置來改變一塊存儲器物理地址的方法,是當(dāng)前許多先進控制器所具有的功能。進行地址重映射的原因:提高系統(tǒng)的運行效率。進行地址重映射的注意:保證程序流程的連續(xù)性。有的ARM處理器不具有地址重映射的功能,可以采樣代碼搬移加跳轉(zhuǎn)的方式完成上述功能。初始化堆棧因 為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨立的。因此,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。方法是改變狀 態(tài)寄存器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),讓后給SP賦值。注意:不要切換到User模式進行User模式的堆棧設(shè)置,因為進入User模式后就不 能再操作CPSR回到別的模式了,可能會對接下去的程序執(zhí)行造成影響。這是一段堆棧初始化的代碼示例,其中只定義了三種模式的SP指針:MRS R0,CPSRBIC R0,R0,MODEMASK 安全起見,屏蔽模式位以外的其他位ORR R1,R0,IRQMODEMSR CPSR_cxfs,R1LDR SP,=UndefStackORR R1,R0,FIQMODEMSR CPSR_cxsf,R1LDR SP,=FIQStackORR R1,R0,SVCMODEMSR CPSR_cxsf,R1LDR SP,=SVCStack初始化應(yīng)用程序執(zhí)行環(huán)境如果使用分散加載描述文件調(diào)整堆棧和堆放置,則鏈接器創(chuàng)建 __user_initial_stackheap() 函數(shù),并使用鏈接器定義的符號作為這些區(qū)域的名稱。映像一開始總是存儲在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的RAM中執(zhí)行;而RW和 ZI這兩部分是必須轉(zhuǎn)移到可寫的RAM里去。所謂應(yīng)用程序執(zhí)行環(huán)境的初始化,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸和內(nèi)容清零。下面是在ADS下,一種常用存儲器模型的直接實現(xiàn):LDR r0,=|Image$$RO$$Limit| 得到RW數(shù)據(jù)源的起始地址LDR r1,=|Image$$RW$$Base| RW區(qū)在RAM里的執(zhí)行區(qū)起始地址LDR r2,=|Image$$ZI$$Base| ZI區(qū)在RAM里面的起始地址CMP r0,r1 比較它們是否相等BEQ %F10 CMP r1,r3LDRCC r2,[r0],4STRCC r2,[r1],4BCC %B01 LDR r1,=|Image$$ZI$$Limit|MOV r2,02 CMP r3,r1STRCC r2,[r3],4BCC %B2程序?qū)崿F(xiàn)了RW數(shù)據(jù)的拷貝和ZI區(qū)域的清零功能。其中引用到的4個符號是由鏈接器第一輸出的。|Image$$RO$$Limit|:表示RO區(qū)末地址后面的地址,即RW數(shù)據(jù)源的起始地址|Image$$RW$$Base|:RW區(qū)在RAM里的執(zhí)行區(qū)起始地址,也就是編譯器選項RW_Base指定的地址|Image$$ZI$$Base|:ZI區(qū)在RAM里面的起始地址|Image$$ZI$$Limit|:ZI區(qū)在RAM里面的結(jié)束地址后面的一個地址程 序先把ROM里|Image$$RO$$Limt|開始的RW初始數(shù)據(jù)拷貝到RAM里面|Image$$RW$$Base|開始的地址,當(dāng)RAM這邊的目 標(biāo)地址到達|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開始,接下去就對這片ZI區(qū)進行清零操作,直到遇到結(jié)束地 址|Image$$ZI$$Limit|改變處理器模式因為在初始化過程中,許多操作需要在特權(quán)模式下才能進行(比如對CPSR的修改),所以要特別注意不能過早的進入用戶模式。內(nèi)核級的中斷使能也可以考慮在這一步進行。如果系統(tǒng)中另外存在一個專門的中斷控制器,這么做總是安全的。呼叫主應(yīng)用程序當(dāng)所有的系統(tǒng)初始化工作完成之后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最簡單的一種情況是:IMPORT mainB main直接從啟動代碼跳轉(zhuǎn)到應(yīng)用程序的主函數(shù)入口,當(dāng)然主函數(shù)名字可以由用戶隨便定義。在ARM ADS環(huán)境中,還另外提供了一套系統(tǒng)級的呼叫機制。IMPORT __mainB __main__main()是編譯系統(tǒng)提供的一個函數(shù),負責(zé)完成庫函數(shù)的初始化和初始化應(yīng)用程序執(zhí)行環(huán)境,最后自動跳轉(zhuǎn)到main()函數(shù)。ARM 介紹ARM微處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換: 第一種為ARM狀態(tài),此時處理器執(zhí)行32位的字對齊的ARM指令; 第二種為Thumb狀態(tài),此時處理器執(zhí)行16位的、半字對齊的Thumb指令。 在程序的執(zhí)行過程中,微處理器可以隨時在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。但ARM微處理器在開始執(zhí)行代碼時,應(yīng)該處于ARM狀態(tài)。 ARM處理器狀態(tài) 進 入Thumb狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位(位0)為1時,可以采用執(zhí)行BX指令的方法,使微處理器從ARM狀態(tài)切換到Thumb狀態(tài)。此外,當(dāng)處理器處 于Thumb狀態(tài)時發(fā)生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到Thumb狀態(tài)。 進入ARM狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位為0時,執(zhí)行BX指令時可以使微處理器從Thumb狀態(tài)切換到ARM狀態(tài)。此外,在處理器進行異常處理時,把PC指針放入異常模式鏈接寄存器中,并從異常向量地址開始執(zhí)行程序,也可以使處理器切換到ARM狀態(tài)。ARM處理器模式 ARM微處理器支持7種運行模式,分別為: 用戶模式(usr):ARM處理器正常的程序執(zhí)行狀態(tài)。 快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。 外部中斷模式(irq):用于通用的中斷處理。 管理模式(svc):操作系統(tǒng)使用的保護模式。 數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進入該模式,可用于虛擬存儲及存儲保護。 系統(tǒng)模式(sys):運行具有特權(quán)的操作系統(tǒng)任務(wù)。 定義指令中止模式(und)
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1