0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32四行【跳轉(zhuǎn)程序】 引申出來的幾條重要知識點(diǎn)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-08 11:37 ? 次閱讀

本文分享以下幾點(diǎn)(引申出來的)重要知識點(diǎn):

1.STM32是如何實(shí)現(xiàn)程序跳轉(zhuǎn)的?

2.復(fù)位向量表

3.理解__set_MSP語句

關(guān)鍵字幫助

堆棧指針SP

控制寄存器CONTROL

1寫在前面

上一篇文章《STM32 IAP應(yīng)用編程幾個要點(diǎn)》講述的內(nèi)容很多朋友都了解過,也都使用過ST官網(wǎng)提供的代碼。但使用過的人有許多都沒有深入了解,僅僅只是把代碼下載到板卡中跑了一下而已(因?yàn)榇a完全可以使用)。所以,很少有人研究其中細(xì)節(jié)的問題。

o4YBAF4WkDiAaA_DAAE1AZgFFc4227.png

先看一下上圖中四行跳轉(zhuǎn)代碼,接下來將圍繞這四行代碼拓展相關(guān)的內(nèi)容。

2STM32是如何實(shí)現(xiàn)程序跳轉(zhuǎn)的?

上圖四行代碼中有幾個定義沒有貼出來,下面一并貼出來:

#defineApplicationAddress0x8003000typedefvoid(*pFunction)(void);pFunction Jump_To_Application;uint32_t JumpAddress;

ApplicationAddress為0x8003000,代表應(yīng)用程序起始地址為0x8003000。

1.JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

JumpAddress代表跳轉(zhuǎn)地址,基于應(yīng)用程序起始地址偏移4(這個偏移4下面章節(jié)講述)。這個地址就是應(yīng)用程序的復(fù)位地址,你可以理解為程序跳轉(zhuǎn)到了應(yīng)用程序復(fù)位的地址。

2.Jump_To_Application = (pFunction) JumpAddress;

將跳轉(zhuǎn)地址JumpAddress強(qiáng)制轉(zhuǎn)換pFunction類型,你可以理解為編譯器將其編譯成一個函數(shù)。

3.__set_MSP(*(__IO uint32_t*) ApplicationAddress);

這里是將把應(yīng)用程序起始地址設(shè)為棧頂指針(__set_MSP下面章節(jié)講述)。

4.Jump_To_Application();

設(shè)置PC指針為復(fù)位地址,你可以理解為跳轉(zhuǎn)到應(yīng)用程序的函數(shù)。

這里是講述的大概內(nèi)容,細(xì)節(jié)內(nèi)容請往下看,看完下面細(xì)節(jié)再回來看本節(jié)內(nèi)容。

3復(fù)位向量表

上面講述了ApplicationAddress + 4“偏移4”這個問題,其實(shí)這個“偏移4”就是向量表的偏移地址:復(fù)位向量(PC 初始值)。

拿Cortex-M3(STM32F1)為例(其它M0、M4類似),Cortex-M3權(quán)威手冊(中文)表 7.6 上電后的向量表:

o4YBAF4WkDmACHqZAAE_3S5e0cY723.jpg

是什么意思呢?就是相對應(yīng)用程序存儲起始地址的一張向量表,而這張向量表就是按照這樣的約定:偏移4的地址為復(fù)位向量(PC 初始值),也就是我們應(yīng)用程序復(fù)位的地方。

同樣,可以參看啟動代碼(以STM32F1為例):

pIYBAF4WkDmAHS4pAADfgf_H53c301.jpg

這里代碼和Cortex-M3技術(shù)參考手冊數(shù)據(jù)一一對應(yīng)的關(guān)系。相信看了這兩個地方的內(nèi)容,大家能明白為什么會是ApplicationAddress + 4了。

4理解__set_MSP語句

1.拓展:MDK-ARM新功能

點(diǎn)看下圖,放大,自己看截圖代碼(標(biāo)記處):

pIYBAF4WkDqAOtLqAAC8YKTDrs0130.jpg

用MDK-ARM V5.25及以上版本打開工程,可以看到在__set_MSP下面有一行下劃線,什么意思呢?

這是MDK-ARM V5.25的新功能(現(xiàn)在,MDK-ARM V5.26就快要出來了)具有上下文幫助(F1)的關(guān)鍵字將用淺灰色下劃線突出顯示。

詳細(xì)可以參看:

http://www2.keil.com/mdk5/525

