燒錄后 Reset And Run 重啟失效
存在于 MDK ARM 5.28 之后包括 5.37 的版本. 這些版本即使勾選 Reset And Run, 在燒錄后也不會自動重啟執行
需要做以下設定
- Debug -> ST-Link Debugger -> Settings
- 切換到 Pack 標簽頁, 取消勾選 Enable
- 點擊 OK 保存

參考: https://community.arm.com/support-forums/f/keil-forum/44063/mdk-arm-5-28-problem-with-reset-and-run/159946
編譯器版本判斷失效
不能再通過__GNUC__判斷是否為 gnu arm gcc toolchain, 因為 Arm Compiler 6 默認定義了 __GNUC__ , 如果用這個做宏判斷, 會造成錯誤的代碼被編譯. 參考 CMSIS 的做法用 __ARMCC_VERSION 來判斷
#if defined __CC_ARM
// Arm Compiler 5
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
// Arm Compiler 6
#elif defined __GNUC__
// Normal GCC
或者
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
// Arm Compiler 5 or 6
#elif defined __GNUC__
// Normal GCC
#endif
關于 printf 串口輸出的 retarget
用 Arm Compiler 6 的時候, printf retarget 和 Arm Compiler 5 的做法是一樣的
int fputc(int ch, FILE *f)
{
return uartSendChar(ch);
}
int fgetc(FILE *f)
{
return uartReceiveChar();
}
選擇 Use MicroLIB 編譯報錯
如果勾選 MicroLIB 后 build 報錯:
.\Objects\xxx.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_stm32f40_41xxx.o).
.\Objects\xxxaxf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
需要重新 rebuild 一下.
具體原因查看這篇 https://chowdera.com/2022/02/202202011447342750.html
因為 keil 在你點擊編譯的時候只會編譯內容有變動的部分(指預處理后的部分). 當你選擇使用 MicroLIB 的時候, 編譯器會自動添加宏定義
__MICROLIB, 相對應的, 頭檔案中的內容就會有所改變, 導致包含了頭檔案的 .c 檔案內容改變. 而 startup 中處存在的條件匯編陳述句卻沒有得到預處理和匯編: 被拋棄的部分是堆疊的初始化處理程式, 可以看出定義了__MICROLIB宏和沒有定義時堆疊的初始化是交由不同的函式處理的. 但是編譯的時候沒改變這里的條件匯編, 結果沒有初始化的程式了, 因此報錯"符號未定義". 解決方式同樣很簡單, 點擊重新編譯即可.
編譯引數變化
Language C
使用 C99
Language C++
使用 C++03
Optimization
選擇 –Oz
如果選擇了 AC5 的默認優化等級-O0 會導致代碼執行效率低. AC6 編譯器 –O0 優化等級時, n 級條件運算式可能會產生巨大的堆疊需求. 需要調整為–O0 以外的優化等級
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/500565.html
標籤:其他
上一篇:【作業系統】記憶體分配
