新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 arm匯編(thumb-2指令集)啟動代碼分析

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

        作者: 時間:2016-12-02 來源:網絡 收藏
        ;// Stack Configuration
        ;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;//

        Stack_Size EQU 0x00000200 ;//定義堆棧大小
        AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定義一個數據段 按8字節對齊 ;AREA 偽指令用于定義一個代碼段或數據段 NOINIT:指定此數據段僅僅保留了內存單元,而沒有將各初始值寫入內存單元,或者將各個內存單元值初始化為0
        Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆棧空間 分 配連續 Stack_Size 字節的存儲單元并初始化為 0
        __initial_sp ;//標號,代表堆棧頂部地址,后面有用
        ;// Heap Configuration
        ;// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;//

        Heap_Size EQU 0x00000020 ;//定義堆空間大小
        AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定義一個數據段,8字節對齊
        __heap_base
        Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空間
        __heap_limit ;//標號,代表堆末尾地址,后面有用
        PRESERVE8 ;//指示編譯器8字節對齊
        THUMB ;//指示編譯器為THUMB指令
        ; Vector Table Mapped to Address 0 at Reset
        AREA RESET, DATA, READONLY ;//定義只讀數據段,其實放在CODE區,位于0地址

        EXTERN NMIException
        EXTERN HardFaultException
        EXTERN MemManageException
        EXTERN BusFaultException
        EXTERN UsageFaultException
        EXTERN SVCHandler
        EXTERN DebugMonitor
        EXTERN PendSVC
        EXTERN SysTickHandler ;//聲明這些符號在外部定義,同C
        ;//在××it.c中實現這些函數 ,中斷就能自動調用了
        EXPORT __Vectors
        EXPORT __initial_sp ;EXPORT:在程序中聲明一個全局的標號__Vectors,該標號可在其他的文件中引用;IMPORT:偽指令用于通知編譯器要使用的標號在其他的源文件中定義, ;但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中
        __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 //一大堆的異常處理函數地址
        ; 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 ;過程的開始

        ;//Rset_Handler的實現 利用PROC、ENDP這一對偽指令把程序段分為若干個過程,使程序的結構加清晰
        EXPORT Reset_Handler [WEAK] ;//在外部沒有定義該符號時導出該符號,見HELP中[WEAK]
        IMPORT __main ;//導入符號,__main為 運行時庫提供的函數;完成堆棧,堆的初始話
        LDR R0, =__main ;//等工作,會調用下面定義的__user_initial_stackheap;
        BX R0 ;//跳到__main,進入C的世界
        ENDP ;過程的結束
        ALIGN
        ; User Initial Stack & Heap
        IF :DEF:__MICROLIB ;//如果使用micro lib,micro lib 描述見armlib.chm

        EXPORT __heap_base
        EXPORT __heap_limit ;//只導出幾個定義

        ELSE ;//如果使用默認C運行時庫

        IMPORT __use_two_region_memory
        EXPORT __user_initial_stackheap
        __user_initial_stackheap ;//則進行堆棧和堆的賦值,在__main函數執行過程中調用。
        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.104case.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個地方不理解
        一:PROC ENDP
        二: [WEAK] 什么意思

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

        一:PROC為子程序開始,ENDP為子程序結束
        二:[weak]的意思就是弱。
        怎么弱呢?如果你在其他地方寫一個同名函數,比如Reset_handler, 你寫的這個函數就可以取代它這個函數了。


        語法格式:
        EXPORT 標號 {[WEAK]}
        EXPORT 偽指令用于在程序中聲明一個全局的標號,該標號可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。標號在程序中區分大小寫, [WEAK] 選項聲明其他的同名標號優先于該標號被引用。
        使用示例:
        AREA Init , CODE , READONLY
        EXPORT Stest ;聲明一個可全局引用的標號Stest……
        END



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴中市| 天全县| 资溪县| 双城市| 衡东县| 芮城县| 泸州市| 班戈县| 荔波县| 沧州市| 石阡县| 达州市| 尼木县| 双江| 社旗县| 米脂县| 新津县| 平度市| 桃江县| 庆安县| 台南市| 河池市| 唐河县| 乌鲁木齐市| 驻马店市| 武宁县| 比如县| 肥东县| 中卫市| 莱西市| 都匀市| 辽阳市| 泰和县| 图木舒克市| 聊城市| 醴陵市| 麻江县| 天全县| 平江县| 建始县| 高安市|