版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Cortex-M3啟動代碼分析,目標,掌握嵌入式應用程序設計的基本知識 掌握starup_stm32f10 x_cl.s中常見匯編指令 能分析starup_stm32f10 x_cl.s啟動代碼,嵌入式應用系統(tǒng)中的存儲映射,在設計嵌入式應用系統(tǒng)時,為了追求最好的性能價格比,系統(tǒng)中通常包括多種存儲器,如ROM、16位RAM、32位RAM和FLASH等,這樣一個重要的問題就是設計其存儲系統(tǒng)的布局。 在RAM 體系結構中,系統(tǒng)復位后將跳轉到地址0 x0處執(zhí)行,該處存放的是復位異常中斷的中斷向量。對于嵌入式系統(tǒng)來說,在系統(tǒng)復位時RAM中是不存在代碼和數(shù)據的。因此在系統(tǒng)復位時,地址0 x0處應該為ROM
2、,即系統(tǒng)復位后應該首先從ROM中開始執(zhí)行。,地址0 x0處為ROM,這里所說的地址0 x0處為ROM,是指在系統(tǒng)運行過程中,地址0 x0處為ROM,對于嵌入式系統(tǒng)來說,在系統(tǒng)復位時地址0 x0處總為ROM。這種情況非常簡單,在地址0 x0處存放著復位異常中斷向量,根據此中斷向量,程序跳轉到相應的位置進行系統(tǒng)初始化等操作。 這種情況有一個缺點,通常相對于RAM來說,ROM的數(shù)據寬度較小,速度較慢,這會使系統(tǒng)響應異常中斷的速度較慢,而且如果異常中斷向量表放在ROM中,則中斷向量表內容不能修改。,地址0 x0處為RAM,這里所說的地址0 x0處為RAM,是指在系統(tǒng)運行過程中,地址0 x0處為RAM,
3、對于嵌入式系統(tǒng)來說,在系統(tǒng)復位時地址0 x0處總為ROM。因此,對于地址0 x0處為RAM的系統(tǒng),為了保證系統(tǒng)復位后從ROM中開始執(zhí)行,在系統(tǒng)復位時,系統(tǒng)中的存儲映射機構將ROM映射到地址0 x0處,然后在程序運行的最初幾條指令中,系統(tǒng)中的存儲映射機構進行地址重映射,重新將RAM映射到地址0 x0處。 優(yōu)點:RAM的數(shù)據寬度較大,速度較快,這會使系統(tǒng)響應異常中斷的速度更快。而且異常中斷向量表放在RAM中,程序在運行過程中可以修改中斷向量表內容,使得系統(tǒng)更為靈活。,系統(tǒng)初始化,系統(tǒng)運行環(huán)境初始化,包括異常中斷向量初始化、數(shù)據棧初始化以及IO初始化等。 應用程序初始化,例如C語言變量的初始化等。
4、啟動代碼功能總結: 1)堆和棧的初始化; 2)向量表定義; 3)地址重映射及中斷向量表的轉移; 4)設置系統(tǒng)時鐘頻率; 5)中斷寄存器的初始化; 6)進入C應用程序。,預備知識,一個由C/C+編譯的程序占用的內存分為以下幾個部分 : 棧區(qū)(stack) 編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。操作方式類似于數(shù)據結構中的棧。 堆區(qū)(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數(shù)據結構中的堆是兩回事,分配方式倒是類似于鏈表。 全局區(qū)(靜態(tài)區(qū))(static)全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始
5、化的全局變量和未初始化的靜態(tài)變量在相鄰的另 一塊區(qū)域。 程序結束后由系統(tǒng)釋放。,預備知識,文字常量區(qū) 常量字符串就是放在這里的。 程序結束后由系統(tǒng)釋放 程序代碼區(qū)存放函數(shù)體的二進制代碼。 /main.cpp int a = 0; 全局初始化區(qū) char *p1; 全局未初始化區(qū) main() int b; 棧 char s = “abc”; 棧 char *p2; 棧 char *p3 = “123456”; 1234560在常量區(qū),p3在棧上,預備知識,static int c =0; 全局(靜態(tài))初始化區(qū) p1 = (char *)malloc(10); p2 = (char *)mall
6、oc(20); 分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。 strcpy(p1, 123456); 1234560放在常量區(qū),編譯器可能會將它與p3所指向的123456 優(yōu)化成一個地方。 ENTRY: 偽操作指定程序的人口點 AREA:偽操作用于定義一個代碼段或者數(shù)據段 DCD:用于分配一段字內存單元,代碼分析1, 棧的初始化: Stack_Size EQU 0 x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size _initial_sp 定義Stack Size為0 x00000400; 定義棧
7、,可初始化為0,8字節(jié)對齊 分配0 x00000400個連續(xù)字節(jié),并初始化為0 匯編代碼地址標號,代碼分析2, 堆的初始化: Heap_Size EQU 0 x00000400 AREA HEAP, NOINIT, READWRITE, ALIGN=3 _heap_base Heap_Mem SPACE Heap_Size _heap_limit 定義Heap Size為0 x00000400; 定義堆 ,可初始化為0,8字節(jié)對齊 分配0 x00000400個連續(xù)字節(jié),并初始化為0 匯編代碼地址標號,代碼分析3,PRESERVE8 THUMB 指定當前文件堆棧8字節(jié)對齊 告訴匯編器下面是32為
8、的Thumb指令,如果需要匯編器將插入位以保證對齊,代碼分析4,見 STM3210X datasheet V10C.pdf 130頁 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY /定義復位向量段,只讀 EXPORT _Vectors EXPORT _Vectors_End EXPORT _Vectors_Size/定義一個可以在其他文件中使用的全局標號,此處表示中斷地址 _Vectors DCD _initial_sp ; Top of Stack /給_initial_sp 分配4字節(jié)32位的地
9、址0 x0,代碼分析5,DCD Reset_Handler ; Reset Handler / 給標號Reset Handler分配地址為0 x00000004 DCD NMI_Handler ; NMI Handler /給標號NMI Handler分配地址0 x00000008 DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage F
10、ault Handler DCD 0 ; Reserved /這種形式就是保留地址,不給任何標號分配 。,代碼分析6,DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line DCD CAN2_TX_IRQHandler ; CAN2 TX DCD CAN2_RX0_IRQHandler ; CAN2 RX0 DCD CAN2_RX1_IRQHandler ; CAN2 RX1 DCD CAN2_SCE_IRQHandler ; CAN2 SCE DCD OTG_FS_IRQHandler ; USB OTG FS _Vectors
11、_End _Vectors_Size EQU _Vectors_End - _Vectors,代碼分析7, 中斷向量表的轉移 AREA |.text|, CODE, READONLY /代碼段定義 ; Reset handler routine Reset_Handler PROC /標記一個函數(shù)的開始 EXPORT Reset_Handler WEAK /【WEAK】選項表示當所有的源文件都沒有定義一個標號時,編譯器也不給出錯誤信息,在多數(shù)情況下將該標號置為0,若該標號為B或BL指令引用,則將B或BL指令置為NOP操作; /EXPORT 提示編譯器標號可以為外部文件引用;,代碼分析8,IMP
12、ORT _main /通知編譯器要使用的標號在其他文件 LDR R0, =_main / 使用“”表示LDR目前是偽指令不是標準指令,這里是把_main的地址給R0; BX R0 /BX是ARM指令集和THUMB指令集之間的程序的跳轉 ENDP,代碼分析9,; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler WEAK B . ENDP HardFault_Handler PROC EXPORT HardFault_Handler WEAK B
13、. ENDP,代碼分析10,MemManage_Handler PROC EXPORT MemManage_Handler WEAK B . ENDP 。 CAN2_SCE_IRQHandler OTG_FS_IRQHandler B . ENDP ALIGN,代碼分析11, 堆和棧的初始化 ; User Stack and Heap initialization ;* IF :DEF:_MICROLIB /DEF:X 就是說X定義了則為真,否則為假 EXPORT _initial_sp EXPORT _heap_base EXPORT _heap_limit ELSE IMPORT _use_two_region_memory EXPORT _user_initial_stackheap,代碼分析12, 堆和棧的初始化 _user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END,啟動配置,從主閃存存儲器啟動:主閃存存儲器被映射到啟動空間(0 x0000 0000),但仍然能夠在它原
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年湖南郴州市百??毓杉瘓F有限公司招聘9人參考考試題庫附答案解析
- 蔬菜生產基地制度
- 農業(yè)生產技術指導制度
- 分類生產現(xiàn)場管理制度
- 科研生產實驗室管理制度
- 2026年濰坊青州市事業(yè)單位公開招聘綜合類崗位人員(32人)參考考試試題附答案解析
- 生產成包梯級制度
- 2026上半年黑龍江省衛(wèi)生健康委員會直屬事業(yè)單位招聘125人備考考試試題附答案解析
- 鎮(zhèn)建立農產品生產制度
- 無視項目生產管理制度
- 防寒防凍防滑安全培訓課件
- 駕校教練員安全知識培訓課件
- 《危險化學品安全法》解讀與要點
- 電力網絡安全培訓教學課件
- 2025年宜昌市“招才興業(yè)”市直事業(yè)單位人才引進47人·重慶大學站筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 上海市徐匯區(qū)上海中學2025-2026學年高三上學期期中考試英語試題(含答案)
- 2025秋滬科版(五四制)(新教材)初中科學六年級第一學期知識點及期末測試卷及答案
- 孕婦貧血教學課件
- 5年(2021-2025)山東高考生物真題分類匯編:專題17 基因工程(解析版)
- 新華資產招聘筆試題庫2025
- 智能化項目驗收流程指南
評論
0/150
提交評論