FreeRTOS筆記(二)移植STM32F407
文章目錄
上一文連結:FreeRTOS筆記(一)概念
01 - 下載FreeRTOS
進入官網中下載,小白選擇的是V9.0.0,作為學習而言其實版本差別不大,選擇這個版本的原因是小白看的書是這個版本的。
執行exe檔案,得到解壓包,原始碼就在FreeRTOS\Source目錄下。FreeRTOS-Plus是一些擴充套件功能,暫時不需要理會。
02 - 移植STM32F407
在keil5下新建一個標準庫工程,工程檔案中新建FreeRTOS資料夾,把FreeRTOS\Source目錄下的所有檔案都複製到工程中的FreeRTOS。
FreeRTOS的執行之前需要一些系統配置,配置檔案可以自己建立,但是官方給出了例程,直接在例程中複製,因為是移植到STMF4,所以在Demo中找對應的架構,把FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h檔案,複製新建工程的FreeRTOS/include中,這個標頭檔案暫時不需要修改。
keil5工程中新建兩個組FreeRTOS_CORE(存放核心原始碼 )和FreeRTOS_PRETABLE(存放記憶體管理檔案和硬體相關配置檔案)
- Group
-
FreeRTOS_CORE:FreeRTOS\Source下的c和h檔案,include和 portable資料夾除外
-
FreeRTOS_PRETABLE:FreeRTOS\Source\portable\MemMang\heap_4.c和FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c
然後編譯,0 error,0 warning,工程準備成功。
03 - LED燈閃爍實驗
驗證移植是否成功,做一個最簡單的LED燈閃爍實驗,只有一個任務start,任務開始後就閃爍LED燈。
新建test.h和test.c檔案,把LED燈實驗原始碼複製到工程中,根據FreeRTOS\Demo\CORTEX_STM32F103_Keil的範例,能夠知道任務是如何建立、執行的。於是test.h程式碼如下:
#ifndef _TASK_TEST_H_
#define _TASK_TEST_H_
#include "FreeRTOS.h"
#include "task.h"
/* Start 任務 */
#define START_TASK_PRIO 1 //優先順序
#define STATR_STACK_SIZE 128 //堆疊大小
extern TaskHandle_t StartTask_Handler; //任務控制代碼
void start_task(void *pParam); //任務函式
#endif
而test.c中定義控制代碼並定義函式
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "task_test.h"
TaskHandle_t StartTask_Handler; //任務控制代碼
/* Start 任務 */
void start_task(void *pParam)
{
for(;;)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
vTaskDelay(200);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
vTaskDelay(200);
}
}
main函式則建立任務,開啟排程器。
#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"
#include "task_test.h"
int main(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_Init();
xTaskCreate( (TaskFunction_t)start_task,
(const char*)"start_task",
(uint16_t)STATR_STACK_SIZE,
(void*)NULL,
(UBaseType_t)START_TASK_PRIO,
(TaskHandle_t*)&StartTask_Handler
);
vTaskStartScheduler();
while(1);
}
編譯下載,LED燈閃爍,移植成功。
04 - 總結
- FreeRTOS是一個開源又免費的嵌入式實時作業系統
- FreeRTOS已經被移植到各個重要平臺比如ARM、Linux、Window等等
- FreeRTOS官方有非常多的Demo提供移植參考