rtos源码分析2-task.c
task.c的所有函数分类一、任务创建与删除xTaskCreate xTaskCreateStatic vTaskDelete prvDeleteTCB prvCheckTasksWaitingTermination任务动态 / 静态创建删除任务(内存由空闲任务回收)二、任务状态控制vTaskSuspend vTaskResume xTaskResumeFromISR vTaskSuspendAll xTaskResumeAll prvAddCurrentTaskToDelayedList挂起 / 恢复调度器挂起 / 恢复任务加入延时列表三、调度器与上下文切换plaintextvTaskStartScheduler vTaskSwitchContext prvSelectHighestPriorityTask portYIELD vTaskYieldWithinAPI xTaskIncrementTick启动调度器任务切换时钟节拍处理多核安全切换四、临界区与中断安全(单核 + 多核)plaintextvTaskEnterCritical vTaskExitCritical vTaskEnterCriticalFromISR vTaskExitCriticalFromISR portDISABLE_INTERRUPTS portENABLE_INTERRUPTS单核:关中断 + TCB 嵌套计数多核:TaskLock + ISRLock + 全局中断屏蔽五、列表初始化与内核数据结构plaintextprvInitialiseTaskLists vListInitialise vListInsert uxListRemove listGET_ITEM_VALUE_OF_HEAD_ENTRY初始化所有内核列表就绪、延时、挂起、删除、pending 列表六、任务信息获取(调试)plaintextvTaskGetInfo vTaskListTasks vTaskGetRunTimeStatistics uxTaskGetStackHighWaterMark uxTaskGetStackHighWaterMark2 prvTaskCheckFreeStackSpace xTaskGetCurrentTaskHandle xTaskGetSchedulerState任务状态、优先级、栈余量CPU 使用率任务列表打印七、任务通知(Task Notify)plaintextxTaskGenericNotify xTaskGenericNotifyFromISR ulTaskGenericNotifyTake xTaskGenericNotifyWait vTaskGenericNotifyGiveFromISR xTaskGenericNotifyStateClear ulTaskGenericNotifyValueClearFreeRTOS最快 IPC 机制替代队列 / 信号量 / 事件组八、互斥锁与优先级继承plaintextxTaskPriorityInherit xTaskPriorityDisinherit vTaskPriorityDisinheritAfterTimeout pvTaskIncrementMutexHeldCount解决优先级翻转优先级提升 / 恢复九、低功耗 Tickless 模式plaintexteTaskConfirmSleepModeStatus prvResetNextTaskUnblockTime睡眠模式安全检查重新计算下一个唤醒时间十、线程本地存储(TLS)plaintextvTaskSetThreadLocalStoragePointer pvTaskGetThreadLocalStoragePointer任务私有指针,不共享十一、MPU 内存保护plaintextvTaskAllocateMPURegions xTaskGetMPUSettings任务内存访问权限控制十二、运行时间统计plaintextulTaskGetRunTimeCounter ulTaskGetRunTimePercent ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimePercent任务 CPU 占用率十三、静态内存分配(无 malloc)plaintextvApplicationGetIdleTaskMemory vApplicationGetPassiveIdleTaskMemory vApplicationGetTimerTaskMemory静态分配空闲任务、定时器任务十四、系统状态重置plaintextvTaskResetState重启调度器前重置内核FreeRTOS 核心函数笔记(第 4 弹:任务添加、删除、延时)一、prvAddNewTaskToReadyList——把任务加入就绪队列任务创建完最后一步:把任务放进就绪列表,让调度器可以运行它。分两种情况1. 单核(configNUMBER_OF_CORES == 1)进入临界区,防止中断干扰任务计数 +1如果是第一个任务,初始化任务链表调度器没运行时:优先级最高的任务成为当前任务把任务加入就绪列表如果调度器已运行,且新任务优先级更高 →立刻任务切换2. 多核(configNUMBER_OF_CORES 1)逻辑更简单不指定当前运行任务只初始化链表、加入就绪列表多核调度器自动分配 CPU 核心运行任务笔记重点内部函数,用户不调用任务创建最后一步负责:任务计数、链表初始化、加入就绪队列、触发调度单核 / 多核实现不同二、vTaskDelete——删除任务删除一个任务:从调度器移除、释放内存、退出运行。核心流程(笔记必背)进入临界区获取要删除的任务 TCB从所有链表移除(就绪 / 阻塞 / 事件列表)如果任务正在运行:不能立刻删!放入等待终止列表交给空闲任务稍后释放内存如果任务没运行:立刻删除,释放 TCB 和栈触发任务切换重点知识点删除自己:会放到等待终止列表,空闲任务帮忙清理删除别人:可以直接删动态任务:自动释放 TCB + 栈静态任务:不释放内存(只从调度器移除)多核下会强制让其他核心停止运行该任务记忆口诀删任务 → 退出队列 → 正在运行就延后 → 空闲任务释放 → 切换任务三、vTaskDelay——任务相对延时一句话定位让当前任务阻塞 N 个系统时钟节拍。核心逻辑延时不能为 0(为 0 只触发调度)挂起调度器把当前任务加入延时列表恢复调度器触发任务切换特点相对延时:从调用时开始算 N 个 tick任务进入阻塞状态,CPU 让给其他任务精度 = 系统时钟节拍(tick)四、xTaskDelayUntil——任务绝对延时(周期执行)用于固定周期运行任务,保证执行间隔精准。核心逻辑记录上次唤醒时间计算下次唤醒时间 = 上次 + 周期处理时钟溢出(tick 计数回绕)任务阻塞到指定时间才唤醒返回值:pdTRUE = 成功延时;pdFALSE = 来不及了与 vTaskDelay 区别(超级重点)vTaskDelay:相对延时,从调用开始算xTaskDelayUntil:绝对延时,固定周期,不漂移适用场景必须固定周期运行的任务比如:10ms 采集一次传感器五、辅助小函数:prvSnprintfReturnValueToCharsWritten调试、跟踪功能用处理 printf 返回值,输出正确的字符长度用户不用管六、整张笔记最精简总结prvAddNewTaskToReadyList任务创建最后一步 → 加入就绪队列 → 开始可被调度vTaskDelete删除任务 → 退出队列 → 正在运行则延后清理 → 空闲任务释放内存vTaskDelay相对延时 N 个 tick → 阻塞 → 让出 CPU