來源:公眾號【魚鷹談單片機】,ID :emOsprey
一個學員項目上需要完成app升級功能,但是跳轉后直接 hardfault,項目緊急,只能找上魚鷹加急處理(課程福利)。
這種問題我都是比較自信的,M0+ 內核,感覺問題不大,只是沒想到學員公司保密性比較強,不能遠程控制電腦,只能微信視頻進行指導調試,折騰許久,才最終定位跳轉地址出現問題。
static ?uint32_t jmp_app;
static uint32_t jmp_stack;
jmp_app = xx
jmp_stack = xxx
關閉中斷
__ISB();
__DMB();
設置中斷向量表
設置 msp 和 psp 棧
((void (*)(void))jmp_app)();
代碼類似如上,但是很奇怪的是,執(zhí)行最后一條代碼時,會從棧中取jmp_app的值(通過匯編分析),導致最終跳轉地址異常而hardfault,這個變量明明是靜態(tài)全局變量,而且同樣的代碼在stm32沒有問題。
全局變量數據從棧里面取,怎么都不符合常理,要么優(yōu)化后從寄存器取,要么從ram中取才對,沒聽說過要通過棧取數據(難道是前面設置棧的操作導致?)。
這個問題最終由學員發(fā)現是編譯器的鍋,用-O0 compiler6可以穩(wěn)定出錯,compile5沒問題,之前看一篇硬漢的文章說ac6在O0處理復雜宏時會產生大量的棧,O1沒問題,才知道編譯器也不可盡信,匯編也需要懂,否則出現類似問題根本無法解決,不知道各位道友是否有遇到類似問題。