<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 arm匯編(thumb-2指令集)啟動(dòng)代碼分析

          STM32 arm匯編(thumb-2指令集)啟動(dòng)代碼分析

          作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏
          ;// Stack Configuration
          ;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
          ;//

          Stack_Size EQU 0x00000200 ;//定義堆棧大小
          AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定義一個(gè)數(shù)據(jù)段 按8字節(jié)對(duì)齊 ;AREA 偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段 NOINIT:指定此數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒(méi)有將各初始值寫(xiě)入內(nèi)存單元,或者將各個(gè)內(nèi)存單元值初始化為0
          Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆??臻g 分 配連續(xù) Stack_Size 字節(jié)的存儲(chǔ)單元并初始化為 0
          __initial_sp ;//標(biāo)號(hào),代表堆棧頂部地址,后面有用
          ;// Heap Configuration
          ;// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
          ;//

          Heap_Size EQU 0x00000020 ;//定義堆空間大小
          AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定義一個(gè)數(shù)據(jù)段,8字節(jié)對(duì)齊
          __heap_base
          Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空間
          __heap_limit ;//標(biāo)號(hào),代表堆末尾地址,后面有用
          PRESERVE8 ;//指示編譯器8字節(jié)對(duì)齊
          THUMB ;//指示編譯器為T(mén)HUMB指令
          ; Vector Table Mapped to Address 0 at Reset
          AREA RESET, DATA, READONLY ;//定義只讀數(shù)據(jù)段,其實(shí)放在CODE區(qū),位于0地址

          EXTERN NMIException
          EXTERN HardFaultException
          EXTERN MemManageException
          EXTERN BusFaultException
          EXTERN UsageFaultException
          EXTERN SVCHandler
          EXTERN DebugMonitor
          EXTERN PendSVC
          EXTERN SysTickHandler ;//聲明這些符號(hào)在外部定義,同C
          ;//在××it.c中實(shí)現(xiàn)這些函數(shù) ,中斷就能自動(dòng)調(diào)用了
          EXPORT __Vectors
          EXPORT __initial_sp ;EXPORT:在程序中聲明一個(gè)全局的標(biāo)號(hào)__Vectors,該標(biāo)號(hào)可在其他的文件中引用;IMPORT:偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義, ;但要在當(dāng)前源文件中引用,而且無(wú)論當(dāng)前源文件是否引用該標(biāo)號(hào),該標(biāo)號(hào)均會(huì)被加入到當(dāng)前源文件的符號(hào)表中
          __Vectors DCD __initial_sp ; Top of Stack //Cotex-M 要求此處為堆棧頂部地址
          DCD Reset_Handler ; Reset Handler
          DCD NMIException ; NMI Handler
          DCD HardFaultException ; Hard Fault Handler
          DCD MemManageException ; MPU Fault Handler
          DCD BusFaultException ; Bus Fault Handler
          DCD UsageFaultException ; Usage Fault Handler
          DCD 0 ; Reserved
          DCD 0 ; Reserved
          DCD 0 ; Reserved
          DCD 0 ; Reserved
          DCD SVCHandler ; SVCall Handler
          DCD DebugMonitor ; Debug Monitor Handler
          DCD 0 ; Reserved
          DCD PendSVC ; PendSV Handler
          DCD SysTickHandler ; SysTick Handler //一大堆的異常處理函數(shù)地址
          ; External Interrupts
          EXTERN WWDG_IRQHandler
          EXTERN PVD_IRQHandler
          EXTERN TAMPER_IRQHandler
          EXTERN RTC_IRQHandler
          EXTERN FLASH_IRQHandler
          EXTERN RCC_IRQHandler
          EXTERN EXTI0_IRQHandler
          EXTERN EXTI1_IRQHandler
          EXTERN EXTI2_IRQHandler
          EXTERN EXTI3_IRQHandler
          EXTERN EXTI4_IRQHandler
          EXTERN DMAChannel1_IRQHandler
          EXTERN DMAChannel2_IRQHandler
          EXTERN DMAChannel3_IRQHandler
          EXTERN DMAChannel4_IRQHandler
          EXTERN DMAChannel5_IRQHandler
          EXTERN DMAChannel6_IRQHandler
          EXTERN DMAChannel7_IRQHandler
          EXTERN ADC_IRQHandler
          EXTERN USB_HP_CAN_TX_IRQHandler
          EXTERN USB_LP_CAN_RX0_IRQHandler
          EXTERN CAN_RX1_IRQHandler
          EXTERN CAN_SCE_IRQHandler
          EXTERN EXTI9_5_IRQHandler
          EXTERN TIM1_BRK_IRQHandler
          EXTERN TIM1_UP_IRQHandler
          EXTERN TIM1_TRG_COM_IRQHandler
          EXTERN TIM1_CC_IRQHandler
          EXTERN TIM2_IRQHandler
          EXTERN TIM3_IRQHandler
          EXTERN TIM4_IRQHandler
          EXTERN I2C1_EV_IRQHandler
          EXTERN I2C1_ER_IRQHandler
          EXTERN I2C2_EV_IRQHandler
          EXTERN I2C2_ER_IRQHandler
          EXTERN SPI1_IRQHandler
          EXTERN SPI2_IRQHandler
          EXTERN USART1_IRQHandler
          EXTERN USART2_IRQHandler
          EXTERN USART3_IRQHandler
          EXTERN EXTI15_10_IRQHandler
          EXTERN RTCAlarm_IRQHandler
          EXTERN USBWakeUp_IRQHandler ;//同上,

          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 DMAChannel1_IRQHandler ; DMA Channel 1
          DCD DMAChannel2_IRQHandler ; DMA Channel 2
          DCD DMAChannel3_IRQHandler ; DMA Channel 3
          DCD DMAChannel4_IRQHandler ; DMA Channel 4
          DCD DMAChannel5_IRQHandler ; DMA Channel 5
          DCD DMAChannel6_IRQHandler ; DMA Channel 6
          DCD DMAChannel7_IRQHandler ; DMA Channel 7
          DCD ADC_IRQHandler ; ADC
          DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX
          DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0
          DCD CAN_RX1_IRQHandler ; CAN RX1
          DCD CAN_SCE_IRQHandler ; CAN 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 ; TIM1 Trigger 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 ;//同上
          AREA |.text|, CODE, READONLY ;//定義代碼段
          ; Reset Handler
          Reset_Handler PROC ;過(guò)程的開(kāi)始

          ;//Rset_Handler的實(shí)現(xiàn) 利用PROC、ENDP這一對(duì)偽指令把程序段分為若干個(gè)過(guò)程,使程序的結(jié)構(gòu)加清晰
          EXPORT Reset_Handler [WEAK] ;//在外部沒(méi)有定義該符號(hào)時(shí)導(dǎo)出該符號(hào),見(jiàn)HELP中[WEAK]
          IMPORT __main ;//導(dǎo)入符號(hào),__main為 運(yùn)行時(shí)庫(kù)提供的函數(shù);完成堆棧,堆的初始話
          LDR R0, =__main ;//等工作,會(huì)調(diào)用下面定義的__user_initial_stackheap;
          BX R0 ;//跳到__main,進(jìn)入C的世界
          ENDP ;過(guò)程的結(jié)束
          ALIGN
          ; User Initial Stack & Heap
          IF :DEF:__MICROLIB ;//如果使用micro lib,micro lib 描述見(jiàn)armlib.chm

          EXPORT __heap_base
          EXPORT __heap_limit ;//只導(dǎo)出幾個(gè)定義

          ELSE ;//如果使用默認(rèn)C運(yùn)行時(shí)庫(kù)

          IMPORT __use_two_region_memory
          EXPORT __user_initial_stackheap
          __user_initial_stackheap ;//則進(jìn)行堆棧和堆的賦值,在__main函數(shù)執(zhí)行過(guò)程中調(diào)用。
          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 ;//OK ,完了

          本文引用地址:http://www.ex-cimer.com/article/201612/325049.htm

          http://blog.csdn.net/chehlcy/archive/2010/01/09/5164472.aspx

          http://files.ourdev.cn/bbs_upload134190/files_11/ourdev_495775.txt

          ======================================================================

          Reset_Handler PROC
          EXPORT Reset_Handler [WEAK]
          IMPORT __main
          LDR R0, =__main
          BX R0
          ENDP
          這段代碼什么意思。
          有2個(gè)地方不理解
          一:PROC ENDP
          二: [WEAK] 什么意思

          -------------------------------------------------------------------------------

          一:PROC為子程序開(kāi)始,ENDP為子程序結(jié)束
          二:[weak]的意思就是弱。
          怎么弱呢?如果你在其他地方寫(xiě)一個(gè)同名函數(shù),比如Reset_handler, 你寫(xiě)的這個(gè)函數(shù)就可以取代它這個(gè)函數(shù)了。


          語(yǔ)法格式:
          EXPORT 標(biāo)號(hào) {[WEAK]}
          EXPORT 偽指令用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。標(biāo)號(hào)在程序中區(qū)分大小寫(xiě), [WEAK] 選項(xiàng)聲明其他的同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。
          使用示例:
          AREA Init , CODE , READONLY
          EXPORT Stest ;聲明一個(gè)可全局引用的標(biāo)號(hào)Stest……
          END



          關(guān)鍵詞: STM32arm匯編啟動(dòng)代

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();