我主要用的MCU為STM32F407G-DISC1,所以分別要下載STM32 IDE與 FreeRTOS
下載網址: https://www.st.com/en/development-tools/stm32cubeide.html#get-software
因為教材比較舊+我是Win系統,所以下載的是1.0.2的Win版本的STM32 IDE
==注意:下載不同版本可能會導致後面Build 錯誤!==
下載網址: https://github.com/FreeRTOS/FreeRTOS/releases 版本是FreeRTOSv202012.00
(因為版本比較舊,所以是到Github去下載)
建立新的STM Project
選擇電路板/MCU
輸入STM32F4 DISCOVERY即可
輸入Project名稱,並選用開發的程式語言
其他設定
因為我沒有用到其他設定,所以直接Next->Finish
其他問題
是否使用預設模式初始化所有週邊設備? No
是否打開STM32CubeMx軟體的配置工具? Yes
初始化Project完成(第一次使用可能要等久一點,會自動下載相關的pkg~)
方法1: 使用STM32設計好的工具直接加入,缺點: 改用其他MCU時,不一定有這樣寫好的工具
方法2: 手動加入
回到IDE上,對FreeRTOS_Projects右鍵並選Refresh
對ThirdParty資料夾右鍵選擇Properties
確保C/C++ Build中的Exclude resource from build沒有點(就是紅色圈圈的地方不要勾)
因為FreeRTOS已經有做好的Memory管理,所以我們要停掉原本的Memory管理
紅色圈圈的地方勾起來,Apply and Close
因為僅用到Heap管理中的heap_4.c檔案,所以砍掉其他的
配置FreeRTOS head file:
將freeRTOS資料夾加入include_path中,對ThirdParty資料夾右鍵選擇Properties-> C/C++Build
->Settings ->MCU GCC Complier ->點選紅色5下方的綠色加號
再將${workspace_loc:/${ProjName}/ThirdParty/freeRTOS/include} 、${workspace_loc:/${ProjName}/ThirdParty/freeRTOS/portable/GCC/ARM_CM4F}加入
(就是點選Workspace後選到ThirdParty/freeRTOS/include&ThirdParty/freeRTOS/portable/GCC/ARM_CM4F)加入
配置FreeRTOSConfig.h文件:
路徑:
FreeRTOS的位置\FreeRTOSv202012.00\FreeRTOSv202012.00\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h
將FreeRTOSConfig.h複製到"放置Projects資料夾的位置\FreeRTOS_Projects\ThirdParty\freeRTOS"
再將freeRTOS資料夾加入include_path中,對ThirdParty資料夾右鍵選擇Properties-> C/C++Build
->Settings ->MCU GCC Complier ->點選綠色加號
將${workspace_loc:/${ProjName}/ThirdParty/freeRTOS}加入
對FreeRTOS_Projects Build Project
出現 error: 'SystemCoreClock' undeclared
打開FreeConfig.h檢查發現SystemCoreClock已經被文件system_stm32f4xx定義過了,所以需要再FreeConfig.h中修改
2.1 打開FreeConfig.h文件找到以下Code位置:
/* Ensure stdint is only used by the compiler, and not the assembler. */
#ifdef __ICCARM__
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
修改為(代表在這些編譯器下,會執行這個Code作為編譯使用)
/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined( __ICCARM__) || defined(__GNUC__) || defined(__CC_ARM)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
port.c:247: multiple definition of
SVC_Handler'
port.c:441: multiple definition ofPendSV_Handler'
port.c:495: multiple definition ofSysTick_Handler'
這三個錯誤表示重複定義了這三個Handler(FreeRTOS有定義、STM32CUBE也有定義),我們要關掉STM32定義的那個
3.1 點選FreeRTOS_Projects.ioc檔案,圈起來的地方不要勾
3.2 儲存,並Generate Code
undefined reference to
vApplicationTickHook'
undefined reference tovApplicationTickHook'
undefined reference tovApplicationStackOverflowHook'
將FreeConfig.h中的
#define configUSE_TICK_HOOK 1 => 改為0
#define configUSE_MALLOC_FAILED_HOOK 1 => 改為0
#define configCHECK_FOR_STACK_OVERFLOW 2 => 改為0
終於沒有error,編譯過了! 明天再繼續!