新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32啟動代碼分析問題

        STM32啟動代碼分析問題

        作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
        能否講解一下startup_stm32f10x_cl.s啟動代碼含義,謝謝!


        我現(xiàn)在看反匯編如下
        0x08000000 0678 LSLS r0,r7,#25(查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端緣故)

        本文引用地址:http://www.104case.com/article/201611/317731.htm

        0x08000002 2000 MOVS r0,#0x00
        0x08000004 1105 ASRS r5,r0,#408
        0x08000006 0800 LSRS r0,r0,#00A
        。。。。。。。。。。。。。。。。。。。。。。

        上面應(yīng)該對應(yīng)
        __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



        0x08001104 4808 LDR r0,[pc,#32];程序一運行跳到這里,why?
        0x08001106 4700 BX r0,r0,#0

        上面對應(yīng)
        Reset_Handler PROC
        EXPORTReset_Handler [WEAK]
        IMPORT__main
        LDR R0, =__main
        BX R0
        ENDP

        那位能說一下為什么跳到0x08001104,即PC =0x08001104, 我想應(yīng)該PC應(yīng)該先跳到0x08000000?

        解答:

        cortex-M3和ARM9的架構(gòu)有很大區(qū)別,ARM7、ARM9在復(fù)位后是從地址0處開始執(zhí)行指令,也就是說地址0x00000000的內(nèi)容是指令。而cortex-M3的異常向量表中的內(nèi)容并不是指令,0x00000000處(當(dāng)然也可能映射到別的范圍)是主堆棧指針的數(shù)值,0x00000004的內(nèi)容是復(fù)位后需要跳轉(zhuǎn)到的地址,是一個地址而不是一條指令。

        stm32選擇flash啟動方式,中斷向量表映射到0x08000000,由樓主給出的反匯編可知,復(fù)位后主堆棧指針的位置是0x20000678,0x08000004位置的數(shù)值是0x08001105,由于cortex-M3只能運行在thumb2狀態(tài),所以要保證向PC(R15)寫入的數(shù)值的bit0必須是1(如果向PC寫入的數(shù)值的bit0是0,則處理器認為試圖切入ARM狀態(tài),會產(chǎn)生fault),而實際上stm32的指令是半字對齊的,所以復(fù)位后會跳轉(zhuǎn)到0x08001104.



        關(guān)鍵詞: STM32啟動代碼分析問

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 敦煌市| 同心县| 绿春县| 大洼县| 兴和县| 舒城县| 华蓥市| 龙泉市| 高要市| 桐梓县| 冀州市| 徐水县| 桐庐县| 淮滨县| 张家界市| 吉隆县| 汉源县| 蓬溪县| 昌吉市| 台南市| 曲沃县| 饶阳县| 类乌齐县| 江门市| 霞浦县| 海淀区| 砚山县| 仙居县| 天水市| 永川市| 林口县| 太仆寺旗| 高唐县| 横山县| 沽源县| 沾化县| 永城市| 来凤县| 吉木萨尔县| 凤阳县| 临邑县|