(提示:公眾號不支持外鏈接,請復(fù)制鏈接到瀏覽器下載)

這里推薦閱讀我另外兩篇文章:

1.MDK v5.25比較實(shí)用的功能

2.MDK-ARM V5.26預(yù)覽版更新的幾條重要內(nèi)容

2.理解__set_MSP語句

上面講述的內(nèi)容是想引申出來:鼠標(biāo)放在__set_MSP的位置,按F1,就可以直接進(jìn)入幫助文檔。

下面是詳細(xì)內(nèi)容截圖:

o4YBAF4WkDqALzCoAADJRZf3woc012.jpg

大概意思是:調(diào)用MSR指令設(shè)置主狀態(tài)指針(MSP)的值。

物理上存在兩個不同的堆棧指針(SP):

1.主堆棧指針(MSP),復(fù)位后的默認(rèn)堆棧指針。在運(yùn)行異常處理程序時(shí)也使用它。

2.進(jìn)程堆棧指針(PSP),只能在線程模式下使用。

當(dāng)引用R13堆棧指針(SP)時(shí),由控制寄存器(CONTROL)的Bit[1]決定:

Bit[1]=0,用MSP;

Bit[1]=1,用PSP;

這里具體內(nèi)容需要參看Cortex-M技術(shù)參考手冊。

我的另外一篇文章《如何判斷CPU是否正在執(zhí)行中斷函數(shù)》講述了關(guān)于控制寄存器(CONTROL)的一種使用方法,可以參看我那一篇文章。

5“雪白”的圖片

還是跟隨熱點(diǎn),相信大家都聽說了“關(guān)于谷歌回來的消息”,據(jù)知情人透露,谷歌回來幾乎不可能。

當(dāng)我現(xiàn)在(2018年8月9日)百度圖片輸入“雪白”的時(shí)候,已經(jīng)不在是“雪白”的圖片了,已經(jīng)被百度程序猿GG加班加點(diǎn)改掉了。

百度圖片搜索“雪白”如下圖:

