FreeRTOS 是一种轻量级的嵌入式实时操作系统,广泛应用于物联网和嵌入式系统中。它提供了任务管理、内存管理、定时器、消息队列、信号量等常用功能。其中,任务(Task)是 FreeRTOS 的核心概念,允许我们在嵌入式系统中运行多个并发任务,提升系统的响应性和实时性。
一、FreeRTOS 任务的基本概念
任务是 FreeRTOS 中执行一段代码的基本单元,每个任务都有自己的独立栈空间和任务控制块(TCB),并通过时间片轮转或抢占式调度策略在多个任务之间切换。
每个任务都具有以下属性:
- 任务优先级:决定任务在调度中的优先级高低,优先级越高,任务越早执行。
- 任务栈:存储任务执行过程中使用的局部变量和函数调用信息。
- 任务入口函数:任务执行的主要逻辑部分。
- 任务状态:任务可能处于就绪、运行、阻塞、挂起或删除状态。
二、任务创建
任务的创建通过 xTaskCreate()
函数完成。
void freertos_entrance(void)
{
/* start_task任务 */
xTaskCreate((TaskFunction_t )start_task, // 任务函数
(const char * )"start_task", // 任务名称
(uint16_t )START_STK_SIZE, // 任务堆栈大小
(void * )NULL, // 传入给任务函数的参数
(UBaseType_t )START_TASK_PRIO, // 任务优先级 5
(TaskHandle_t * )&StartTask_Handler); // 任务句柄
vTaskStartScheduler(); /* 开启任务调度 */
}
参数解释:
pvTaskCode
: 指向任务函数的指针,该函数是任务的主逻辑。pcName
: 任务的名字,用于调试时识别任务。usStackDepth
: 任务的栈大小(以字为单位),这决定了该任务在执行期间能使用的栈空间。pvParameters
: 传递给任务的参数,如果任务不需要参数,可以设为NULL
。uxPriority
: 任务的优先级,优先级数值越大,任务优先级越高。pxCreatedTask
: 任务句柄,用于后续的任务控制操作(如删除)。
三、任务删除
任务的删除通过 vTaskDelete()
函数完成,删除任务时会释放与任务相关的所有资源(如栈空间和任务控制块)。
void vTaskDelete(TaskHandle_t xTaskToDelete);
四、vTaskStartScheduler()
启动实时操作系统的调度器
vTaskStartScheduler()
是 FreeRTOS 的一个关键函数,用于启动实时操作系统的调度器,它让系统开始调度和执行已经创建的任务。调度器的作用是根据任务的优先级和状态(就绪、阻塞等)在多个任务之间切换,让任务按顺序或实时要求运行。
当调用 vTaskStartScheduler()
后,FreeRTOS 会接管系统的 CPU 执行,进入多任务调度模式,下面是它的核心作用:
- 启动调度器:调用该函数后,FreeRTOS 开始调度任务。调度器会选择优先级最高的就绪任务并开始执行它。
- 永不返回:正常情况下,
vTaskStartScheduler()
是不会返回的,因为一旦启动调度器,操作系统会不断调度任务。只有在系统遇到重大错误或没有可运行的任务时,调度器才会终止或陷入无限循环。 - 必须在任务创建之后调用:
vTaskStartScheduler()
必须在所有任务都创建完成后调用,且调用后才能使任务实际开始运行。如果没有调用这个函数,所有创建的任务都只是处于就绪状态,不会被调度执行。
四、注意事项
- 任务优先级的选择:任务优先级决定了任务执行的调度顺序。通常情况下,应避免多个任务的优先级相同,以免产生饥饿现象或者任务被永久阻塞。
- 任务的合理删除:删除任务时,要确保任务执行完毕或者已经进入安全状态,避免删除任务导致资源泄漏或其他任务行为异常。
- 栈大小的分配:合理分配任务栈大小非常重要,过小的栈会导致栈溢出,导致系统不可预测的行为。
五、总结
通过 xTaskCreate()
函数,我们可以轻松创建 FreeRTOS 任务,并通过 vTaskDelete()
函数删除不再需要的任务。任务的创建和删除是管理系统资源的重要部分,掌握这两个函数的使用是开发 FreeRTOS 应用程序的基础。
FreeRTOS 的任务机制为开发者提供了强大的并发处理能力,合理使用任务可以显著提升系统的响应速度和性能。
在实际项目中,开发者应根据系统需求和资源情况调整任务优先级、栈大小等参数,以保证任务的高效执行。