这里是一篇关于 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 调度器支持 抢占式 和 协作式 模式;
- 优先级高的任务会“抢占”低优先级任务;
- 若多个任务优先级相同,则按时间片轮转执行。
📚 参考资料
- FreeRTOS 官方文档
- STM32 + FreeRTOS 教程(RTOS 实战)
- 《FreeRTOS 内核实现与应用开发实战》
发表回复