配置FreeRTOS
原文鏈接:https://ydamooc.github.io/posts/c9defcd/
1.1 下載FreeRTOS
-
打開FreeRTOS官網:https://www.freertos.org/
-
點擊下載,并且選擇"FreeRTOS 202212.01"版本,再點擊Download按鈕下載官方的資源包。
-
下載好資源包后,解壓到任意目錄,例如我解壓到了“G:\FreeRTOS”目錄下,由于資源包里面包含的文件較多,解壓相對會慢一點,大家需要耐心等待。
-
解壓完成后,我們打開FreeRTOS文件夾中的FreeRTOSv202212.01文件夾,打開后可以看到里面有很多文件和文件夾,其中我們要使用的是FreeRTOS文件夾中的東西。
1.2 配置相關的文件
-
隨后打開FreeRTOS文件夾,我們在這里面需要關注的是Source文件夾中的內容,以及Demo文件夾中的內容(后續會使用到其中的文件)。我們打開Source文件夾,在當前目錄下,我們需要保留這一部分的文件,其他用不到可以刪除掉。
-
接著再打開portable文件夾,在當前目錄下,我們需要保留這一部分的文件,其他用不到可以刪除掉。其中MemMang文件夾中存放的是內存管理的相關文件,RVDS文件夾中存放的各個內核相關的文件,我們這里使用的是STM32F103C8T6單片機,所以我們需要的是ARM_CM3文件夾中的內容,其他用不到可以刪除掉。
- 因為我們使用的是STM32F103C8T6單片機,在Source文件夾中還缺少FreeRTOS相關的配置文件,我們回到"FreeRTOSv202212.01\FreeRTOS"目錄下,然后打開Demo文件夾,在里面找到CORTEX_STM32F103_Keil項目打開,將里面的FreeRTOSConfig.h文件復制到前面的Source文件夾中。
-
接下來我們需要打開一個空白的STM32工程文件,本文使用的空白工程文件來自于立創開發板的地闊星STM32F103C8T6資料中的空白工程模板,大家可以自行點擊下載地闊星資料。當然使用別的空白工程模板也是可以的,只要能正常編譯即可。
-
下載解壓后,打開第03章【立創·STM32F103C8T6開發板】軟件資料中的空白工程模板文件夾,然后將里面的STM32F103C8T6_ProjectTemplate.zip解壓到任意目錄下,解壓完成后,將名字修改成FreeRTOS_ProjectTemplate,方便后續操作。
-
接著在FreeRTOS_ProjectTemplate中創建一個名為FreeRTOS的文件夾,然后回到"FreeRTOSv202212.01\FreeRTOS\Source"目錄下,將前面我們保留的Source文件夾中的內容復制到FreeRTOS_ProjectTemplate中的FreeRTOS文件夾中。
1.3 配置Keil中的STM32代碼
-
在FreeRTOS_ProjectTemplate中,根據下面路徑,打開項目。打開后,我們先編譯一次項目。
-
接著我們為項目創建文件夾,分別為FreeRTOS_CORE和FreeRTOS_PORT,然后根據下圖,將相關的文件添加進這兩個文件夾中。
-
添加完文件之后,打開魔術棒,然后點擊C/C++選項卡,將FreeRTOS文件夾中的.h路徑添加進去。
-
由于需要對stm32f10x_it.c文件進行修改,而在項目中是沒有添加進去的,我們需要手動添加一下,該文件所在路徑是FreeRTOS_ProjectTemplate\module,所以我們在左側右鍵MODULE文件夾,然后選擇Add Files to Group ‘MODULE’,然后選擇stm32f10x_it.c文件添加進去。添加完之后需要編譯一下,確保沒有問題。
-
接著在左側打開FreeRTOS_CORE文件夾,打開FreeRTOSConfig.h文件,在第49行處,將原來的171024修改成101024。
-
在FreeRTOSConfig.h文件中的最一行前添加上必要的中斷聲明。
#define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
-
在stm32f10x_it.c文件中,找到SVC_Handler函數、PendSV_Handler函數和SysTick_Handler函數,將原來的代碼注釋掉,并且在main.c中添加上頭文件,然后編譯。
1.4 對配置好的工程進行測試
-
在main.c文件開頭創建一個任務句柄,并且創建一個任務函數,任務函數的形參必須為void*類型。創建完成后在函數里面寫上以下代碼。
void myTask(void* pv) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOC,GPIO_Pin_13);while(1){GPIO_SetBits(GPIOC, GPIO_Pin_13);vTaskDelay(1000);GPIO_ResetBits(GPIOC, GPIO_Pin_13);vTaskDelay(1000);} }
-
在main函數中,創建任務,并且啟動調度器,代碼修改如下。
int main(void) {board_init();xTaskCreate(myTask, "myTask", 1024, NULL, 2, &myTaskHandler);vTaskStartScheduler();while(1){} }
-
編譯通過后,將程序下載到開發板中,可以看到LED燈每隔1秒閃爍一次,至此說明FreeRTOS相關的配置已經配置完成。