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

正文內(nèi)容

arm處理器系統(tǒng)初始化過程-文庫吧資料

2025-07-05 08:42本頁面
  

【正文】 Stack 1024 。 這是一段堆棧初始化的代碼示例: mrs r0,cpsr ;讀取cpsr寄存器的值 bic r0,r0,MODEMASK ;把模式位清零 orr r1,r0,UNDEFMODE|NOINT msr cpsr_cxsf,r1 。方法是改變 狀態(tài)寄存器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后給SP賦值。 初始化堆棧 因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨立的。因為一般系統(tǒng)運行的速度瓶頸都存在于存儲器訪問,所以存儲器訪問時序應盡可能的快;而同時又要考慮到由此帶來的穩(wěn)定性問題。鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。因為每個中斷只占據(jù)向量表中1個字的存儲空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行中斷處理。 BOOT的一般步驟為: 設置中斷向量表 初始化存儲設備 初始化堆棧 初始化用戶執(zhí)行環(huán)境 呼叫主應用程序 設置中斷向量表 ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。 大多數(shù) Boot Loader 都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式 : 啟動加載(Boot loading)模式:Boot Loader 從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到 RAM 中運行,整個過程并沒有用戶的介入。 基于 ARM7TDMI core 的 CPU 在復位時通常都從地址 0x00000000 取它的第一條指令。因此,在嵌入式世界里建立一個通用的 Boot Loader 幾乎是不可能的。通過這段小程序,我們可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。 3 在起動代碼中,可以調(diào)用__main()庫函數(shù)進行存儲器的初始化,也可以自己編寫更有效的代碼進行初始化,在初始化后就可以使用“B __main”指令直接跳轉(zhuǎn)到C的main()函數(shù)。 五.總結(jié) 1 在用仿真器時,必須將程序下載到AT91SAM7S64的內(nèi)部SRAM中,而不是Flash ROM。第二:合理初始化堆棧。有兩種方法可以解決這個問題。 原因是執(zhí)行“B __main”指令后,程序先跳到__main庫函數(shù)的入口,再進行一些初始化操作,最后再跳入用戶的main函數(shù)。用仿真器只能將代碼下載到AT91SAM7S64的內(nèi)部SRAM里進行調(diào)試,必須將ARM LinkerOutputSimple imageRO Base和Image entry point的0,改成SRAM的地址0x002000000。2 裝載的代碼與實踐程序不一樣 原因是由于程序沒有裝載到AT91SAM7S64的 FLASH ROM里,在調(diào)試器中顯示的是FLASH ROM中原先就有的程序。 原因是仿真器在ROM中設置的斷點數(shù)是有限的,且單步運行時內(nèi)部還要占用斷點。 1 當執(zhí)行單步運行時,PC一直停留在0x0處,而且Debug Log窗口中顯示“RDI Warning 00148: Can39。 while (1)。END 3C語言主函數(shù) 在C語言主函數(shù)中做了一個死循環(huán),如下述所示。跳轉(zhuǎn)到__main執(zhí)行,它位于C運行時庫中 __mainbIMPORT改成用戶模式且禁止IRQ和FIQ中斷 0x1c FIQ InitReset fiqvec B 。 irqvec B 0x14 reserved irqvec rsvdvec B 。 0x0C Prefetch Abort dabtvec pabtvec B 。 。 。定義RAM的最高地址,無重映射 ENTRY EQU EQUCPSR中的中斷禁止位 F_Bit EQUCPSR中各種處理器模式對應的控制位 I_Bit EQU AREA init,CODE,READONLY 另外,__main是C語言的內(nèi)部庫函數(shù),可以在 進入用戶main()之前完成內(nèi)部RAM的初始化工作。該代碼一般都是用匯編語言編寫,用來完成系統(tǒng)運行環(huán)境和應用程序的初始化,詳情請參考有關書籍。 因為在AT91SAM7S64中FLASH存儲器的地址是以0x0開始,而SRAM的地址是以0x00200000開始,所以我將下圖中的RO Base和RW Base分別設置成了0x0和0x00200000。我的第一個實驗 ――將程序執(zhí)行到C文件的main函數(shù) .實驗目的 運用ADS編寫一個小程序,使程序能夠從起始的匯編代碼運行到C程序的main()函數(shù)(這也可稱作非常簡單的起動代碼),并通過仿真器連接目標板,最終能夠在AT91SAM7S64里正確運行。然后把它們傳遞給 armlink。推測是編譯器自動生成的scatter載入代碼InRoot$$Sections不支持把同一obj搬移2次。 { }}LOAD2 0xFFFF0000{ EXE1‘起始地址’= +0表示緊接著上一段開始的連續(xù)地址。第一個執(zhí)行域必須和加載域地址重合,因為ARM的復位地址就是加載域的起始地址(有bootstrap的話加載域址就是bootstrap執(zhí)行完后的跳轉(zhuǎn)地址)3. (+RO, +FIRST) 中斷向量表放在最開頭4. ROM 0x00000000 0x003FFFFF。 }注解:1. ROM_LOAD是加載域。 SDRAM2 +0 UNINIT ,指定棧頂?shù)刂?SDRAM1 0x41000000 UNINIT * (+RW,+ZI) SRAM 0x00400000 0x003FFFFF } All library sections that must be in a root region (+RO,+FIRST) { ROM 0x00000000 0x003FFFFF*(+RO)包含了* (InRoot$$Sections),所以如果在root region中用到了*(+RO)可以不再指定* (InRoot$$Sections),scatter語法:ROM_LOAD 0x00000000{這就是在匯編啟動代碼的最后跳轉(zhuǎn)到__main() 而不是跳向main()的原因之一。 ARM編程:Scatter文件的編寫、分析轉(zhuǎn)scatter基本點:1. 編譯后輸出的映像文件中各段是首尾相連的,中間沒有空閑的區(qū)域,它們的先后關系是根據(jù)鏈接時參數(shù)的先后次序決定的 armlinker ……2. scatter用于將編譯后的映像文件中的特定段加載到多個分散的指定內(nèi)存區(qū)域3. 有2類域region:執(zhí)行域(execution region,一般是ram區(qū)域)和加載域(load region,一般是rom區(qū)域)4. 加載域:就是編譯之后得到的二進制文件燒寫到rom中的這一段區(qū)域,所有的代碼RO、預定義變量RW、堆棧之類清不清空無關緊要的大片內(nèi)存區(qū)域ZI,都包括在其中5. 執(zhí)行域:就是把加載域進行‘解壓縮’后的樣子。 __main接著將應用入口改為int main(void) 而非int Main(void),程序也得到正確的執(zhí)行;Initializing memory required by C codeThe initial values for any initialized variables (RW) must be copied from ROM to RAM.All other ZI variables must be initialized to zero. The library initialization code calledat __main performs the copying and initialization.Using the main functionWhen the piler piles a function called main(), it generates a reference to thesymbol __main to force the linker to include the basic C runtime system from the ANSIC library. (The symbol __main is marked as an entry point.)我用兩種方法解決了這一bug:(1)將所有的字庫數(shù)據(jù)定義為const常量,程序運行正確;(2)將B一個典型的例子是:若用戶并未顯示完成加載映像執(zhí)行映像的數(shù)據(jù)初始化而直接B XXXX,則應用程序中所有的全局變量并不會被預期的初始化,而所有的ZI變量也不會被預期的清零;而用戶應用程序初始化過程并未顯式的完成這些堆棧初始化及數(shù)據(jù)拷貝操作,應用程序?qū)硬怀晒?。當應用程序?zhí)行完時,_rt_entry又將控制權交還給C庫函數(shù),函數(shù)main()在ADS中有特殊的意義。接著_main跳進_rt_entry,進行STACK和HEAP等的初始化。 __main此后流程將跳轉(zhuǎn)到ADS提供的啟動代碼__main函數(shù)處,負責完成庫函數(shù)的初始化及相關功能,并最終引導處理器入口用戶代碼main()函數(shù),其代碼流程為:嵌入式系統(tǒng)在進入應用主程序之前必須有一個初始化的過程,該過程完成系統(tǒng)的啟動和初始化功能,初始化過程可以分成兩部分來看:√ _main負責設置運行映像存儲器映射;√ _rt_entry負責庫函數(shù)的初始化。由于考慮到剛接觸ARM和將問題簡單化,我選擇了第一種方法。第一:將“B __main”指令直接改成“B main”,使程序不進行初始化而直接跳入用戶的main()函數(shù)。但在初始化過程中,由于堆?;蚱渌?因造成程序出錯。 ARM中B __Main和B Main的區(qū)別《轉(zhuǎn)》第一種答案如下: 在軟件仿真的情況下,執(zhí)行“B __main”指令,能使程序跳到C文件的main函數(shù),但用硬件仿真時,還沒執(zhí)行到main函數(shù)時就進入了異常中斷。__main BADS環(huán)境中,還另外提供了一套系統(tǒng)級的呼叫機制。main 直接從啟動代碼跳轉(zhuǎn)到應用程序的主函數(shù)入口,當然主函數(shù)名字可以由用戶隨便定義。main B呼叫主應用程序 當所有的系統(tǒng)初始化工作完成之后,就需要把程序流程轉(zhuǎn)入主應用程序。如果系統(tǒng)中另外存在一個專門的中斷控制器,這么做總是安全的。改變處理器模式 因為在初始化過程中,許多操作需要在特權模式下才能進行(比如對CPSR的修改),所以要特別注意不能過早的進入用戶模式。其中引用到的4個符號是由鏈接器第一輸出的。r2,0 2%B0 1BCCr2,[r1],4 STRCCr2,[r0],4 LDRCCr1,r3 CMP所謂應用程序執(zhí)行環(huán)境的初始化,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸和內(nèi)容清零。初始化有特殊要求的端口,設備 5.CPSR_cxsf,R1 LDRSP,=FIQStack ORRR1,R0,FIQMODE MSRCPSR_cxfs,R1 LDR安全起見,屏蔽模式位以外的其他位 ORRR0,R0,MODEMASKR0,CPSR BIC注意:不要切換到User模式進行User模式的堆棧設 置,因為進入User模式后就不能再操作CPSR回到別的模式了,可能會對接下去的程序執(zhí)行造成影響。因此,對程序中需要用到的每一種模式都要給SP 定義一個堆棧地址。3. (2)存儲器地址分布 一種典型的情況是啟動ROM的地址重映射。 存儲器端口的接口時序優(yōu)化是非常重要的,這會影響到整個系統(tǒng)的性能。 2.鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。,CODE, 中斷向量表的程序?qū)崿F(xiàn)通常如下表示: AREA 每當一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應中斷類型的地址值。 1.由于這類代碼直接面對處理器內(nèi)核和硬件控制器進行編程,一般都是用匯編語言。 ARM啟動代碼設計參考 收藏 基于ARM的芯片多數(shù)為復雜的片上系統(tǒng),這種復雜系統(tǒng)里的多數(shù)硬件模塊都是可配置的,需要由軟件來設置其需要的工作狀態(tài)。 可以看到,對第 三種類型的cache,C和B位不再“嚴格”是其本來控制cacheable和bufferable的含義,而是利用這兩位的“組合”來控制cache和 WB的表現(xiàn)行為,這樣做比另外再增加一位來選擇cache的write back策略和write through策略硬件上節(jié)約了資源,效果上卻差不多,少了cache和WB幾種意義不大的組合,應該說還是挺巧妙的。ARM各系列的處理器上的cache設計有所不同,所以有的cache只有write through策略,有的cache只有write back策略,還有的cache是write back策略但允許一定的write through行為,因此C和B位的四種組合對這三種cache而言有不同的含義。還有就是所謂“cachable bit”和“bufferable bit”的問題,這個問題來自于《armarm》partB ,那里有一張表,我對這個表死活不理解。這就是WB和cache的關系。典型寫數(shù)據(jù)總線時機有三種:一是cache處于write through策略下的寫操作;二是cache處于write back策略下,dirty數(shù)據(jù)由于cache行替換或者被程序主動清空而
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1