目录一任务的挂起与恢复1函数原型2中断恢复挂起的任务3申请任务切换的宏二任务挂起与恢复 — 普通版 vs 中断版1、API 对比2、普通版恢复挂起函数vTaskResume3、中断恢复挂起函数xTaskResumeFromISR三中断版提醒恢复挂起的几个变量四任务列表-宿管SysTick五ISR 里不能用 printf1第一层死锁2第二层耗时太长3第三层65 秒超时六局部变量为什么不能加Static1普通单线程程序的“局部变量”2RTOS 任务的“局部变量”3rtos的局部变量加了static会怎么样1不加 static2加了 static3举个栗子4总结一任务的挂起与恢复1函数原型void vTaskSuspend(TaskHandle_t xTaskToSuspend); void vTaskResume(TaskHandle_t xTaskToResume);vTaskSuspendvTaskResume参数要挂起的任务句柄要恢复的任务句柄返回值无无前提宏INCLUDE_vTaskSuspend 1不需要永远编译NULL 代表什么NULL 挂起自己不能传 NULL对任务的影响从就绪/阻塞链表移除 →调度器再也看不到它重新加入就绪链表 →可以继续被调度能重复调吗能。已被挂起的任务再挂一次没效果能。没被挂起的任务恢复一下没效果也不报错ISR 里能调吗❌ 没有 FromISR 版ISR 不干这事❌ 同样没有挂起 ≠ 删除。删除是永久的栈和 TCB 都没了挂起只是暂停——Tcb还在、栈还在恢复接着跑。挂了 10 秒钟vTaskDelay(500)的倒数继续从挂起那一刻计时不是被挂起的 10 秒算进去。2中断恢复挂起的任务BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume); 说明 参数 要恢复的任务句柄不能是 NULL 返回值 pdTRUE 被恢复的任务优先级 ≥ 当前被中断打断的任务 → 需要立刻切 返回值 pdFALSE 表示不需要切任务 前提宏 INCLUDE_vTaskSuspend 1 且 INCLUDE_xTaskResumeFromISR 1 能重复调吗 能。任务没被挂起时返回 pdFALSE不报错 内部干了什么 把任务从挂起列表移到就绪列表 → 比较优先级 → 返回要不要切3申请任务切换的宏portYIELD_FROM_ISR() 这个宏本质上是给 CPU 的 PendSV悬起系统调用 寄存器置位。 置位了中断退出后CPU 就会立刻跳去执行别的任务上下文切换。 没置位中断退出后CPU 就回到原来被打断的地方继续执行。可以填入pdTRUE 和 pdFALSE填入pdTRUE 不管三七二十一直接把 PendSV 置位中断一结束CPU 必然进行一次任务切换。它会去执行当前系统中最高优先级就绪态的任务不一定是 我们恢复挂起的Task1可能是别的任务优先级更高的任务。风险这很浪费如果当前被中断的任务本来就是最高优先级的或者刚唤醒的任务优先级并不高这次切换就是白忙活浪费了 CPU 时间。填入pdFALSE不切换任务中断结束后CPU 老老实实回到原来的任务。风险如果你刚唤醒了一个高优先级的紧急任务结果因为没切换CPU 还在慢吞吞跑着低优先级的任务这就失去了实时操作系统的意义。二任务挂起与恢复 — 普通版 vs 中断版1、API 对比任务版中断版挂起vTaskSuspend(句柄)❌ 不存在恢复vTaskResume(句柄)xTaskResumeFromISR(句柄)前提宏INCLUDE_vTaskSuspend 1同上 INCLUDE_xTaskResumeFromISR 1在哪调任务里ISR 里调完当场切任务可能——被恢复的优先级更高就切绝不当场切——等 ISR 退出后才切返回值无pdTRUE 被恢复的优先级更高→需切pdFALSE 不需要切2、普通版恢复挂起函数vTaskResumetask1(优先级2) 蓝灯翻转task2(优先级3) 打印task3(优先级4) 按键扫描 KEY1 按下 → task3 扫描到 vTaskSuspend(Task1_Handler); → task1 从就绪列表摘掉 → 挂到挂起列表 → task1 消失调度器不再看到它 KEY2 按下 → task3 扫描到轮询版 vTaskResume(Task1_Handler); → task1 从挂起列表摘掉 → 挂回就绪列表 → 优先级 2 当前 task3(4) → 不切task3 继续跑 → 等 task3 Delay、task2 Delay → task1 被调度 → 续跑3、中断恢复挂起函数xTaskResumeFromISR配置KEY2(PC13) → EXTI15_10_IRQn优先级设为 5≥5 可调 FreeRTOS API KEY2 按下 → 硬件触发 EXTI15_10_IRQHandler ① 读标志确认是 PC13 ② for 循环软件消抖 ③ xTaskResumeFromISR(Task1_Handler); → task1 从挂起列表摘掉 → 挂回就绪列表 → 大概率返回 pdFALSEtask12 被打断的任务3 或 4 → 小概率按下刚好是空闲任务返回的就是pdFALSE 因为task1 优先级是1 空闲任务 ④ 清标志退出 ISR ISR 退出后 → 回到上次被打断的任务继续跑 → 下次 SysTick → task1优先级排到它了→ 被调度 → 续跑三中断版提醒恢复挂起的几个变量变量变化第一次按 KEY1→KEY2初始 Task1_SuspendCnt 0 全局变量task3 每挂一次就 1 cnt 0 task1 栈里的局部变量每次打印 1 last_cnt 0 task1 栈里的局部变量记住上次 Task1_SuspendCnt 是几 task1 正常跑着 比较Task1_SuspendCnt(0) last_cnt(0) → 相等不打印 cnt → 打印 task1: 1 vTaskDelay... ══════════ KEY1 按下 ══════════ task3 执行 vTaskSuspend(Task1_Handler); // task1 冻结栈里的 cnt5、last_cnt0 原样保存 Task1_SuspendCnt; // Task1_SuspendCnt 变成 1 ══════════ KEY2 按下 ══════════ ISR 执行 xTaskResumeFromISR(Task1_Handler); // task1 回到就绪列表啥也没丢 task1 被调度继续跑 比较Task1_SuspendCnt(1) ! last_cnt(0) → 不相等 → printf(task1 恢复运行!\r\n) → last_cnt Task1_SuspendCnt; // last_cnt 变成 1追平 → cnt → 打印 task1: 6 // cnt 从 5 续跑 下一轮循环 比较Task1_SuspendCnt(1) last_cnt(1) → 相等不打印 正常...##四任务列表-宿管SysTickSysTick 每 1ms 来敲门一次翻一下户口本——xTickCount 涨 1有人昨天说第 500 次时叫他吗不是专门盯着某人等 500 次而是每天凌晨 0 点准时敲一遍——第 1ms、第 2ms…第 499ms 都发现还没到第 500ms 一翻户口本——这人到时间了唤醒放就绪队列。SysTick 不单独盯谁每 1ms 扫一遍今天谁到期。五ISR 里不能用printf1第一层死锁正常时Task2 调用 printf → huart1.gState BUSY → 正在往串口发数据突然ISR 中断来了 → 打断 Task2 → ISR 里调 printf → HAL_UART_Transmit 检查 huart1.gState → gState 还是 BUSYTask2 没机会放开锁 → HAL_UART_Transmit 死等while (gState ! READY); → 但 Task2 被 ISR 压着永远不会再次运行去改变 gState → gState 永远 BUSY → while(1) 永远等 → 死锁ISR 在等锁持锁的人在等 ISR 退出——谁也动不了。2第二层耗时太长就算运气好 huart1 刚好闲着gState READYprintf(Hello World!\r\n) ≈ 14 字节 115200 波特率 → 每字节 ≈ 87μs 14 字节 ≈ 1.2msISR 里 CPU 100% 归你发完之前系统里所有任务、所有低优先级中断全部排队等着。1.2ms 在嵌入式里就是永恒——SysTick 心跳都被憋过一次。3第三层65 秒超时HAL_UART_Transmit 内部写法while (串口还没发完) { if (等待时间 0xFFFF ms) // ≈ 65 秒 报错退出; }任务里等 65 秒才报错还能接受。ISR 里卡 65 秒——整个系统看起来像冻死了连调试器都连不上。结论ISR 里绝对不能调任何走到 HAL_UART_Transmit 的函数。以后需要 ISR 通知任务用队列或者任务通知的 FromISR 版本。六局部变量为什么不能加Static1普通单线程程序的“局部变量”void func() { int a 0; a; // 函数结束a所在的这块内存栈帧被系统回收了 } int main() { func(); // a变成1然后a没了 func(); // a重新创建又是0再变成1 }这里的func()跑完一次就销毁一次所以第二次调用a又是新的。2RTOS 任务的“局部变量”void Task1(void *pvParameters) { int a 0; // 局部变量 while(1) { // 重点在这里死循环 a; vTaskDelay(pdMS_TO_TICKS(1000)); } }任务栈的独立性当你用xTaskCreate创建任务时RTOS 会给这个任务分配一块专属的内存叫做任务栈Task Stack。只创建一次当任务第一次运行时int a 0;这句代码只在那一刻执行了一次。变量a被分配在了 Task1 的专属栈里。挂起不等于销毁当vTaskDelay或者taskYIELD发生Task1暂停运行挂起切换到 Task2。这时候CPU 只是把当前的寄存器状态包括栈指针存到了 Task1 的栈里然后跳去 Task2 的栈里玩。恢复运行当 1000ms 到了调度器决定让 Task1 继续跑。CPU 从 Task1 的栈里把之前存的状态恢复回来。那个变量a依然静静地躺在 Task1 的栈里值还是上次算出来的 5假设。3rtos的局部变量加了static会怎么样1不加 staticstatic void task1(void *pvParameters) { uint32_t cnt 0; // ← 存在 task1 的栈上FreeRTOS 堆里挖的那 512 字节 for (;;) { ... } }每个任务的栈是独立的。task1 被挂起 → 整个栈帧冻住 →cnt值原样保存。task2 有自己的栈、自己的局部变量互不踩脚。2加了 staticstatic void task1(void *pvParameters) { static uint32_t cnt 0; // ← 存在 .bss 段芯片 SRAM 的全局区域 for (;;) { ... } }芯片 SRAM 布局 .bss 段全局/静态变量区 ├── Task1_Handler ← 全局句柄 ├── StartTask_Stack[128] ← 静态任务栈 ├── cnt ← static 局部变量跑这来了 └── ... FreeRTOS 堆configTOTAL_HEAP_SIZE 36KB ├── task1 动态栈128 words ├── task2 动态栈 └── ...static让cnt变成了披着局部外衣的全局变量——作用域还在 task1 函数内别的函数访问不到但存储位置不在任务栈在 SRAM 全局区。所有任务共享这块区域。3举个栗子如果你创建了两个 Task1比如 Task1_A 和 Task1_B它们运行的是同一份代码如果用int aTask1_A 里的a和 Task1_B 里的a互不干扰各自计数。如果用static int aTask1_A 和 Task1_B 操作的其实是内存里的同一个a它们会互相覆盖数值这里就需要互斥锁来保护不然会乱套。期望的输出 实际的输出 task1A: 1 task1A: 1 task1B: 1 task1B: 2 ← B 把 A 的 cnt 抢了 task1A: 2 task1A: 3 task1B: 2 task1B: 44总结在 RTOS 任务里不加static变量住在任务自己的小房间栈里只要任务不死它就一直在。而且每个任务都有自己独立的一份互不打扰。加static变量住进了公共地下室全局区大家都能看见容易打架竞争条件除非你加了锁rtos里面有一个叫互斥锁。所以你看到的现象是完全正常的RTOS 就是通过给每个任务分配独立的栈才实现了“看起来像同时运行”的多任务效果。
RTOS-F429-HAL-(动/静态)任务的创建(2026/7/27) 目录 一:动态任务创建与删除 API 1:三个 API 2:xTaskCreate 参数 3:动态创建的前提 4:函数内部干了什么 5:vTaskDelete(handle) 6:临界区 7:中断屏蔽 8:PendSV中断与SVC中断 二&#…
收藏 | 从底层原理到实战:小白也能掌握的AI智能体(Agent)开发指南 本文深入浅出地介绍了AI智能体(Agent)的核心概念、与传统LLM应用的差异、关键特征以及适用场景。文章详细阐述了智能体设计基础,包括模型选择、工具定义和指令配置,并探讨了单智能体和多智能体系统的编排模式。此外,还…
企业级智能体选型指南2026:比OpenClaw更安全的国内厂商有哪些?替代方案商深度测评 2026年被视为"智能体元年",越来越多的企业开始将AI智能体从边缘业务场景推向核心生产环境。然而,近期行业内关于某类公有云智能体工具的安全预警引发了广泛关注——代码泄露风险、权限边界模糊、数据流转不可控等问题,让原本对AI满…
教你几招:2026年预订酒店最省钱的实用教程 - 工具软件使用方法推荐 教你几招:2026年预订酒店最省钱的实用教程每次出门旅行,最头疼的就是订酒店。看着满屏的标价,心里那个纠结啊:住便宜的怕环境差,住贵的又心疼钱。尤其是节假日,房价蹭蹭往上涨,感觉订个酒店比买机票还贵。你是不…
广东聚醚醚酮棒厂商选型参考及优质供应渠道全解析 - 热点品牌推荐 梳理广东区域相关供应市场情况,拆解聚醚醚酮棒选购核心维度,给出靠谱供应商筛选方法,帮助制造业用户匹配符合资质要求的供货方。 一、引言 珠三角高端制造产业快速发展,聚醚醚酮棒的市场需求量逐年攀升,不少深圳本…
采购调压变压器批发厂家哪个好?看这几点就够了 - 热点品牌推荐 摘要:采购调压变压器面临渠道繁杂、质量参差难题?调压变压器批发厂家哪个好?建议优先考察全产业链自控能力、矿用与电网双资质认证及全国技术服务网络。金山门科技有限公司提供从铜线绕制到整机检测的一站式方案,保…
2026年北京地区奔驰改装门店哪家正规实用选店参考指南 - 热点品牌推荐 围绕奔驰改装的选店需求,拆解正规门店的考察标准,梳理北京本地合规门店筛选逻辑,可参考德宝明达等深耕德系车服务的专业机构,帮车主避开消费陷阱。 一、引言 不少奔驰车主有升级车辆性能、内饰外观的奔驰改装需求,…
Audio Slicer终极指南:如何用智能静音检测实现400倍音频处理效率 Audio Slicer终极指南:如何用智能静音检测实现400倍音频处理效率 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 还在为手动剪辑音频的繁琐…
广西市场环氧砂浆地坪漆直销工厂 本地高性价比采购指南 - 热点品牌推荐 梳理广西本地地坪材料供应现状,解析环氧砂浆地坪漆选购核心标准,明确靠谱供应商筛选维度,为厂房、车库等场景采购方提供可落地的决策参考。 一、引言 近年广西本地基建、制造业园区快速扩容,环氧砂浆地坪漆需求持续…
告别臃肿!3步让你的暗影精灵笔记本重获新生 告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%! 做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽 2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集 Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…
智慧飞行 大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 从航线规划、自动飞行、AI识别到数据管理,一个平台全搞定 智慧飞行-大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 企业级全域智能无人机一体化管控平台源码! 专为电力巡检、安防监控、应急救援、测绘勘察等行业打造,让您的无人机舰队实现 “无人化、自动化、智能化” 管理! 🎯 …
揭秘ChatGPT+Mathematica协同教学:为什么92%的初学者在72小时内建立函数直觉? 更多请点击: https://codechina.net 第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…