<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        Cortex-M3 .s文啟動文件分析

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月16日   【字體:

        1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器軟件接口標準。

        2. CMSIS標準的文件結構:
        a) core_cm.c (stdint.h)
        b) system_.c (core_cm, system_)
        c) startup_.s
        其中core_cm.c以及core_cm中為內核設訪問層,其中定義了定義了內核中得外設幾丁質以及一些內核的訪問及控制函數。
        startup_.s文件是系統的啟動文件,其包括堆和棧的初始化配置、中斷向量表的配置以及將程序引導到main()函數等功能。
        system_和system_.c文件則是由ARM公司提供模版,各芯片制造商根據自己芯片的特點來編寫的。
        3. 注解startup_.s文件
        此文件主要完成三項工作:堆棧以及堆的初始化、定位中斷向量表、調用Reset Handler
        a) 堆棧以及堆的初始化
        ; Stack Configuration
        ;   Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;
        Stack_Size         EQU      0x00000200
                              AREA     STACK, NOINIT, READWRITE, ALIGN=3  
        //指明8字節對齊(ALIGN=3)

        Stack_Mem SPACE    Stack_Size
        __initial_sp       //此標號有一層隱含的意思那就是在M3中堆棧是滿遞減堆棧,
        //因為它指定了堆棧指針位于堆棧的高地址(在//Stack_Mem之后)
         
         
        ; Heap Configuration
        ;    Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;
         
        Heap_Size        EQU      0x00000000
                        AREA     HEAP, NOINIT, READWRITE, ALIGN=3
        __heap_base
        Heap_Mem        SPACE Heap_Size
        __heap_limit
        以上堆和棧的具體地址可以在工程編譯后產生的*.map文件中看到。
        b) 定位中斷向量表
        PRESERVE8   //PRESERVE8指定了以下的代碼位8字節對齊
        THUMB //THUMB指定了接下來的代碼為THUMB指令集
        ; Vector Table Mapped to Address 0 at Reset
                        AREA    RESET, DATA, READONLY   //此語句聲明RESET數據段
                        EXPORT  __Vectors
        //導出向量表標號,EXPORT作用類似于C語言中的extern
        __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     WDT_IRQHandler             ; 16: Watchdog Timer
                        DCD     TIMER0_IRQHandler          ; 17: Timer0
                        DCD     TIMER1_IRQHandler          ; 18: Timer1
                        DCD     TIMER2_IRQHandler          ; 19: Timer2
                        DCD     TIMER3_IRQHandler          ; 20: Timer3
                        DCD     UART0_IRQHandler           ; 21: UART0
         (……省略)
        c) 調用Reset Handler
        ; Reset Handler

        Reset_Handler   
        PROC
                        EXPORT  Reset_Handler             [WEAK]
                        IMPORT  SystemInit
                        IMPORT  __main
                        LDR     R0, =SystemInit
                        BLX     R0
                        LDR     R0, =__main
                        BX      R0
                        ENDP
        注釋:引導程序進入__main(此__main是C_Library中的函數,非main())
         
        d) 堆棧以及堆的初始化行為
        ; User Initial Stack & Heap
                        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
        e) ARM m3 C是怎么調用startup.s文件的?
        startup.s大部分內容不是被C調用的,而是在C程序之前運行的。m3上電之后會先從0地址處讀取MSP,然后從0x4地址處讀取復位向量,接著跳轉到復位異常服務程序Reset_Handler(這些是m3內核自動做的,不需要編程)。如果你用MDK的話,在工程設置Debug下的run to main()上的勾去掉,然后進入調試,你會發現你運行的第一句就是Reset_Handler的第一句。
        Reset_Handler就是在startup.s中定義的,它一般會對系統初始化,然后進入main函數。
        向量表也是在startup.s中定義的,至于為什么程序編譯之后向量表一定在0地址處,是因為向量表的前面會有類似AREA    RESET, CODE, READONLY的聲明。在MDK生成的分散加載文件中,RESET被設置在flash的0地址處,這樣就規定了向量表的地址。
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