谷歌圖片搜索“雪白”如下圖:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10846

    瀏覽量

    353767
  • 復(fù)位
    +關(guān)注

    關(guān)注

    0

    文章

    169

    瀏覽量

    24159
  • 控制寄存器
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    11467
收藏 人收藏

    評論

    相關(guān)推薦

    模擬電子技術(shù)知識點(diǎn)問題總結(jié)概覽

    給大家分享模擬電子技術(shù)知識點(diǎn)問題總結(jié)。
    的頭像 發(fā)表于 05-08 15:16 ?1036次閱讀
    模擬電子技術(shù)<b class='flag-5'>知識點(diǎn)</b>問題總結(jié)概覽

    一篇搞定DCS系統(tǒng)相關(guān)知識點(diǎn)

    目標(biāo)。DCS系統(tǒng)廣泛應(yīng)用于各個行業(yè),如化工、電力、制藥等。在這些行業(yè)中,DCS系統(tǒng)可以實(shí)現(xiàn)對生產(chǎn)過程的集中監(jiān)控和分散控制,提高生產(chǎn)效率和產(chǎn)品質(zhì)量,降低能耗和減少環(huán)境污染,從而保證產(chǎn)品質(zhì)量,并確保生產(chǎn)過程的安全可靠。 二.DCS系統(tǒng)知識點(diǎn)
    的頭像 發(fā)表于 03-26 18:40 ?717次閱讀
    一篇搞定DCS系統(tǒng)相關(guān)<b class='flag-5'>知識點(diǎn)</b>

    STM32L431RCT6從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader無效怎么解決?

    STM32L431RCT6 從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader 無效。 1. 跳轉(zhuǎn)代碼如下,這個代碼 可以在STM32F407VET6上正常
    發(fā)表于 03-26 07:54

    【量子計(jì)算機(jī)重構(gòu)未來 | 閱讀體驗(yàn)】第二章關(guān)鍵知識點(diǎn)

    本帖最后由 oxlm_1 于 2024-3-6 23:20 編輯 之所以將第二章單獨(dú)拿出來,是因?yàn)樵陂喿x過程中,發(fā)現(xiàn)第二章知識點(diǎn)較多,理解起來比較耗時(shí)間。 第二章的主要知識點(diǎn): 量子
    發(fā)表于 03-06 23:17

    Vim跳轉(zhuǎn)技巧

    相對跳轉(zhuǎn)用于在當(dāng)前行的基礎(chǔ)上向上或向下跳轉(zhuǎn)一定的行數(shù)??梢栽诿钅J较螺斎?num命令,其中num可以是正數(shù)、負(fù)數(shù)。例如,要向上跳轉(zhuǎn)5,可以在命令模式下輸入:+5,然后按下回車鍵即可
    的頭像 發(fā)表于 01-18 16:30 ?1043次閱讀

    淺談初級電工必備知識點(diǎn)

    對于初學(xué)電工的朋友來說,掌握一些基礎(chǔ)且實(shí)用的知識點(diǎn)是非常重要的。本文旨在分享初級電工應(yīng)該掌握的核心知識,幫助新手電工更好地入門和提升技能。
    的頭像 發(fā)表于 12-26 10:44 ?952次閱讀

    TCP協(xié)議面試常問知識點(diǎn)總結(jié)

    TCP 作為傳輸層的協(xié)議,是一個IT工程師素養(yǎng)的體現(xiàn),也是面試中經(jīng)常被問到的知識點(diǎn)。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。
    的頭像 發(fā)表于 12-15 10:38 ?710次閱讀
    TCP協(xié)議面試常問<b class='flag-5'>知識點(diǎn)</b>總結(jié)

    開關(guān)模式下的電源電流如何檢測?這12個電路&amp;10個知識點(diǎn)講明白了

    開關(guān)模式下的電源電流如何檢測?這12個電路&10個知識點(diǎn)講明白了
    的頭像 發(fā)表于 12-06 16:04 ?712次閱讀
    開關(guān)模式下的電源電流如何檢測?這12個電路&amp;10個<b class='flag-5'>知識點(diǎn)</b>講明白了

    干貨 | 搞硬件設(shè)計(jì)不能忘記的11個知識點(diǎn)

    干貨 | 搞硬件設(shè)計(jì)不能忘記的11個知識點(diǎn) 1、不要忘記在 電源 輸入和輸出端加電容濾波通常情況,電源的輸入和輸出端的電信號是不穩(wěn)定的,直接給負(fù)載供電,長期會給負(fù)載造成損傷,也會其使工作不穩(wěn)定。而我
    發(fā)表于 11-30 15:01

    c語言程序設(shè)計(jì)基礎(chǔ)知識點(diǎn)

    程序設(shè)計(jì)的基礎(chǔ)知識點(diǎn)。 首先,我們將從C語言的數(shù)據(jù)類型和變量開始。C語言提供了多種數(shù)據(jù)類型,包括整數(shù)、浮點(diǎn)數(shù)、字符和指針等。整數(shù)類型包括int、long和short等,浮點(diǎn)數(shù)類型包括float和double等,字符類型用于存儲ASCII字符,指針類型用
    的頭像 發(fā)表于 11-27 15:25 ?1482次閱讀

    數(shù)字電位計(jì)知識點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《數(shù)字電位計(jì)知識點(diǎn).pdf》資料免費(fèi)下載
    發(fā)表于 11-24 16:08 ?7次下載
    數(shù)字電位計(jì)<b class='flag-5'>知識點(diǎn)</b>

    三菱和西門子PLC輸入接線知識點(diǎn)

    三菱和西門子PLC輸入接線知識點(diǎn)
    的頭像 發(fā)表于 11-21 10:01 ?666次閱讀
    三菱和西門子PLC輸入接線<b class='flag-5'>知識點(diǎn)</b>

    OFDM技術(shù)知識點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《OFDM技術(shù)知識點(diǎn).rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:25 ?0次下載
    OFDM技術(shù)<b class='flag-5'>知識點(diǎn)</b>

    Linux文件系統(tǒng)知識點(diǎn)詳解

    今天浩道跟大家分享關(guān)于Linux文件及目錄屬性知識點(diǎn)的硬核干貨,可以說只要你認(rèn)真看完這篇文章內(nèi)容,其相關(guān)知識點(diǎn)都不在話下,感興趣又想快速掌握的小伙伴們,可以收藏起來隨時(shí)查看!
    的頭像 發(fā)表于 11-02 09:29 ?595次閱讀
    Linux文件系統(tǒng)<b class='flag-5'>知識點(diǎn)</b>詳解

    51單片機(jī)的知識點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《51單片機(jī)的知識點(diǎn).pdf》資料免費(fèi)下載
    發(fā)表于 11-01 17:32 ?2次下載