MDK ARM 5.28 之後包括 5.37 的版本. 這些版本即使勾選 Reset And Run, 在燒錄後也不會自動重啟執行 需要做以下設置 Debug -> ST-Link Debugger -> Settings 切換到 Pack 標簽頁, 取消勾選 Enable 點擊 OK 保存. 不能... ...
燒錄後 Reset And Run 重啟失效
存在於 MDK ARM 5.28 之後包括 5.37 的版本. 這些版本即使勾選 Reset And Run, 在燒錄後也不會自動重啟執行
需要做以下設置
- Debug -> ST-Link Debugger -> Settings
- 切換到 Pack 標簽頁, 取消勾選 Enable
- 點擊 OK 保存
編譯器版本判斷失效
不能再通過__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 以外的優化等級