这里是一篇关于 FreeRTOS 学习记录(1):任务创建及任务间通信 的详细讲解示例文案,你可以直接用于博客、笔记或视频脚本👇


🧠 FreeRTOS学习记录(1):任务创建及任务间如何通信

FreeRTOS 是一个轻量级的实时操作系统(RTOS),被广泛用于嵌入式开发中,如 STM32、ESP32、ARM Cortex-M 等平台。本篇文章主要介绍 FreeRTOS 的核心:任务(Task)创建任务间通信(Task Communication)


一、任务(Task)的概念

在 FreeRTOS 中,每个任务相当于一个独立运行的函数。
系统通过时间片轮转(或优先级调度)机制在多个任务之间切换执行,达到“并行”的效果。

一个任务一般定义为:

void vTaskFunction(void *pvParameters)
{
    for(;;)
    {
        // 任务的主要逻辑
        printf("Hello FreeRTOS!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);  // 延时1秒
    }
}


二、任务的创建与启动

使用 xTaskCreate() 函数来创建任务:

xTaskCreate(
    vTaskFunction,    // 任务函数
    "TaskA",          // 任务名(调试用)
    128,              // 栈大小(字)
    NULL,             // 传入参数
    2,                // 优先级(数值越大优先级越高)
    NULL              // 任务句柄
);

创建完任务后,需要调用 vTaskStartScheduler() 来启动调度器,否则任务不会运行。

int main(void)
{
    xTaskCreate(vTaskFunction, "TaskA", 128, NULL, 2, NULL);
    vTaskStartScheduler();
    for(;;);  // 一般不会执行到这里
}


三、任务间通信机制

在嵌入式系统中,任务之间经常需要交换数据或信号。
FreeRTOS 提供了多种通信方式:

通信方式特点
队列(Queue)最常用的通信机制,可传递数据(如结构体、数值等)
信号量(Semaphore)控制任务同步(例如中断通知任务)
互斥量(Mutex)用于共享资源的访问保护
事件标志组(Event Group)管理多个任务的事件同步
消息队列(Message Buffer / Stream Buffer)用于字节流传输,如UART数据

✅ 示例:使用队列通信

任务1(发送者):

xQueueHandle xQueue;

void vSenderTask(void *pvParameters)
{
    int count = 0;
    for(;;)
    {
        xQueueSend(xQueue, &count, portMAX_DELAY);
        count++;
        vTaskDelay(500 / portTICK_PERIOD_MS);
    }
}

任务2(接收者):

void vReceiverTask(void *pvParameters)
{
    int received;
    for(;;)
    {
        if(xQueueReceive(xQueue, &received, portMAX_DELAY))
        {
            printf("Received: %d\n", received);
        }
    }
}

创建队列与任务:

int main(void)
{
    xQueue = xQueueCreate(5, sizeof(int));
    xTaskCreate(vSenderTask, "Sender", 128, NULL, 2, NULL);
    xTaskCreate(vReceiverTask, "Receiver", 128, NULL, 2, NULL);
    vTaskStartScheduler();
}


四、调度与优先级注意事项

  • FreeRTOS 调度器支持 抢占式协作式 模式;
  • 优先级高的任务会“抢占”低优先级任务;
  • 若多个任务优先级相同,则按时间片轮转执行。

📚 参考资料