多任务处理单核处理器一次只能执行一项任务。 多任务操作系统可以通过任务之间的快速切换制造并发执行的假象任务调度操作系统中任务调度器的责任就是决定在某一时刻要执行哪个任务。调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。内核可以在任务生命周期内多次挂起并且稍后恢复一个任务任务状态运行态只有一个,就绪态没有任务,唯一可以直接到运行的状态阻塞态等待延时,外部事件挂起态vTaskSuspend() 进入挂起态FreeRTOS 任务有两个很常用的 “不运行” 状态都依赖滴答计时休眠Suspended任务主动说过多久再叫醒我时间没到绝不运行。阻塞Blocked任务在等某个事件消息、信号量、中断等同时说我最多等多久超时了就不等了。“什么时候恢复运行”。xTickCount滴答计数器一个硬件定时器周期性产生中断 → 滴答中断Tick ISR每进一次中断xTickCount 1这个计数就是 FreeRTOS 的系统时间举例滴答频率 1kHz → 1ms 加 1滴答频率 100Hz → 10ms 加任务上下文是什么任务运行时必须用到的 CPU 资源叫上下文“现场”CPU 寄存器运算、地址、状态等任务堆栈当前执行到哪一行代码上下文切换切出 TaskA把 CPU 寄存器里的值存到 TaskA 的堆栈切入 TaskB把 TaskB 堆栈里保存的值恢复回 CPU 寄存器FreeRTOS 不是随时切换而是在固定时机触发1. 最常见系统滴答中断Tick ISR每次心跳检查延时任务是否唤醒检查是否有更高优先级任务就绪需要切换 → 标记触发 PendSV2. 任务主动让出任务调用 vTaskDelay任务等待信号量 / 队列任务运行完毕主动退出都会主动请求切换3. 高优先级任务就绪抢占低优先级任务正在运行突然来了更高优先级任务 → 立刻触发切换真正切换 在 PendSV 中断服务函数里做所有上下文切换代码都在 PendSV_Handler () 里执行为什么用 PendSV核心优势可以软件手动触发想切就切可以设置为最低中断优先级不会打断其他重要中断所有中断执行完最后才做任务切换怎么触发 PendSV向中断寄存器 ICSR 的 bit28 写 1→ 挂起 PendSV 中断→ 等所有高优先级中断执行完→ PendSV 运行 → 执行上下文切换PendSV 设为 最低优先级不影响重要中断触发方式置位 ICSR 的 bit28触发时机滴答中断、任务主动让出、高优先级抢滴答中断、串口中断、定时器中断这种硬件中断优先级通常很高FreeRTOS 强制把 PendSV 设为最低中断优先级所有硬件中断都执行完了 → 最后才轮到 PendSV 做任务切换PendSV 可以软件手动触发想切换任务时只要写一个寄存器位就能触发 PendSV向 ICSR 寄存器的 bit28 写 1SCB-ICSR | SCB_ICSR_PENDSVSET_Msk;挂起 PendSV → 等所有高优先级中断执行完 → 自动进入 PendSV_HandlerPendSV 是什么Cortex‑M 为 RTOS 设计的、可软件触发的、最低优先级中断。PendSV 用来干嘛专门执行 FreeRTOS 的上下文切换。为什么要用它不干扰高优先级中断保证系统实时性让任务切换安全、延后、统一执行。总结PendSV FreeRTOS 的任务切换工人永远等所有紧急中断干完才最后出来做上下文切换。