色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

本跳轉程序靠bug運行,請不要優化

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2023-07-11 14:59 ? 次閱讀

絕大多數產品開發,軟件一般都會設計成 boot + app 的形式,這是方便后續軟件更新,否則更新會變成一個很麻煩的事情。

網上隨處可見的跳轉程序大概如下:

#define APP_START_ADDR          0x08040000 


voidjump2app()
{
typedefvoid(*func_app_start)(void);
   
__disable_irq();

func_app_start app_start=(func_app_start)(*(__IOuint32_t*)(APP_START_ADDR+4));
  
__set_MSP(*(__IOuint32_t*)(APP_START_ADDR));//設置棧頂地址


app_start();
}

大多數情況下,該程序跳轉正常,但當你改變了編譯器優化級別時,可能直接就 hardfault 了。

此時你會莫名其妙,為什么???

從魚鷹18接觸到 boot 知識以來,都覺得這樣的跳轉程序理所當然,并且也沒出現過問題,直到最近修改了優化級別,發現程序直接hardfault 了,根本沒跳轉到 app 中,才發現了這里隱藏的 bug。

調試發現,app_start 這個函數指針變成了異常值,但魚鷹查看0x08040000 處的內存空間值是正常的。那只能是代碼問題了。

因此結合匯編和在線調試,終于發現,執行__set_MSP 這條語句前app_start 的值是正常的,執行后,這個值就異常了。

再結合 C 語言關于棧、局部變量的知識,立刻就知道是因為重新設置棧頂地址,但匯編代碼不變,但是從新棧位置偏移取函數地址,因此跳轉失敗。

如:

15bee072-1f9c-11ee-962d-dac502259ad0.png

新棧的位置,變量的值是未知的,用它進行跳轉,失敗是必然的。

但是為什么大部分情況下程序沒有問題呢?

這是因為跳轉程序很簡單,局部變量少,那么這個app_start 局部變量編譯器可能就不會從棧中分配,而直接用一個寄存器存儲數據,而寄存器是不受棧頂位置影響的,自然程序能跳轉了。

但我們不能讓程序運行正常與否由編譯器隨機決定,因此我們要避免這個 bug,讓程序不管在何種優化級別、函數多復雜的情況下,依然可以正常運行,因此還是有必要進行優化的。

最簡單的方法,就是把這個app_start 局部變量變成全局變量這樣變量就不會受到棧頂位置影響,自然可以避免了。

如:

#define APP_START_ADDR          0x08040000 


voidjump2app()
{
typedefvoid(*func_app_start)(void);
   
__disable_irq();

static func_app_start app_start=(func_app_start)(*(__IOuint32_t*)(APP_START_ADDR+4));
  
__set_MSP(*(__IOuint32_t*)(APP_START_ADDR));//設置棧頂地址


app_start();
}

如有更好的優化方法,歡迎留言討論。




聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120637
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62739
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28408

