



免費預覽已結束,剩余1頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
網上已經有人做了一個周立功lpc2000(ARM7TDMI)啟動代碼分析的文章, 我本來想做一個s3c2410(ARM920T)的啟動代碼分析的, 但是看來了一下2410的啟動代碼,發現有些東西還不是理解的很清楚, 我ARM9的經驗比較少.所以還是做一個ARM7的啟動代碼分析吧, 網上那一份相比,我這個主要關注startup.s文件.網上那個startup.s幾乎是一筆帶過的. 紅色標記的是源碼. SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 0IRQ_STACK_LEGTH EQU 256ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0NoInt EQU 0x80USR32Mode EQU 0x10 /用戶模式SVC32Mode EQU 0x13/管理模式SYS32Mode EQU 0x1f/系統模式IRQ32Mode EQU 0x12/中斷模式FIQ32Mode EQU 0x11/快中斷模式上面幾行代碼,不用過多分析, 定義幾個符號而已, 把EQU想像成C中的#define就可以了. 具體定義的數值,下面的代碼用到我再解釋.IMPORT _use_no_semihosting_swi上面這一句的作用是在代碼中禁用 semihosting 機制. 到底什么是semihostiong這里不多說, 網上有很多. 這里只說明Semihosting主要用來調試, 在release版本的代碼中一般是要禁用的. IMPORT FIQ_Exception IMPORT _main IMPORT TargetResetInit上面三行是把要引入的外部標號聲明一下,以便下面使用. EXPORT bottom_of_heapEXPORT StackUsrEXPORT ResetEXPORT _user_initial_stackheap上面四行是把要給其它文件使用的標號聲明AREA vectors,CODE,READONLY ENTRY上面這一行聲明匯編文件的入口, 整個文件是從這里開始執行的. Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr DCD 0xb9205f80 LDR PC, PC, #-0xff0 LDR PC, FIQ_Addr上面幾行是配置中斷向量表. 中斷向量表的順序是不能變的,因為這是ARM7規定的,可以參考相關書籍. 這里有幾個問題要說明一下.第一, 關于DCD 0xb9205f80, 按照ARM7的中斷向量表分布圖, 這個位置是個保留位. 但是究竟為什么要用0xb9205f80這個數值呢. 根據周立功的說法, nxp系列的lpc21xx,lpc22xx片子要求中斷向量表中所有數據32位累加和為0,否則程序不能脫機運行, 我在AXD反匯編了一下(如下圖),把中斷向量表中的8個機器碼累加了一下:0xe59ff018*6+0xe51ffff0+0xb9205f80,沒錯, 結果是零. 但是我遇到一個問題, 就是我在實驗中,把0xb9205f80這個數值改成任何值,程序運行都沒問題. 頭大了, 這個問題待解決中(希望高手看到了可以指點一二). 第二, 關于LDR PC, PC, #-0xff0. 這里本應該放IRQ中斷的, 為什么是這么一句話. 其實在我blog的其中一篇文章里有提到過這一點. ARM7的三級流水線結構導致了PC指向的是當前指令的后8個字節. 本來IRQ是應該放在0x00000018處的. LDR PC, PC, #-0xff0這條語句執行后, PC的當前值就是0x00000018+8-0xff0. 很容易計算出它的結果是0xfffff030. 看一下lpc22xx的手冊就知道. 這個地址就是VICVectAddr. 也就是說本來這個地址是應該放IRQ服務程序的入口地址的,但是這個地址被放在了VICVectAddr 這個寄存器里. 英文手冊里有一段對VICVectAddr 描述. 看了之后就容易明白是怎么回事了: Vector Address Register. When an IRQ interrupt occurs, the IRQ service routine can read this register and jump to the value readResetAddr DCD ResetInitUndefinedAddr DCD UndefinedSWI_Addr DCD SoftwareInterruptPrefetchAddr DCD PrefetchAbortDataAbortAddr DCD DataAbortNouse DCD 0IRQ_Addr DCD 0FIQ_Addr DCD FIQ_Handler這幾行是為上面中斷向量表中的中斷標號分配內存空間, 也就是它們的執行地址. 一開始我有個疑問, 為什么不直接用LDR PC, ResetInit,還要用DCD中轉一下, 后來上網查了一下,才恍然大悟, ldr指令中的地址必須為當前指令地址是4KB范圍內, 用DCD中轉一下就可以在整個程序空間尋址.Undefined B UndefinedSoftwareInterrupt B SoftwareInterrupt PrefetchAbort B PrefetchAbortDataAbort B DataAbortFIQ_Handler STMFD SP!, R0-R3, LR BL FIQ_Exception LDMFD SP!, R0-R3, LR SUBS PC, LR, #4這幾行不用過多解釋, 只是說明上面幾個異常如何執行.InitStack MOV R0, LR;設置管理模式堆棧 MSR CPSR_c, #0xd3 LDR SP, StackSvc ;設置中斷模式堆棧 MSR CPSR_c, #0xd2 LDR SP, StackIrq;設置快速中斷模式堆棧 MSR CPSR_c, #0xd1 LDR SP, StackFiq;設置中止模式堆棧 MSR CPSR_c, #0xd7 LDR SP, StackAbt;設置未定義模式堆棧 MSR CPSR_c, #0xdb LDR SP, StackUnd;設置系統模式堆棧 MSR CPSR_c, #0xdf LDR SP, =StackUsr MOV PC, R0上面是一個子函數, 函數名為InitStack. 顧名思意, 這個函數設置ARM七種工作模式下的堆棧. 關于這一段代碼有三點要說.第一, MSR CPSR_c, #0xdf, 這一句把ARM的工作模式設置為系統模式,或者也可以說是用戶模式, 因為系統模式與用戶模式是共享相同的寄存器組. 用0xdf對CPSR寄存器賦值,就把IRQ中斷關閉了(可以查一下CRSR的詳細說明), 代碼正常執行時處理器是處在用戶模式的,所以IRQ中斷是不會執行的. 所以,如果用周立功的這個啟動代碼,當你的程序中需要中斷時,要把0xdf改成0x5f. 之前看到很多人在網上說用周立功的ADS工程模板,進不了中斷,很多情況下是這個原因. 第二, 并不是每一種模式下的堆棧都用設置的, 比如說如果你的程序中不會用到FIQ,就可以不用設置快速中斷下的堆棧. 第三, 注意LDR SP, =StackUsr這個語句, 其它都是沒有=號的, 為什么這個要用等號呢? 這就是LDR偽指令與LDR指令的區別了, LDR SP, =StackUsr是把StackUsr表示的地址裝載到sp, LDR SP, StackUnd是把StackUnd表示地址的內容裝載到sp,注意下面幾句StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4可以看到,沒有”=”的標號都已經用DCD初始化了, 而StackUsr到底是什么呢, 它是由下面的語句決定的(startup.s文件)AREA Stacks, DATA, NOINITStackUsr(分散加載文件)STACKS 0x40002000 UNINIT Startup.o (Stacks) 這樣就明白了, StackUsr肯定是0x400000000x400020000之間的某個數. 用戶模式下的堆棧空間就是它了. ResetInit BL InitStack BL TargetResetInit B _main處理器上電復位后通過中斷向量表進入該函數,_main函數主要工作是初始化C的庫函數, 并由它進入C的main函數. _user_initial_stackheap LDR r0,=bottom_of_heap; LDR r1,=StackUsrMOV pc,lr_user_initial_stackheap函數是ADS的一個庫函數, 如果程序中用到的分散加載文件, 這個函數必須要被實現. 應用程序的棧和heap是在C庫函數初始化過程中建立起來的。可以通過重定向對應的子程序來改變堆棧和heap的位置. 堆棧的地址在分散加載文件里已經指定好,本函數不應該修改它們的值. 用r0,r1分別返回heap和stack的基址. 關于ADS的存儲器機制大家可以去網上查更詳細的資料. StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4 AREA MyStacks, DATA, NOINIT, ALIGN=2SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration ModeIrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend ModeUndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 上面幾行代碼是為各個模式下的堆棧分配空間. 其中MyStacksA的位置會在分散加載文件中指定. IF :DEF: EN_CRP IF . = 0x1fc INFO 1,nThe data at 0x000001fc must be 0x87654321.nPlease delete some source before this line. ENDIFCrpData WHILE . 0x1fc NOP WENDCrpData1 DCD 0x87654321 ;/*When the Data is 為0x87654321,user code be protected. 當此數為0x87654321時,用戶程序被保護 */ ENDIF上面這幾行其實是加密芯片用的, lpc21xx和lpc22xx系列的ARM7,當你的工程選擇RelInFlash時, 代碼寫進flash,芯片也同時被加密, 加密狀態下JTAG也讀不到芯片, 也不能單步調試, 要解密的話必須要用ISP完全擦除一下. 上面的代碼的意思就是在地址0x1f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 分子生物學實驗操作技巧知識問答
- 工作交接流程表格化管理
- 在線咨詢服務合同及安全保障承諾事項
- 生活垃圾分類網點的持續評估與改進機制
- 新質生產力推動鄉村振興的作用與路徑
- 文言文啟蒙:古代散文欣賞高中文言文教學課
- 跨模態注意力與角色交互對學生課堂專注度的研究
- DB14-T 3407-2025 套筒直播造林技術規程
- 小小園丁的故事植物養護體驗記寫景作文(8篇)
- 《古典概型問題解析:高二數學教學教案》
- T/DGGC 005-2020全斷面隧道掘進機再制造檢測與評估
- 湖南省永州市冷水灘區京華中學2025年中考二模 歷史試題(含答案)
- 戀愛合同續約協議書范本
- 護理教學體系構建與實施
- 2025-2030年中國消毒劑行業市場現狀供需分析及投資評估規劃分析研究報告
- 公司用人培養協議書
- 江蘇省鎮江市江南學校2025年七下數學期末綜合測試試題含解析
- 江蘇醫療質量管理辦法實施細則
- GB/T 45593-2025精細陶瓷微磨損試驗測定涂層的耐磨性
- 公路防汛安全培訓課件
- 【8生 會考】2022-2024年安徽省初中(八年級)中考初二會考生物試卷(3年真題)
評論
0/150
提交評論