建立個人FreeRTOS開發模板基礎架構
前言
在開始建立FreeRTOS工程專案前,都有一些固定的常規代碼操作而記錄這些代碼,這不僅能夠加速後續專案的開發,還能確保代碼品質和一致性,經過一些專案經驗,我整理出了個人常用FreeRTOS模板的建置操作。
核心模板實現
📝 1. 主程式架構 (main.c)
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "user_task.h"
int main() {
//create start task
BaseType_t result = xTaskCreate(
(TaskFunction_t)start_task,
(const char*)"start_task",
(uint16_t)START_STK_SIZE,
(void*)NULL,
(UBaseType_t)START_TASK_PRIO,
(TaskHandle_t*)&StartTask_Handler
);
// error check
if(result == pdPASS) {
printf("start_task created successfully\n");
vTaskStartScheduler();
} else {
printf("ERROR: start_task creation failed\n");
while(1); // stop system
}
while(1);
return 0;
}
🛠️ **2. 任務管理架構 **
頭文件設計 (user_task.h)
#ifndef SRC_USER_TASK_H_
#define SRC_USER_TASK_H_
#include "FreeRTOS.h"
#include "task.h"
// task priority
#define START_TASK_PRIO 1
#define FUNCTION_TASK_PRIO 2
// stack size
#define START_STK_SIZE 256
#define FUNCTION_STK_SIZE 1024
// task handle declare (use extern)
extern TaskHandle_t StartTask_Handler;
extern TaskHandle_t function_Task_handler;
// function declare
void start_task(void);
void function_task(void);
#endif
實現文件架構 (user_task.c)
#include "user_task.h"
#include "function.h"
// global variable define (actual memory allocation)
TaskHandle_t StartTask_Handler;
TaskHandle_t function_Task_handler;
void start_task() {
taskENTER_CRITICAL();
// create function task
BaseType_t result = xTaskCreate(
(TaskFunction_t)function_task,
(const char*)"print_hello_task",
(uint16_t)FUNCTION_STK_SIZE,
(void*)NULL,
(UBaseType_t)FUNCTION_TASK_PRIO,
(TaskHandle_t*)&function_Task_handler
);
// error check
if(result == pdPASS) {
printf("function_task created successfully\n");
} else {
printf("ERROR: function_task creation failed\n");
while(1);
}
taskEXIT_CRITICAL();
vTaskDelete(StartTask_Handler); // delete start task
}
🔧 **3. 功能模組架構 **
模組頭文件 (function.h)
#ifndef SRC_FUNCTION_H_
#define SRC_FUNCTION_H_
void function_task(void);
#endif
模組實現 (function.c)
#include <stdio.h>
#include "FreeRTOS.h"
#include "function.h"
void function_task() {
int count = 0;
while(1) {
printf("hello %d\n", count++);
vTaskDelay(100);
}
}
總結
這個FreeRTOS模板為我後續的專案開發提供了基礎,每當我開始新專案時,都能基於這個模板快速建立穩定的系統架構,然後專注於具體功能的實現。