FreeRTOS -- 任务

0. task 意义

1. task 基础知识

任务状态
FreeRTOS 中的任务状态有:运行态、就绪态、阻塞态、挂起态,但是一个任务只能处于一种状态
任务切换

//任务挂起函数
vTaskSuspend();

//将所有的任务都挂起
vTaskSuspendAll();

//任务恢复函数
vTaskResume();
//专门使用在中断服务程序中
vTaskResumeFromISR();

//挂起指定任务,被挂起的任务绝不会得等CPU的使用权
//任务恢复就是让挂起的任务重新进入就绪态,恢复的任务会保留挂起前的状态信息

任务优先级

FreeRTOS优先级: 0- (configMAX_PRIORITIES-1),在FreeRTOSConfig.h配置,和中断不同,任务优先级数字越小,优先级越低。

任务控制块(TCB)
调用 xTaskCreate() 函数,创建一个任务,放入就绪列表,在链表中每个任务按优先级排列。就绪列表是一个双向链表。

2. task Code

任务函数

xTaskCreate()            使用动态方法创建一个任务
xTaskCreateStatic()      使用静态方法创建一个任务
xTaskDelete()            删除一个任务

xTaskCreateStatic()
使用改函数,需要将宏 configSUPPORT_STATIC_ALLOCATION 置1,在FreeRTOS.h

vTaskDelete(TaskHandle_t xTaskToDelete);
删除一个动态和静态创建的任务
删除一个使用动态创建的任务,
删除自身,其所申请的堆栈和控制块内存将会在空闲任务中被释放掉
删除其他的,会直接释放掉

删除静态
所使用的堆栈需要用户自己去释放

BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,  //任务函数
                       const char *const pcName,   //任务名字
                       const uint16_t usStackDepth,//任务堆栈大小
                       void *const pvParameters,   //传递给任务函数的参数
                       UBaseType_t uxPriority,     //任务优先级
                       TaskHandle_t *const pxCreatedTask); //任务句柄

任务函数

3. 任务调度

调用函数 vTaskStartScheduler(),FreeRTOS启动调度器,然后就会自动的创建一个空闲任务定时器任务
FreeRTOS有一个定期的时钟节拍,通常是ms级,在FreeRTOSConfig.h中设置,每个节拍中断释放时,vTaskSwitchContext()函数会被调用,它会选择优先级最高的就绪任务,抢占低优先级任务的CPU

空闲任务

  • 空闲任务的优先级最低
  • 创建空闲任务是可以确保至少有一个任务可以运行
  • 如果某个任务要调用函数 vTaskDelete() 删除自身,那么这个任务的TCB和任务堆栈等这些由FreeRTOS系统自动分配的内存需要在空闲任务中释放掉。(删除别的任务,相应的内存会直接被释放掉)

任务上下文切换

任务上下文切换简单来说会保存当前任务的寄存器和栈等内容,挂起当前任务,然后切换到其他任务
任务切换分为

  • 进程上下文切换
  • 线程上下文切换
  • 中断上下文切换
posted @   伯宁君  阅读(284)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示