1 min read

建立個人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模板為我後續的專案開發提供了基礎,每當我開始新專案時,都能基於這個模板快速建立穩定的系統架構,然後專注於具體功能的實現。