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

正文內(nèi)容

arm處理器系統(tǒng)初始化過程(更新版)

2025-08-07 08:42上一頁面

下一頁面
  

【正文】 lash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的RAM中執(zhí)行;而RW和ZI這兩部分是必須轉(zhuǎn)移到可寫 的RAM里去。 初始化堆棧 因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨(dú)立的。 BOOT的一般步驟為: 設(shè)置中斷向量表 初始化存儲設(shè)備 初始化堆棧 初始化用戶執(zhí)行環(huán)境 呼叫主應(yīng)用程序 設(shè)置中斷向量表 ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。有兩種方法可以解決這個問題。END 3C語言主函數(shù) 在C語言主函數(shù)中做了一個死循環(huán),如下述所示。跳轉(zhuǎn)到__main執(zhí)行,它位于C運(yùn)行時庫中改成用戶模式且禁止IRQ和FIQ中斷 0x14 reserved irqvec 。 。定義RAM的最高地址,無重映射 ENTRY EQU另外,__main是C語言的內(nèi)部庫函數(shù),可以在 進(jìn)入用戶main()之前完成內(nèi)部RAM的初始化工作。我的第一個實(shí)驗 ――將程序執(zhí)行到C文件的main函數(shù) .實(shí)驗?zāi)康?運(yùn)用ADS編寫一個小程序,使程序能夠從起始的匯編代碼運(yùn)行到C程序的main()函數(shù)(這也可稱作非常簡單的起動代碼),并通過仿真器連接目標(biāo)板,最終能夠在AT91SAM7S64里正確運(yùn)行。‘起始地址’= +0表示緊接著上一段開始的連續(xù)地址。 SDRAM1 0x41000000 UNINIT SRAM 0x00400000 0x003FFFFF (+RO,+FIRST) ROM 0x00000000 0x003FFFFF ARM編程:Scatter文件的編寫、分析轉(zhuǎn)scatter基本點(diǎn):1. 編譯后輸出的映像文件中各段是首尾相連的,中間沒有空閑的區(qū)域,它們的先后關(guān)系是根據(jù)鏈接時參數(shù)的先后次序決定的 armlinker ……2. scatter用于將編譯后的映像文件中的特定段加載到多個分散的指定內(nèi)存區(qū)域3. 有2類域region:執(zhí)行域(execution region,一般是ram區(qū)域)和加載域(load region,一般是rom區(qū)域)4. 加載域:就是編譯之后得到的二進(jìn)制文件燒寫到rom中的這一段區(qū)域,所有的代碼RO、預(yù)定義變量RW、堆棧之類清不清空無關(guān)緊要的大片內(nèi)存區(qū)域ZI,都包括在其中5. 執(zhí)行域:就是把加載域進(jìn)行‘解壓縮’后的樣子。 __main此后流程將跳轉(zhuǎn)到ADS提供的啟動代碼__main函數(shù)處,負(fù)責(zé)完成庫函數(shù)的初始化及相關(guān)功能,并最終引導(dǎo)處理器入口用戶代碼main()函數(shù),其代碼流程為:嵌入式系統(tǒng)在進(jìn)入應(yīng)用主程序之前必須有一個初始化的過程,該過程完成系統(tǒng)的啟動和初始化功能,初始化過程可以分成兩部分來看:√ _main負(fù)責(zé)設(shè)置運(yùn)行映像存儲器映射;√ _rt_entry負(fù)責(zé)庫函數(shù)的初始化。 ARM中B __Main和B Main的區(qū)別《轉(zhuǎn)》第一種答案如下: 在軟件仿真的情況下,執(zhí)行“B __main”指令,能使程序跳到C文件的main函數(shù),但用硬件仿真時,還沒執(zhí)行到main函數(shù)時就進(jìn)入了異常中斷。ADS環(huán)境中,還另外提供了一套系統(tǒng)級的呼叫機(jī)制。main B其中引用到的4個符號是由鏈接器第一輸出的。r2,[r1],4 r2,[r0],4 r1,r3 初始化有特殊要求的端口,設(shè)備 5.R1,R0,FIQMODE MSR因此,對程序中需要用到的每一種模式都要給SP 定義一個堆棧地址。 2.,CODE,由于這類代碼直接面對處理器內(nèi)核和硬件控制器進(jìn)行編程,一般都是用匯編語言。還有就是所謂“cachable bit”和“bufferable bit”的問題,這個問題來自于《armarm》partB ,那里有一張表,我對這個表死活不理解。當(dāng)進(jìn)入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當(dāng)退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。將CPSR復(fù)制到相應(yīng)的SPSR中。其中包括:31個通用寄存器,包括程序計數(shù)器(PC)在內(nèi)。 管理模式(svc):操作系統(tǒng)使用的保護(hù)模式。但ARM微處理器在開始執(zhí)行代碼時,應(yīng)該處于ARM狀態(tài)。內(nèi)核級的中斷使能也可以考慮在這一步進(jìn)行。方法是改變狀 態(tài)寄存器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),讓后給SP賦值。(5)存儲器地址重映射 主要是對系統(tǒng)存儲器控制器(MMU)的初始化。 BOOT裝載程序模式01 STR MOV MOV IF:DEF:REMAP中斷向量表ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。mrsmrs在復(fù)位后這位是0,MMU 被禁止。禁止MMU,關(guān)閉中斷,禁止cache通過寫系統(tǒng)控制協(xié)處理器的寄存器1 的第0 位可以允許和禁止MMU。sp!, {r0}sp!, {r0}系統(tǒng)的在應(yīng)用編程(IAP)以及在系統(tǒng)編程功能(ISP)等。很奇怪的,我在實(shí)驗中,芯片會跳過繼而執(zhí)行片外flash中的代碼. 時,中斷向量表(0x000000000x0000003c)映射的是片內(nèi)SRAM中的0x400000000x4000003c中的值,而因為是SRAM,所以在程序運(yùn)行的過程中是可以改變的,這樣就可以達(dá)到重映射的目的啦(中斷向量表可以隨時修改)。 (2)時序 ARM微處理器架構(gòu)理論上可以支持4GB的地址空間,而對于一個實(shí)際的系統(tǒng)來說,配置的物理地址遠(yuǎn)沒有這么多,因此,如何配置存儲器的地址,也是一個重要的問題。因此,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。|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)地址到達(dá)|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開始,接下去就對這片ZI區(qū)進(jìn)行清零操作,直到遇到結(jié)束地 址|Image$$ZI$$Limit|改變處理器模式因為在初始化過程中,許多操作需要在特權(quán)模式下才能進(jìn)行(比如對CPSR的修改),所以要特別注意不能過早的進(jìn)入用戶模式。 在程序的執(zhí)行過程中,微處理器可以隨時在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。 外部中斷模式(irq):用于通用的中斷處理。 ARM寄存器 ARM處理器共有37個寄存器。當(dāng)一個異常出現(xiàn)以后,ARM微處理器會執(zhí)行以下幾步操作: 進(jìn)入異常處理的基本步驟: 將下一條指令的地址存入相應(yīng)連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執(zhí)行。應(yīng)用程序初始化該R13,使其指向該異常模式專用的棧地址。2。因此在用戶的應(yīng) 用程序之前,需要由專門的一段代碼來完成對系統(tǒng)的初始化。Boot初始化堆棧 因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨(dú)立的。R1,R0,IRQMODE MSRSP,=SVCStack 4.r0,=|Image$$RO$$Limit|RW區(qū)在RAM里的執(zhí)行區(qū)起始地址 LDRr0,r1%F1 0LDR%B2 程序?qū)崿F(xiàn)了RW數(shù)據(jù)的拷貝和ZI區(qū)域的清零功能。最簡單的一種情況是: IMPORT 在ARM__main __main()是編譯系統(tǒng)提供的一個函數(shù),負(fù)責(zé)完成庫函數(shù)的初始化和初始化應(yīng)用程序執(zhí)行環(huán)境,最后自動跳轉(zhuǎn)到main()函數(shù)。第二種答案如下:IMPORT __main.... ....BL__main()為編譯系統(tǒng)提供的一個庫函數(shù),使用__main標(biāo)號引導(dǎo)系統(tǒng)時必須將應(yīng)用程序的入口數(shù)定義為main();若希望系統(tǒng)進(jìn)入應(yīng)用程序前自動完成系統(tǒng)調(diào)用(如庫函數(shù)的初始化、RW、ZI數(shù)據(jù)從 Flash到RAM的拷貝(加載映像執(zhí)行映像)等)的初始化過程,必須使用__main標(biāo)號以跳至ADS提供的初始化函數(shù)庫,這種情況一般 需做一些庫函數(shù)移植及重定向問題解決;這一點(diǎn)上,應(yīng)用程序入口必須以main函數(shù)標(biāo)識;若所有的初始化步驟都已顯式的完成(如堆棧初始化、加載映像到執(zhí)行映像RW、ZI數(shù)據(jù)的 拷貝等),應(yīng)用程序入口函數(shù)XXXX()可以任意定義(非main,這樣可以避免自動鏈接上__main,從而跳過__main),初始化完成后直接 B建議和我一樣的初學(xué)者還是乖乖的B __main接著將應(yīng)用入口設(shè)置為main()函數(shù)的好。 } { 加載域名 起始地址 最大允許長度;‘最大允許長度’也可以省略,但缺點(diǎn)是編譯器不會檢查段是否溢出和別的段重疊了。 { 另外,猜測scatter語法可能包含諸如+duplicate之類的關(guān)鍵字來允許同一段的多個副本,懶得翻ARM手冊,請哪位知情者留 言告知,謝過 將程序執(zhí)行到C文件的main函數(shù)由于本實(shí)驗的 目的很簡單,就是想讓程序復(fù)位后,進(jìn)入main()函數(shù),所以有些初始化代碼盡量精簡,留下了下述代碼。 0x00203000 。 B swivec B 。 0x18 IRQ fiqvecMSR CPSR_c,Mode_USR | I_Bit | F_Bit 。 。 可以使用“OptionConfig Processor”打開“Processor PropertiesARM7TDMI”窗口,且按照下圖設(shè)置以關(guān)斷相的斷點(diǎn)。但在初始化過程中,由于堆?;蚱渌?因造成程序出錯。 BootLoaderBoot Loader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。 下載(Downloading)模式:Boot Loader 將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。 在不同的板子上處理芯片、存儲設(shè)備以及其接口差異很大,應(yīng)根據(jù)不同的情況來配置。=field,定義一個數(shù)據(jù)域,長度為1024 SVCStack 1024 UndefStack 1024 AbortStack 1024 IRQStack 1024 FIQStack 0 初始化用戶執(zhí)行環(huán)境 一個ARM映像文件由RO,RW和ZI三個段組成,其中RO為代碼段,RW是已初始化的全局變量,ZI是未初始化的全局變量。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。下載(Downloading)模式:BootLoader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。方法是改變狀態(tài)寄存器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后給SP賦值。映像一開始總是存儲在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快 的RAM中執(zhí)行;而RW和ZI這兩部分是必須轉(zhuǎn)移到可寫的RAM里去。GET 0x11IRQMODE 0x1bMODEMASK0x33ff7000 ~FIQStack EQU (_STACK_BASEADDRESS0x0) 。 CODE32 bx lr//當(dāng)目標(biāo)程序是Thumb時,就要使用BX跳轉(zhuǎn)返回,并轉(zhuǎn)換模式。和上面說的類似。 moveq pc,lrstmfd sp!,{r0} //把工作寄存器按入堆棧。當(dāng)一個外部中斷0發(fā)生后,程序自動跳轉(zhuǎn)到地址0x20 處,0x20地址單元的指令為“l(fā)dr pc, = HandlerEINT0”,因此程序跳轉(zhuǎn)到HandlerEINT0處執(zhí)行這個宏操作,就是把外部中斷地址賦給PC。 ZI 段起始地址|Image$$ZI$$Limit| 。 b ChangeBigEndian streq r0,[r0,r10,ror 1] 。b HandlerPabort 。handler for IRQ interruptIsrIRQstmfd sp!,{r8r9}//把r8 r9按入堆棧LTORG//聲明文字池板子上電后就,程序就執(zhí)行0x00處的b ResetHandlerResetHandlerstr r1,[r0]str r1,[r0] Led_DisplayLOCKTIME是pll的lock time計數(shù)器。我就在這里細(xì)說一下吧。這時就換成使用PLL 的輸出作為FCLK了。 str r1,[r0]可以看出是對FCLK、PCLK以及HCLK三者的比率設(shè)置。 mrc p15,0,r0,c1,c0,0R1_iA:OR:R1_nF ldr r1,=((U_MDIV12)+(U_PDIV4)+U_SDIV)//這里就是非常熟悉的PMS啦,F(xiàn)in = , UCLK = 48MHz nop str r1,[r0] cmp r2, r0ldr r1,=0x0
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1