一、啟動文件的作用
(關(guān)于啟動代碼的作用,前面已經(jīng)提到過了,這里再啰嗦一下)
(1)初始化堆棧指針 SP;
(2)初始化程序計數(shù)器指針 PC;
(3)設(shè)置堆、棧的大??;
(4)設(shè)置異常向量表的入口地址;
(5)配置外部 SRAM作為數(shù)據(jù)存儲器(這個由用戶配置,一般的開發(fā)板可沒有外部 SRAM);
(6)設(shè)置 C庫的分支入口__main(最終用來調(diào)用 main函數(shù));
(7)在 3.5版的啟動文件還調(diào)用了在 system_stm32f10x.c文件中的SystemIni()函數(shù)配置系統(tǒng)時鐘。
二、啟動文件中提到的匯編指令
指令
作用
EQU
給數(shù)字常量取一個符號名,相當(dāng)于 C 語言中的 define
AREA
匯編一個新的代碼段或者數(shù)據(jù)段
SPACE
分配內(nèi)存空間
PRESERVE8
當(dāng)前文件堆棧需按照 8 字節(jié)對齊
EXPORT
聲明一個標(biāo)號具有全局屬性,可被外部的文件使用
DCD
以字為單位分配內(nèi)存,要求 4 字節(jié)對齊,并要求初始化這些內(nèi)存
PROC
定義子程序,與 ENDP 成對使用,表示子程序結(jié)束
WEAK
弱定義,如果外部文件聲明了一個標(biāo)號,則優(yōu)先使用外部文件定義的標(biāo)號,如果外部文件沒有定義也不出錯。
IMPORT
聲明標(biāo)號來自外部文件,跟 C 語言中的 EXTERN 關(guān)鍵字類似
B
跳轉(zhuǎn)到一個標(biāo)號
ALIGN
編譯器對指令或者數(shù)據(jù)的存放地址進(jìn)行對齊,一般需要跟一個立即
數(shù),缺省表示 4 字節(jié)對齊。要注意的是:這個不是 ARM 的指令,是編譯器的,這里放在一起只是為了方便。
END
到達(dá)文件的末尾,文件結(jié)束
IF,ELSE,ENDIF
匯編條件分支語句,跟 C 語言的類似
LDR
從存儲器中加載字到一個寄存器中
BL
跳轉(zhuǎn)到由寄存器/標(biāo)號給出的地址,并把跳轉(zhuǎn)前的下條指令地址保存到 LR
BLX
跳轉(zhuǎn)到由寄存器給出的地址,并根據(jù)寄存器的 LSE 確定處理器的狀態(tài),還要把跳轉(zhuǎn)前的下條指令地址保存到 LR
BX
跳轉(zhuǎn)到由寄存器/標(biāo)號給出的地址,不用返回
三、啟動代碼詳解
1、stack——棧
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE,ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
分配名為STACK,不初始化,可讀可寫,8(2^3)字節(jié)對齊的1KB空間。
棧:局部變量,函數(shù)形參等。棧的大小不能超過內(nèi)部SRAM大小。
AREA:匯編一個新的代碼段或者數(shù)據(jù)段。STACK段名,任意命名;NOINIT表示不初始化;READWRITE可讀可寫;ALIGN=3(2^3= 8字節(jié)對齊)。
__initial_sp緊挨了SPACE放置,表示棧的結(jié)束地址,棧是從高往低生長,結(jié)束地址就是棧頂?shù)刂贰?/p>
2、heap——堆
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE,ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
分配名為HEAP,不初始化,可讀可寫,8(2^3)字節(jié)對齊的512字節(jié)空間。__heap_base堆的起始地址,__heap_limit堆的結(jié)束地址。堆由低向生長。動態(tài)分配內(nèi)存用到堆。
PRESERVE8 //指定當(dāng)前文件的堆棧按照 8 字節(jié)對齊。
THUMB //表示后面指令兼容 THUMB 指令。THUBM 是ARM 以前的指令集,16bit,現(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集,THUMB-2 是32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超級。
3、向量表
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
定義一個名為RESET,可讀的數(shù)據(jù)段。并聲明 __Vectors、__Vectors_End 和__Vectors_Size 這三個標(biāo)號可被外部的文件使用。
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
DCD USB_HP_CAN1_TX_IRQHandler ; USBHigh Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
DCD TIM8_BRK_IRQHandler ; TIM8 Break
DCD TIM8_UP_IRQHandler ; TIM8 Update
DCD TIM8_TRG_COM_IRQHandler ; TIM8Trigger and Commutation
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD ADC3_IRQHandler ; ADC3
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2Channel3
DCD DMA2_Channel4_5_IRQHandler; DMA2 Channel4 & Channel5
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
__Vectors 為向量表起始地址,__Vectors_End 為向量表結(jié)束地址,兩個相減即可算出向量表大小。
向量表從 FLASH 的 0 地址開始放置,以 4 個字節(jié)為一個單位,地址 0 存放的是棧頂?shù)刂罚?X04 存放的是復(fù)位程序的地址,以此類推。從代碼上看,向量表中存放的都是中斷服務(wù)函數(shù)的函數(shù)名,可我們知道 C 語言中的函數(shù)名就是一個地址。
4、復(fù)位程序
AREA |.text|, CODE, READONLY
定義一個名為.text,可讀的代碼段
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
復(fù)位子程序是系統(tǒng)上電后第一個執(zhí)行的程序,調(diào)用 SystemInit ()函數(shù)初始化系統(tǒng)時鐘,然后調(diào)用 C 庫函數(shù)_main。
5、終端服務(wù)子程序
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
此處省略部分……
啟動文件里面已經(jīng)幫我們寫好所有中斷的中斷服務(wù)函數(shù),跟我們平時寫的中斷服務(wù)函數(shù)不一樣的就是這些函數(shù)都是空的,真正的中斷復(fù)服務(wù)程序需要我們在外部的 C 文件里面重新實現(xiàn),這里只是提前占了一個位置而已。
如果我們在使用某個外設(shè)的時候,開啟了某個中斷,但是又忘記編寫配套的中斷服務(wù)程序或者函數(shù)名寫錯,那當(dāng)中斷來臨的時,程序就會跳轉(zhuǎn)到啟動文件預(yù)先寫好的空的中斷服務(wù)程序中,并且在這個空函數(shù)中無線循環(huán),即程序就死在這里。
B:跳到一個“.”,表示無限循環(huán)。
6、用戶堆棧初始化
ALIGN
ALIGN:對指令或者數(shù)據(jù)存放的地址進(jìn)行對齊,后面會跟一個立即數(shù)。缺省表示 4 字節(jié)對齊。
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__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
判斷是否定義了__MICROLIB ,如果定義了則賦予標(biāo)號__initial_sp(棧頂?shù)刂罚?、__heap_base(堆起始地址)、__heap_limit(堆結(jié)束地址)全局屬性,可供外部文件調(diào)用。如果沒有定義(實際的情況就是我們沒定義__MICROLIB)則使用默認(rèn)的 C 庫,然后初始化用戶堆棧大小,這部分有 C 庫函數(shù)__main 來完成。
上一篇:MDK開發(fā)環(huán)境STM32啟動文件_main函數(shù)分析
下一篇:關(guān)于STM32L152 運(yùn)行時程序卡在B.處的解決方法
推薦閱讀
史海拾趣
在競爭激烈的電子市場中,F(xiàn)DK AMERICA公司始終堅持品質(zhì)至上的原則。公司嚴(yán)格控制產(chǎn)品質(zhì)量,從原材料采購到生產(chǎn)流程再到售后服務(wù),每一個環(huán)節(jié)都力求做到精益求精。這種對品質(zhì)的執(zhí)著追求贏得了客戶的信賴,也為公司樹立了良好的品牌形象。
High Tech Chips Inc成立之初,便專注于研發(fā)高性能的AI芯片。在公司創(chuàng)始人李博士的帶領(lǐng)下,團(tuán)隊突破了傳統(tǒng)芯片設(shè)計的瓶頸,開發(fā)出了一款具有超低功耗和高效能比的AI加速器芯片。這款芯片迅速獲得了市場的認(rèn)可,被廣泛應(yīng)用于智能手機(jī)、智能家居和自動駕駛等領(lǐng)域。隨著技術(shù)的不斷迭代和產(chǎn)品的持續(xù)優(yōu)化,High Tech Chips Inc逐漸在AI芯片市場占據(jù)了一席之地,并成為了行業(yè)內(nèi)的技術(shù)領(lǐng)先者。
High Tech Chips Inc深知人才是企業(yè)發(fā)展的核心競爭力。因此,公司一直將人才戰(zhàn)略放在企業(yè)發(fā)展的重要位置。公司不僅吸引了大量來自國內(nèi)外頂尖高校的優(yōu)秀人才加盟,還建立了完善的人才培養(yǎng)體系和激勵機(jī)制。通過舉辦技術(shù)交流會、設(shè)立創(chuàng)新基金等方式激發(fā)員工的創(chuàng)新潛能和工作熱情。這些舉措為公司的發(fā)展奠定了堅實的人才基礎(chǔ)和技術(shù)儲備。
隨著電子技術(shù)的快速發(fā)展,ETI意識到只有不斷創(chuàng)新才能在競爭中立于不敗之地。公司加大了對研發(fā)的投入,積極引進(jìn)國內(nèi)外先進(jìn)技術(shù),并鼓勵員工提出創(chuàng)新性的想法。在一次偶然的實驗中,ETI的研發(fā)團(tuán)隊成功研發(fā)出了一種具有高效能、低功耗特點的電子元器件,這一突破性的技術(shù)成果迅速獲得了市場的認(rèn)可,為ETI帶來了可觀的收益。
2005年,對于Keil公司來說是一個具有里程碑意義的年份。在這一年,英國的ARM公司看中了Keil在嵌入式系統(tǒng)開發(fā)工具領(lǐng)域的領(lǐng)先地位和技術(shù)實力,決定對其進(jìn)行收購。收購?fù)瓿珊?,Keil公司正式成為ARM公司的一部分,繼續(xù)專注于嵌入式系統(tǒng)開發(fā)工具的研發(fā)和銷售。這一事件標(biāo)志著Keil公司進(jìn)入了一個新的發(fā)展階段,也為其未來的發(fā)展奠定了堅實的基礎(chǔ)。
[引]avrADC轉(zhuǎn)換實驗-ADC噪聲抑制模式 /* ******************************************************** * 文件: adc.c * 功能: ADC轉(zhuǎn)換實驗-ADC噪聲抑制模式 * 工具: WinAVR20050214(AVR-GCC) * mcu : Atmega8 * 時鐘: 外部晶體8MHz * 日期: 2005年10月25 ...… 查看全部問答∨ |
如何開始DSP編程 這本書,從安裝CCS 軟件開始,一步一步教你如何開始DSP編程, 并給出了相應(yīng)操作的圖示,是一本難得的好書 對初學(xué)者來說,可以以最快的速度入門。 … 查看全部問答∨ |
板子上其中兩路已經(jīng)用于觸摸屏,我想用s3c2410有自帶的其它6路AD轉(zhuǎn)換來采集,要怎么做?請詳細(xì)說明下,謝謝. 之前內(nèi)核已經(jīng)加載了觸摸屏的驅(qū)動,所以在動態(tài)加載AD驅(qū)動時就話出錯(因為這兩個是占用同一個中斷號),網(wǎng)上查詢就說用輪詢,請哪位大俠詳細(xì)說明 ...… 查看全部問答∨ |
如下: linking... *** ERROR L110: CANNOT FIND SEGMENT SEGMENT: ?CO?DEVDS18B20 Program Size: data=51.0 xdata=5555 code=827665 Target not created 已經(jīng)將.h文件包含進(jìn)link文件了,即使把.c文件和.h文件中的所有代碼刪除 ...… 查看全部問答∨ |
我現(xiàn)在在做一個PDA的驅(qū)動,使用的是WinCE操作系統(tǒng),要判斷電池的剩余電量。 電池3600毫安,充滿電是4.2V,PDA大概在3.5V時就不能正常工作了。 現(xiàn)在PDA本身可以檢測到當(dāng)前電壓,有沒有什么算法能從電壓判斷出電量的?希望大家指點?!? 查看全部問答∨ |
|
不知道各位使用帶有ROM LM3S系列單片機(jī)的壇友們有沒有碰到這個問題,flash能下載,但是驗證失敗。折騰了一宿,終于將這個問題解決。 將過程寫下來,讓以后的同學(xué)們少走彎路。 在調(diào)新的LM3S9B95開發(fā)板的時候,經(jīng)常碰到的一個問題是flash編程后驗證 ...… 查看全部問答∨ |
MSP430單片機(jī)“用戶手冊”和“數(shù)據(jù)手冊” 我傳了一份MSP430單片機(jī)用戶手冊和數(shù)據(jù)手冊,與大家分享,希望我們都能把430學(xué)好?!? 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- MPS電機(jī)研究院 讓電機(jī)更聽話的秘密! 第一站:電機(jī)應(yīng)用知識大考!
- TI E2E 無線主題月,寫出你的學(xué)習(xí)筆記!
- 【答題有禮】了解PI推出的全新LinkSwitch-XT2離線反激式開關(guān)電源IC產(chǎn)品系列
- 更直觀的了解5G?觀看羅德與施瓦茨主題演講,填問卷贏好禮!
- 【在線研討會】ADI RadioVerse™技術(shù)與集成DPD算法的RF收發(fā)器AD9375
- 免費領(lǐng)?。夯趇.MX RT1062的Teensy 4.1開發(fā)板,參考開源設(shè)計,DIY LCR表~
- TI史上最強(qiáng)音視頻DSP—DM6467之SEED開發(fā)板全套資源
- TI 工業(yè)月,靈感不設(shè)限!深度挖掘工業(yè)設(shè)計的痛點和難點,讀專題填問卷贏好禮!
- 單片機(jī)零起點入門,帶你DIY 51開發(fā)板
- 智能化升級 高德地圖推出AR導(dǎo)航行業(yè)解決方案
- 威瑞森推出超精確定位服務(wù) 可提升道路安全/推動自動駕駛技術(shù)發(fā)展
- VisionCon 2020視覺系統(tǒng)設(shè)計技術(shù)會議,知象光電邀您一起頭腦風(fēng)暴!
- 廣明旗下達(dá)明機(jī)器人攜手代理商巨曜自動化,成立南部訓(xùn)練室
- 臺灣機(jī)器人產(chǎn)學(xué)聯(lián)盟啟動機(jī)器人工程師術(shù)科考試,上銀捐贈機(jī)械臂
- 政策加持,國產(chǎn)工業(yè)機(jī)械臂有望突破現(xiàn)有局勢
- 美國垃圾填埋場將成為可再生能源的電池儲能場所!
- “區(qū)塊鏈+邊緣計算”促進(jìn)5G通信發(fā)展!
- 德勤:中國市場或迎來5G消費熱潮
- 致力打造“人民的5G”,紫光展銳展現(xiàn)5G時代的無限可能