原文標題:本跳轉程序靠bug運行,請不要優化

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    西門子S7-1200 PLC程序控制指令:跳轉與標簽指令

    在S7-1200PLC中,程序控制指令主要包含兩部分:一是改變程序執行順序的的跳轉指令;二是程序運行過程中用于控制的指令;本節主要分享
    發表于 03-07 10:25 ?8138次閱讀

    與單片機Bug戰斗的那些經歷

    時我們可以知道是在哪一個地方。這點是相當的實用,對于無法仿真的51單片機,要了解程序內部運行的狀態和變量現在的值,就顯得很無語,簡直束手無策。那么就加入串口程序的代碼,利用串口將一些
    發表于 11-05 17:09

    與單片機Bug戰斗的那些經歷

    可以知道是在哪一個地方。這點是相當的實用,對于無法仿真的51單片機,要了解程序內部運行的狀態和變量現在的值,就顯得很無語,簡直束手無策。那么就加入串口程序的代碼,利用串口將一些重要變
    發表于 12-20 17:15

    IAP程序跳轉到APP只能運行大約2秒

    );} 問題:如果設置了" __MSR_MSP (AppSpInitVal);//設置SP.,則跳轉過去大約2秒就又回到IAP程序了;而不操作這個SP,則可以正常運行,實際上就是在IAP與APP同時
    發表于 03-14 08:05

    關于程序跳轉的問題如何解決

    你好,我是一個初學者,有個問題想問一下就是關于DSP6747的在FLASH的0地址處加載一個AIS格式的bin文件,在這個程序讀到RAM中運行的時候,我想讓DSP跳轉到另一個程序入口處
    發表于 05-22 14:49

    為了心愛的本本,不要吸煙

    為了心愛的本本,不要吸煙  問題:鍵盤里有很多煙灰,請問如何拆下,該如何清洗,工具哪有買,最好詳細點,謝謝。我用的是COMPAQ的X1000   回答:
    發表于 01-25 13:04 ?391次閱讀

    mcu 程序運行速度優化

    測試發現1000多個數據累加差不多1ms.測試發現每次都跳轉,跳轉太多,嘗試在循環中重復寫一次,這樣就少了一半的跳轉,測試發現時間減少了很多。m0 不帶除法指令 沒有浮點數單元。
    發表于 10-28 09:51 ?7次下載
    mcu <b class='flag-5'>程序</b><b class='flag-5'>運行</b>速度<b class='flag-5'>優化</b>

    ---GD32F450---bootloader跳轉到app無法運行

    問題描述:bootloader和app程序都能單獨正常運行,但是在使用bootloader進行跳轉時,程序跑飛。原因:bootloader在運行
    發表于 12-02 14:36 ?16次下載
    ---GD32F450---bootloader<b class='flag-5'>跳轉</b>到app無法<b class='flag-5'>運行</b>

    KEIL上跳轉程序的起始地址(未完成)

    //有任何想法,務必評論,共同進步一、keil設置二、程序設置內存上面做跳轉,定義一個在此地址之后的量(數組函數都可以)三、程序起始運行
    發表于 12-03 09:06 ?12次下載
    KEIL上<b class='flag-5'>跳轉</b><b class='flag-5'>程序</b>的起始地址(未完成)

    STM32 IAP - Boot跳轉到APP

    簡單IAP設計思路:單片機上電首先運行BootLoader程序; Bootloader如果檢測到需要更新APP,則首先進行更新,更新完成后跳轉到APP并運行; Bootloader如果
    發表于 12-03 14:21 ?12次下載
    STM32 IAP - Boot<b class='flag-5'>跳轉</b>到APP

    【單片機程序和RAM】程序在RAM中調試的運行方式&程序固化后運行方式

    程序固化后運行方式: 程序開始運行后需要將RW 和ZI段搬移到RAM中去,程序下載進Flash中以后,上電后是怎樣將RW ZI斷搬移到RA
    發表于 12-03 15:21 ?4次下載
    【單片機<b class='flag-5'>程序</b>和RAM】<b class='flag-5'>程序</b>在RAM中調試的<b class='flag-5'>運行</b>方式&<b class='flag-5'>程序</b>固化后<b class='flag-5'>運行</b>方式

    BL(B)和LDR跳轉范圍是如何規定的

    ??LDR和BL在啟動程序中,都是可以負責pc跳轉的指令。 ??BL是地址無關指令,即和當前的運行地址無關。鏈接器腳本中標明了一個運行地址,但是arm中的代碼實際是從地址0開始
    的頭像 發表于 07-03 10:29 ?2420次閱讀

    SCL用GOTO語句執行程序跳轉

    用GOTO語句能夠執行程序跳轉。此引起立即跳轉到指定標號,為此而到同塊中不同的語句。
    的頭像 發表于 02-01 09:22 ?2654次閱讀

    AN040 IAP程序跳轉說明

    AN040 IAP程序跳轉說明
    發表于 02-23 19:11 ?0次下載
    AN040 IAP<b class='flag-5'>程序</b><b class='flag-5'>跳轉</b>說明

    PLC的條件跳轉、子程序調用等

    當我們按下X000后,程序跳轉指令開始運行,程序跳轉的位置為程序指針所在的位置,也就是標號10
    的頭像 發表于 06-07 14:46 ?1315次閱讀
    PLC的條件<b class='flag-5'>跳轉</b>、子<b class='flag-5'>程序</b>調用等
    主站蜘蛛池模板: 亚洲AV一宅男色影视| 日本久久网站| 国产AV亚洲国产AV麻豆| av网站视频在线观看| 在线观看中文字幕国产| 亚洲精品视频免费| 亚洲成 人a影院青久在线观看| 入禽太深免费观看| 日韩无码在线| 日本无码欧美激情在线视频| 青青草原91| 人人爽久久久噜噜噜丁香AV| 飘雪在线观看免费完整版| 欧美高清 videos sexo| 欧美成人无码A区在线观看免费 | 亚洲三级黄色| 亚洲三级精品| 影音先锋电影资源av| 在线天天看片免费视频观看| 在线国产视频观看| 综合亚洲桃色第一影院| 97精品国产亚洲AV高清| 99热在线观看| 成年人在线视频免费观看 | 欧美精品成人a多人在线观看| 免费人成在线观看网站视频| 年轻的女职工在线观看| 欧美日韩另类在线观看视频| 人妻中文字幕无码系列| 涩涩网站在线看| 无码国产欧美日韩精品| 亚洲精品免费观看| 用快播看av的网站| 99精品视频一区在线视频免费观看 | 中文字幕不卡一区二区三区| 99久久免费看国产精品| 趁老师睡着吃她的奶水| 国产互换后人妻的疯狂VIDEO| 国产一区二区三区乱码在线观看| 精品日产1区2卡三卡麻豆| 美女PK精子小游戏|