Freertos学习第一篇-总体概述
目录
- 1、基础概念
- 1.1、FreeRTOS概念
- 2、模块学习
- 2.1、任务
- 2.2、调度(Scheduling)
- 2.3、任务间通讯
- 2.4、时间管理
- 2.5、内存管理
- 3、各模块串联逻辑
- 3.1、任务创建与调度
- 3.2、任务间通讯
- 3.3、时间管理
- 3.4、内存管理
- 4、示例代码
- 4.1、代码说明
- 5、学习路线建议
- 6、结语
1、基础概念
1.1、FreeRTOS概念
FreeRTOS是一个实时操作系统(RTOS),专为嵌入式系统设计,提供多任务管理、任务调度、时间管理、和资源管理等功能。它是开源的,支持多种微控制器和处理器架构。
2、模块学习
2.1、任务
- 创建/删除任务:使用xTaskCreate()创建任务;
xTaskCreate(TaskFunction, "Name", StackSize, Params, Priority, &Handle);//创建任务
vTaskDelay(pdMS_TO_TICKS(ms)); // 阻塞任务
vTaskDelete(TaskHandle); //删除任务
注意:优先级数值越大越高,Priority(configMAX_PRIORITIES) 定义最大优先级数。
- 任务状态:就绪、运行、阻塞、挂起;
- 任务优先级:设置和获取任务优先级;
2.2、调度(Scheduling)
- 调度算法:基于优先级的抢占式调度;
- 时间片轮转:在相同优先级任务之间进行时间片分配;
2.3、任务间通讯
- 队列(Queue):用于任务键传递消息;
QueueHandle_t xQueueCreate(QueueLength, ItemSize); //创建队列
xQueueSend(QHandle, &Data, pdMS_TO_TICKS(timeout)); //向队列发送数据
xQueueReceive(QHandle, &Buffer, timeout); //从队列接收数据
- 信号量(Semaphore):用于任务同步和互斥;
SemaphoreHandle_t xSemaphoreCreateBinary(); //创建二值信号量
xSemaphoreCreateMutex(); //创建互斥信号量
xSemaphoreCreateCounting(Count, MaxCount); //创建计数信号量
xSemaphoreTake(SemHandle, timeout); //获取信号量
xSemaphoreGiveFromISR(SemHandle, &HigherPriorityTaskWoken); //从中断中释放信号量
xSemaphoreGive(SemHandle); //释放信号量
- 事件组(Event Group):用于多任务的时间通知;
EventGroupHandle_t xEventGroupCreate(); //创建事件组
xEventGroupSetBitsFromISR(EventHandle, BitMask, &HigherPriorityTaskWoken); //从中断中设置事件位
xEventGroupClearBitsFromISR(EventHandle, BitMask); //从中断中清除事件位
xEventGroupClearBits(EventHandle, BitMask); //清除事件位
xEventGroupSetBits(EventHandle, BitMask); // 设置事件位
xEventGroupWaitBits(EventHandle, BitMask, AutoClear, WaitAll, timeout); //等待事件位
xEventGroupSync(EventGroupHandle, EventBits, WaitAll, timeout); //同步事件组
2.4、时间管理
- 延时函数:使用vTaskDelay()实现任务延时;
- 定时器:使用软件定时器实现任务;
2.5、内存管理
- 动态内存分配:使用pvPortMalloc()和vPortFree()进行内存管理,默认动态分配策略;
- 静态分配:更安全,需预先定义对象(如StaticTask_t);
- 内存池:使用内存池管理内存分配;
3、各模块串联逻辑
3.1、任务创建与调度
创建多个任务并设置不同的优先级,FreeRTOS会根据优先级调度任务执行。
3.2、任务间通讯
使用队列在任务间传递数据,使用信号量实现对共享资源的互斥访问。
3.3、时间管理
结合任务延时和定时器,实现定时任务和周期性任务。
3.4、内存管理
合理使用动态内存分配和内存池,确保内存使用高效且避免内存泄漏。
4、示例代码
以下是一个简单的FreeRTOS示例,展示了任务创建、任务间通讯和时间管理的基本用法:
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
// 定义队列和信号量
QueueHandle_t xQueue;
SemaphoreHandle_t xSemaphore;
// 定义任务函数,任务1:发送数据
void vTaskSender(void *pvParameters)
{
int valueToSend = 0;
while (1)
{
//等待信号量
if(xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{
// 发送数据到队列
xQueueSend(xQueue, &valueToSend, portMAX_DELAY);
valueToSend++;
// 释放信号量
xSemaphoreGive(xSemaphore);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1秒
}
}
// 定义任务函数,任务2:接收数据
void vTaskReceiver(void *pvParameters)
{
int valueReceived = 0;
while (1)
{
// 接收数据
if(xQueueReceive(xQueue, &valueReceived, portMAX_DELAY) == pdTRUE)
{
// 处理接收的数据
printf("Received value: %d\n", valueReceived);
}
}
}
//主函数
int main(void)
{
// 创建并初始化队列和信号量
xQueue = xQueueCreate(10, sizeof(int));
xSemaphore = xSemaphoreCreateMutex();
// 创建任务
xTaskCreate(vTaskSender, "Sender", 1000, NULL, 1, NULL);
xTaskCreate(vTaskReceiver, "Receiver", 1000, NULL, 1, NULL);
// 启动FreeRTOS调度器
vTaskStartScheduler();
//程序不应到达这里
for(;;);
}
4.1、代码说明
- 任务创建:创建了两个任务vTaskSender和vTaskReceiver,分别用于发送和接受数据;
- 队列:使用队列xQueue在任务间传递整数数据;
- 信号量:使用信号量xSemaphore确保对队列的互斥访问;
- 时间管理:vTaskDelay()用于控制任务的执行频率;
5、学习路线建议
1.实践顺序:
- 先掌握任务、队列、信号量->定时器->事件组->内存优化。
2.调试技巧: - 使用uvTaskGetStackHighWaterMart()检测任务堆栈溢出。
3.拓展学习 - 优先级反转(互斥量的优先级继承)、看门狗、Tickless低功耗模式。
6、结语
FreeRTOS的核心是任务调度与资源管理,通过队列、信号量等组件实现多任务协作。先分模块验证功能,再逐步组合成完整系统。