FreeRTOS 总结
Task
头文件
task.h创建
xTaskCreate参数 含义 TaskFunction_t pvTaskCode 任务函数名 const char * const pcName 描述 unsigned short usStackDepth 任务使用的栈深度 void *pvParameters 传入任务的参数指针 UBaseType_t uxPriority 优先级 TaskHandle_t *pxCreatedTask 任务句柄的指针 任务函数: 死循环,或者执行结束删除自己
vTaskDelete描述: 后续可以通过
pcTaskGetName方法获取函数的描述任务参数:需要将参数的指针强制转换成
void *类型, 在任务内部在转回对应的类型栈深度: 这个任务能使用的最大字,字与 MCU 相关, 可以通过
uxTaskGetStackHighWaterMark获取运行时最小任务的栈剩余空间优先级:数字越高,优先级越高, 后续可以通过
vTaskPrioritySet设置, 通过uxTaskPriorityGet获取任务句柄:注意这是二级指针,不需要时传
NULL获取任务列表信息
vTaskList,内容分别为 描述/状态/优先级/栈空间/唯一值Name State Priority Stack Num task_suspend_1 R 1 848 4 task_suspend_4 R 1 860 5 main X 1 3480 2 IDLE R 0 1372 3 esp_timer S 22 3876 1任务状态
X-- 运行,B-- 阻塞,R-- 就绪,S-- 阻塞,D-- 已删除(未被移除)
任务的通知
每个任务都有一个32位的通知值,初始值为0;
xTaskNotifyWait等待通知值的改变,xTaskNotify设置通知的值,xTaskNotifyGive唤醒任务(通知值加1),ulTaskNotifyTake等待唤醒并获取通知值。xTaskNotifyWait
参数 含义 uint32_t ulBitsToClearOnEntry 进入时清空的位 uint32_t ulBitsToClearOnExit 退出时清空的位 uint32_t *pulNotificationValue 赋值通知值的指针 TickType_t xTicksToWait 最大Tick等待 xTaskNotify
参数 含义 TaskHandle_t xTaskToNotify 任务句柄 uint32_t ulValue 更新通知的值 eNotifyAction eAction 更新方式
* eNoAction 唤醒任务但不修改通知值
* eSetBits 通知值与ulValue按位或
* eIncrement 通知的值自增
* eSetValueWithOverwrite 用ulValue覆盖通知值
* eSetValueWithoutOverwrite 如果通知已经有值待唤醒则返回失败,否则设置为ulValuexTaskNotifyGive 使通知值自增
参数 含义 TaskHandle_t xTaskToNotify 函数句柄 ulTaskNotifyTake 当通知的值非0是唤醒
参数 含义 BaseType_t xClearCountOnExit pdFALSE 退出时通知值自减
pdTRUE 退出时通知值设置为 0TickType_t xTicksToWait 最大Tick等待
任务的阻塞和恢复
vTaskSuspend阻塞任务,vTaskResume恢复任务,xTaskResumeAll恢复所有任务,vTaskSuspendAll阻塞所有任务,阻塞之后不能使用FreeRTOS的函数看门狗任务
IDLE优先级为0, 如果其他任务一直执行, 5s 内IDLE的不到执行会触发看门狗。vTaskDelay可以让出时间片
队列
- 头文件
queue.h - 创建
xQueueCreate, 参数为队列的长度和宽度 - 发送数据
xQueueSend, 接收数据xQueueReceive, 查询队列中项目的数量uxQueueMessagesWaiting - 邮箱:创建队列的长度为1, 写入数据使用
xQueueOverwrite, 读取使用xQueuePeek - 多发送者单接收者, 需要将接收者的优先级调高
- 队列集合:创建集合
xQueueCreateSet, 将队列加入集合xQueueAddToSet, 从集合中挑选有数据的队列xQueueSelectFromSet
信号量
- 头文件
semphr.h - 让出信号量
xSemaphoreGive, 获取信号量xSemaphoreTake - 二进制信号量
xSemaphoreCreateBinary, 用于两个相同优先级的任务交替运行 - 互斥信号量
xSemaphoreCreateMutex, 类似于二进制信号量,但是如果任务1已经获取信号量,其他高优先级的任务2获取信号量时,任务1会临时提高到任务二的优先级。 - 计数信号量
xSemaphoreCreateCounting让出信号量会增加计数,获取信号量会减少计数,计数等于0时会阻塞获取信号量的任务。 - 递归信号量
xSemaphoreCreateRecursiveMutex用于锁定多个资源 获取信号量xSemaphoreTakeRecursive让出信号量xSemaphoreGiveRecursive
软件定时器
头文件
timers.h创建定时器
xTimerCreate参数 含义 const char *pcTimerName 描述 const TickType_t xTimerPeriod Tick 周期 const UBaseType_t uxAutoReload pdFALSE 只执行一次
pdTRUE 周期执行void * const pvTimerID 标识唯一 TimerCallbackFunction_t pxCallbackFunction 执行的函数名 执行定时器
xTimerStart,结束定时器xTimerStop, 删除定时器xTimerDelete,重置定时器计时xTimerReset(如果在定时器执行前重置则执行函数将等不到执行类似看门狗),改变定时器的执行周期xTimerChangePeriod
事件组
头文件
event_groups.h事件组存储在一个8/24位的变量中通过设置对应的位和检查对应的位控制任务的执行
等待事件组:一个任务等待其他任务(全部或任意任务设置),设置位
xEventGroupSetBits, 等待位设置xEventGroupWaitBitsxEventGroupWaitBits参数 含义 const EventGroupHandle_t xEventGroup 事件组 const EventBits_t uxBitsToWaitFor 等待的位(如果等待多个位, 使用位或连接) const BaseType_t xClearOnExit pdTRUE 函数退出前清空等待的位
pdFALSE 不修改const BaseType_t xWaitForAllBits pdTRUE 等待所有位都被设置
pdFALSE 任意位被设置都会唤醒TickType_t xTicksToWait 等待Tick周期 同步事件组:所有任务设置自己的位并等待其他任务设置
xEventGroupSync参数 含义 EventGroupHandle_t xEventGroup 事件组 const EventBits_t uxBitsToSet 设置的位 const EventBits_t uxBitsToWaitFor 等待的位(如果等待多个位, 使用位或连接) TickType_t xTicksToWait 等待Tick周期
流缓冲区
头文件
stream_buffer.h将数据写入缓冲区或从缓冲区读取数据, 只要缓冲区的数据大于唤醒任务需要的大小就会唤起任务读取数据,如果读取数据buffer小于缓存区的数据会分包获取数据。
创建
xStreamBufferCreate参数 含义 size_t xBufferSizeBytes 缓冲区的大小 size_t xTriggerLevelBytes 触发读操作的字节数 发送数据
xStreamBufferSend, 读取数据xStreamBufferReceive, 检查xStreamBufferSpacesAvailable缓冲区的剩余空间可以通过这个方法调整创建缓冲区的大小,xStreamBufferIsFull缓冲区是否已经满,xStreamBufferIsEmpty缓冲区是否为空
消息缓冲区
- 头文件
message_buffer.h - 类似于 流缓冲区 不同点
- 创建时不需要设置触发字节数
- 一次接受一个消息
- 如果接受的buffer小于缓存区的一条消息的大小则读取失败