SDK 基于 FreeRTOS(components/os/freertos),任务、队列、信号量、事件组、软件定时器都是标准接口。原理见 FreeRTOS 调度原理,例程见 FreeRTOS 操作系统。
FreeRTOS 常用 API(标准接口)
xTaskCreate(task, name, stack, arg, prio, handle)
创建任务(任务 = 一段独立运行的功能代码)。
参数:
task:任务函数name:任务名(调试用)stack:栈大小(字)arg:传给任务的参数prio:优先级,数字越大越优先handle:任务句柄输出
返回值:成功返回 pdPASS
vTaskDelete(task)
删除任务(传 NULL 删除当前任务)。
参数:
task:任务句柄
返回值:无
vTaskDelay(ticks)
任务延时:进入 Blocked 状态并让出 CPU。
参数:
ticks:延时节拍数
返回值:无
vTaskDelayUntil(&prev, ticks)
精确周期延时:按固定周期唤醒,不受任务执行时间影响。
参数:
prev:上一次唤醒时间记录ticks:周期节拍数
返回值:无
vTaskStartScheduler()
启动调度器,任务开始运行;正常不返回。
参数:无
返回值:无(不返回)
xTaskGetTickCount()
获取当前系统 tick 数(常用于超时判断)。
参数:无
返回值:当前 tick
xQueueCreate(len, size)
创建队列(任务间传数据的管道)。
参数:
len:队列长度size:每个元素字节数
返回值:队列句柄;失败返回 NULL
xQueueSend(queue, item, timeout)
向队列发送一条消息。
参数:
queue:队列句柄item:待发送数据timeout:队列满时最长等待
返回值:成功返回 pdPASS
xQueueReceive(queue, buf, timeout)
从队列取一条消息(为空时阻塞等待)。
参数:
queue:队列句柄buf:接收缓冲区timeout:最长等待
返回值:成功返回 pdPASS
xSemaphoreCreateBinary()
创建二值信号量(事件通知用)。
参数:无
返回值:信号量句柄
xSemaphoreCreateMutex()
创建互斥锁(有所有权、支持优先级继承,保护共享资源)。
参数:无
返回值:互斥锁句柄
xSemaphoreTake / xSemaphoreGive(sem, timeout) / (sem)
获取(等待)信号量 / 释放信号量。
参数:
sem:信号量句柄timeout:等待超时(Take 用)
返回值:成功返回 pdPASS
xEventGroupCreate / xEventGroupSetBits / xEventGroupWaitBits()
事件组:用位标志实现“多条件触发”。
参数:见 FreeRTOS 官方文档(创建无参;置位/等待传事件组句柄与位掩码)
返回值:事件组句柄 / 当前事件位
xTimerCreate / xTimerStart / xTimerStop(...)
软件定时器:到点执行回调,不占用硬件定时器。
参数:
xTimerCreate:名称、周期、是否自动重载、回调
返回值:定时器句柄 / pdPASS
xStreamBufferCreate / xStreamBufferSend / xStreamBufferReceive(...)
流式缓冲:按字节流收发(如串口数据 → 处理任务)。
参数:见 FreeRTOS 官方文档
返回值:句柄 / 发送接收字节数
提示:SDK 使用标准 FreeRTOS API,完整声明见
components/os/freertos/include/下的task.h、queue.h、semphr.h、timers.h、event_groups.h、stream_buffer.h。
常见考点 / 面试题
任务延时和空转延时有什么区别?
vTaskDelay 让任务进入 Blocked 状态、让出 CPU;空转 while 忙等一直占用 CPU,浪费算力、无法休眠省电。
信号量和互斥锁怎么选?
信号量用于事件通知/计数(无所有权);互斥锁用于保护共享资源(有所有权、支持优先级继承,防优先级反转)。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

