加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

又是編譯器的鍋?全局變量怎么就從棧里取數(shù)據(jù)了?!

2023/12/31
1811
閱讀需 3 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來(lái)源:公眾號(hào)【魚(yú)鷹談單片機(jī)】,ID :emOsprey

一個(gè)學(xué)員項(xiàng)目上需要完成app升級(jí)功能,但是跳轉(zhuǎn)后直接 hardfault,項(xiàng)目緊急,只能找上魚(yú)鷹加急處理(課程福利)。

這種問(wèn)題我都是比較自信的,M0+ 內(nèi)核,感覺(jué)問(wèn)題不大,只是沒(méi)想到學(xué)員公司保密性比較強(qiáng),不能遠(yuǎn)程控制電腦,只能微信視頻進(jìn)行指導(dǎo)調(diào)試,折騰許久,才最終定位跳轉(zhuǎn)地址出現(xiàn)問(wèn)題。

static ?uint32_t jmp_app;

static uint32_t jmp_stack;

jmp_app = xx

jmp_stack = xxx

關(guān)閉中斷

__ISB();

__DMB();

設(shè)置中斷向量表

設(shè)置 msp 和 psp 棧

((void (*)(void))jmp_app)();

代碼類(lèi)似如上,但是很奇怪的是,執(zhí)行最后一條代碼時(shí),會(huì)從棧中取jmp_app的值(通過(guò)匯編分析),導(dǎo)致最終跳轉(zhuǎn)地址異常而hardfault,這個(gè)變量明明是靜態(tài)全局變量,而且同樣的代碼在stm32沒(méi)有問(wèn)題。

全局變量數(shù)據(jù)從棧里面取,怎么都不符合常理,要么優(yōu)化后從寄存器取,要么從ram中取才對(duì),沒(méi)聽(tīng)說(shuō)過(guò)要通過(guò)棧取數(shù)據(jù)(難道是前面設(shè)置棧的操作導(dǎo)致?)。

這個(gè)問(wèn)題最終由學(xué)員發(fā)現(xiàn)是編譯器的鍋,用-O0 compiler6可以穩(wěn)定出錯(cuò),compile5沒(méi)問(wèn)題,之前看一篇硬漢的文章說(shuō)ac6在O0處理復(fù)雜宏時(shí)會(huì)產(chǎn)生大量的棧,O1沒(méi)問(wèn)題,才知道編譯器也不可盡信,匯編也需要懂,否則出現(xiàn)類(lèi)似問(wèn)題根本無(wú)法解決,不知道各位道友是否有遇到類(lèi)似問(wèn)題。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MX25R8035FZUIL0 1 Macronix International Co Ltd Flash, 2MX4, PDSO8, USON-8
暫無(wú)數(shù)據(jù) 查看
APT1608SECK/J3-PRV 1 Kingbright LED RED CLEAR 0603 SMD
$0.53 查看
88E1512-A0-NNP2C000 1 Marvell Technology Group Ltd Ethernet Transceiver, QFN-56
暫無(wú)數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

六年開(kāi)發(fā)經(jīng)驗(yàn),豐富的KEIL調(diào)試經(jīng)驗(yàn),STM32使用經(jīng)驗(yàn),C語(yǔ)言運(yùn)用經(jīng)驗(yàn)。