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

正文內(nèi)容

arm處理器系統(tǒng)初始化過程-在線瀏覽

2024-08-09 08:42本頁面
  

【正文】 W數(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|開始的地址,當RAM這邊的目 標地址到達|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開始,接下去就對這片ZI區(qū)進行清零操作,直到遇到結(jié)束地 址|Image$$ZI$$Limit|改變處理器模式因為在初始化過程中,許多操作需要在特權(quán)模式下才能進行(比如對CPSR的修改),所以要特別注意不能過早的進入用戶模式。如果系統(tǒng)中另外存在一個專門的中斷控制器,這么做總是安全的。最簡單的一種情況是:IMPORT mainB main直接從啟動代碼跳轉(zhuǎn)到應用程序的主函數(shù)入口,當然主函數(shù)名字可以由用戶隨便定義。IMPORT __mainB __main__main()是編譯系統(tǒng)提供的一個函數(shù),負責完成庫函數(shù)的初始化和初始化應用程序執(zhí)行環(huán)境,最后自動跳轉(zhuǎn)到main()函數(shù)。 在程序的執(zhí)行過程中,微處理器可以隨時在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應寄存器中的內(nèi)容。 ARM處理器狀態(tài) 進 入Thumb狀態(tài):當操作數(shù)寄存器的狀態(tài)位(位0)為1時,可以采用執(zhí)行BX指令的方法,使微處理器從ARM狀態(tài)切換到Thumb狀態(tài)。 進入ARM狀態(tài):當操作數(shù)寄存器的狀態(tài)位為0時,執(zhí)行BX指令時可以使微處理器從Thumb狀態(tài)切換到ARM狀態(tài)。ARM處理器模式 ARM微處理器支持7種運行模式,分別為: 用戶模式(usr):ARM處理器正常的程序執(zhí)行狀態(tài)。 外部中斷模式(irq):用于通用的中斷處理。 數(shù)據(jù)訪問終止模式(abt):當數(shù)據(jù)或指令預取終止時進入該模式,可用于虛擬存儲及存儲保護。 定義指令中止模式(und):當未定義的指令執(zhí)行時進入該模式,可用于支持硬件協(xié)處理器的軟件仿真。大多數(shù)的應用程序運行在用戶模式下,當處理器運行在用戶模式下時,某些被保護的系統(tǒng)資源是不能被訪問的。 ARM寄存器 ARM處理器共有37個寄存器。這些寄存器都是32位寄存器。 關(guān)于寄存器這里就不詳細介紹了,有興趣的人可以上網(wǎng)找找,很多這方面的資料。在處理異常之前,當前處理器的狀態(tài)必須保留,這樣當異常處理完成之后,當 前程序可以繼續(xù)執(zhí)行。當一個異常出現(xiàn)以后,ARM微處理器會執(zhí)行以下幾步操作: 進入異常處理的基本步驟: 將下一條指令的地址存入相應連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執(zhí)行。根據(jù)異常類型,強制設置CPSR的運行模式位。如果異常發(fā)生時,處理器處于Thumb狀態(tài),則當異常向量地址加載入PC時,處理器自動切換到ARM狀態(tài)。 將SPSR復制回CPSR中。應用程序初始化該R13,使其指向該異常模式專用的棧地址。這樣就使異常處理程序不會破壞被其中斷程序的運行現(xiàn)場。請問cache和writebuffer的關(guān)系,在WB和cache同時打開的時候,數(shù)據(jù)是如何流動的呢?考慮到WB的特性,是不是較大段的數(shù)據(jù)被寫入WB? WB的設計是為了防止處理器流水線被寫數(shù)據(jù)總線操作(寫主存,寫外圍設備寄存器等)拉住。有了WB之后,被寫 回數(shù)據(jù)總線的內(nèi)容在進入WB之后,處理器和cache就可以立刻繼續(xù)使用了。2。這個問題以前也問過,但是沒有人回答。第一列和第二列分別針對write through型cache和write back型cache進行解釋,其含義可以參考我對第1個問題的回答,第三列針對write back策略但允許一定的write through行為的cache,第一行好理解,第二行之所以在B位為0的情況下依然是bufferable,應該是因為硬件上的設計原因(節(jié)省硬件資源 或者由于目標設計頻率限制),第三行的含義是,當C==1,B==0時,cache使用write through策略,WB開啟,第四行的含義是,當C==1,B==1時,cache使用write back策略,WB開啟。因此在用戶的應 用程序之前,需要由專門的一段代碼來完成對系統(tǒng)的初始化。一般通用的內(nèi)容包 括: 中斷向量表 初始化存儲器系統(tǒng) 初始化堆棧 初始化有特殊要求的斷口,設備 初始化用戶程序執(zhí)行環(huán)境 改變處理器模式 呼叫主應用程序中斷向量表 ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。因為每個中斷只占據(jù)向量表中1個字的存儲空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行中斷處理。BootREADONLY ENTRY BResetHandler BUndefHandler BSWIHandler BPreAbortHandler BDataAbortHandler B BIRQHandler BFIQHandler 其中關(guān)鍵字ENTRY是指定編譯器保留這段代碼,因為編譯器可能會認為這是一段亢余代碼而加以優(yōu)化。初始化存儲器系統(tǒng) (1)存儲器類型和時序配置 通常Flash和SRAM同屬于靜態(tài)存儲器類型,可以合用同一個存儲器端口;而DRAM因為有動態(tài)刷新和地址線復用等特性,通常配有專用的存儲器端口。因為一般系統(tǒng)運行的速度瓶頸都存在于存儲器訪問,所以存儲器訪問時序應盡可能的快;而同時又要考慮到由此帶來的穩(wěn)定性問題。初始化堆棧 因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨立的。方法是改變狀態(tài)寄存器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),讓后給SP賦值。 這是一段堆棧初始化的代碼示例,其中只定義了三種模式的SP指針: MRSR1,R0,IRQMODE MSRSP,=UndefStack ORRCPSR_cxsf,R1 LDRR1,R0,SVCMODE MSRSP,=SVCStack 4.初始化應用程序執(zhí)行環(huán)境 映 像一開始總是存儲在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的RAM中執(zhí)行;而RW和ZI這兩部 分是必須轉(zhuǎn)移到可寫的RAM里去。 下面是在ADS下,一種常用存儲器模型的直接實現(xiàn): LDRr0,=|Image$$RO$$Limit|得到RW數(shù)據(jù)源的起始地址 LDRr1,=|Image$$RW$$Base|RW區(qū)在RAM里的執(zhí)行區(qū)起始地址 LDRr2,=|Image$$ZI$$Base|ZI區(qū)在RAM里面的起始地址 CMPr0,r1比較它們是否相等 BEQ%F1 0LDRr1,=|Image$$ZI$$Limit| MOVCMPr3,r1 STRCCr2,[r3],4 BCC%B2 程序?qū)崿F(xiàn)了RW數(shù)據(jù)的拷貝和ZI區(qū)域的清零功能。 |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|開始的地址,當RAM這邊的目 標地址到達|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開始,接下去就對這片ZI區(qū)進行清零操作,直到遇到結(jié)束地 址|Image$$ZI$$Limit| 6. 內(nèi)核級的中斷使能也可以考慮在這一步進行。 7.最簡單的一種情況是: IMPORT 在ARM IMPORT__main __main()是編譯系統(tǒng)提供的一個函數(shù),負責完成庫函數(shù)的初始化和初始化應用程序執(zhí)行環(huán)境,最后自動跳轉(zhuǎn)到main()函數(shù)。 原因是執(zhí)行“B __main”指令后,程序先跳到__main庫函數(shù)的入口,再進行一些初始化操作,最后再跳入用戶的main函數(shù)。有兩種方法可以解決這個問題。第二:合理初始化堆棧。第二種答案如下:IMPORT __main.... ....BL TargetResetInitB_main完成代碼和數(shù)據(jù)的復制,并把ZI數(shù)據(jù)區(qū)清零,這一步當代碼和數(shù)據(jù)區(qū)在存儲和運行時 處于不同的存儲器位置時有意義。最后_rt_entry跳進應用程序的入口 main()。當一個程序工程項目中存在 main()時,連接器會把_main和_rt_entry中的初始化代碼連接進來;如果沒有main()函數(shù),初始化過程就不會被連接,初始化過程中一 些標準的C庫函數(shù)失效。__main()為編譯系統(tǒng)提供的一個庫函數(shù),使用__main標號引導系統(tǒng)時必須將應用程序的入口數(shù)定義為main();若希望系統(tǒng)進入應用程序前自動完成系統(tǒng)調(diào)用(如庫函數(shù)的初始化、RW、ZI數(shù)據(jù)從 Flash到RAM的拷貝(加載映像執(zhí)行映像)等)的初始化過程,必須使用__main標號以跳至ADS提供的初始化函數(shù)庫,這種情況一般 需做一些庫函數(shù)移植及重定向問題解決;這一點上,應用程序入口必須以main函數(shù)標識;若所有的初始化步驟都已顯式的完成(如堆棧初始化、加載映像到執(zhí)行映像RW、ZI數(shù)據(jù)的 拷貝等),應用程序入口函數(shù)XXXX()可以任意定義(非main,這樣可以避免自動鏈接上__main,從而跳過__main),初始化完成后直接 B XXXX即可,這一點上,main()函數(shù)并不具有特殊性;若必須的初始化步驟都未顯示的完成,一意孤行的B XXXX,程序運行的結(jié)果將不可預料。本人在調(diào)試LPC2294 LCD模塊時才認識到上述第五點()的重要性:程序指令流并沒有錯,但LCD上顯示的全部是亂碼。 Main 修改成B建議和我一樣的初學者還是乖乖的B __main接著將應用入口設置為main()函數(shù)的好。比如:RO沒有變動還是在ROM中,RW被移到了SRAM中,而ZI被放置在SDRAM中6. scatter本身并不能對映像實現(xiàn)‘解壓縮’,編譯器讀入scatter文件之后會根據(jù)其中的各種地址生成啟動代碼,實現(xiàn)對映像的加載,而這一段代碼就 是* (InRoot$$Sections)它是__main()的一部分。7. 起始地址與加載域重合的執(zhí)行域成為root region,* (InRoot$$Sections)必須放在這個執(zhí)行域中,否則鏈接的時候會報錯。 * (InRoot$$Sections) 。 *(+RO) { } { (+ZI) 。 } { (+ZI)這里只有一個,也可以有多個(rom地址不連續(xù)的情況)2. ROM、SRAM、SDRAMSDRAM2是執(zhí)行域,有多個。 加載域名 起始地址 最大允許長度;‘最大允許長度’也可以省略,但缺點是編譯器不會檢查段是否溢出和別的段重疊了。5. * (InRoot$$Sections)是復制代碼的代碼6. UNINT關(guān)鍵字表示不進行初始化清零值得注意的是:在一個scatter文件中,即使是在2個不同的加載域中也不可以,否則會報錯:Ambiguous selectors found for *.o,錯誤的例子:LOAD1 0x00000000{ { EXE2 }}想起了中學里哲學課上老師讓解釋為什么人不能兩次踏入同一條河流,當年稀里糊涂的寫的答案,老師批了個大差,回去有沒有補上,今天居然在這里遇到了老問題。這 就帶來一個問題:如果希望把同一段代碼(如中斷跳轉(zhuǎn)表)載入2份拷貝到不同的地址,咋整?一個笨辦法是自己寫一段代碼搬移程序來代替編譯器自動生成的搬移 代碼,但前提是需要搞懂映像文件的組織,增加了工作量。另外,猜測scatter語法可能包含諸如+duplicate之類的關(guān)鍵字來允許同一段的多個副本,懶得翻ARM手冊,請哪位知情者留 言告知,謝過 將程序執(zhí)行到C文件的main函數(shù) .實驗程序和參數(shù)設置 1連接器的選項設置 選項設置如圖21所示。其它設置請參考有關(guān)書籍。           圖21. 選項設置圖 2啟動代碼 在ARM應用系統(tǒng)中,芯片復位后,在進入C語言的 main()函數(shù)前,都要執(zhí)行一段啟動代碼。由于本實驗的 目的很簡單,就是想讓程序復位后,進入main()函數(shù),所以有些初始化代碼盡量精簡,留下了下述代碼。當執(zhí)行完__main這段代碼后,再跳轉(zhuǎn)到 main()函數(shù)。CODE32 Mode_USR 0x10 。 0x80 。 0x40 USR_Stack 0x00203000 。 B InitReset 0x00 Reset handler undefvec B undefvec 0x04 Undefined Instruction swivec B swivec 0x08 Software Interrupt pabtvec 。 B dabtvec 0x10 Data Abort rsvdvec 。 0x18 IRQ fiqvec 。MSR CPSR_c,Mode_USR | I_Bit | F_Bit 。LDR SP,=
點擊復制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1