首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
任务阻塞不是死机:从采集被 MQTT 堵住讲清 RTOS 测试看什么
📅 2026/10/15 21:34:30
✍️ 爱科研究院
👁 阅读 3,247
副标题Ready / Blocked / 死循环 / 看门狗拷机不能只看灯还亮专栏《嵌入式学生的方案测试课》第 3 篇前置第 2 篇堆栈与死机分层标签嵌入式、RTOS、软件测试、物联网、C语言读者写过 LiteOS / FreeRTOS 任务创建或至少知道 delay农业终端那种「2 秒采一次」听过学完交什么一张任务状态对照表、一次「发送堵住采集」的周期记录、一张阻塞点地图、一张阻塞类缺陷单有 Hi3861 最好。没有 RTOS 板用 PC 线程或 Arduino/ESP 主循环 delay 做同构实验正文写清近似边界。0. 这篇结束你能干什么勾这 3 条。能区分Ready、Blocked、Suspended、死循环占 CPU、整机死机。五者不要互相冒充。能按笔试口径解释硬实时 / 软实时并举出方案测试里什么超时算严重、什么算可接受抖动。会人为制造「网络发送堵住采集」采集日志从 2 秒一拍变成 5 到 10 秒一拍再改成队列解耦间隔恢复。能把过程写成缺陷单而不是写成「我优化了调度」。第 2 篇处理「倒在地上」。本篇处理「灯还亮、串口偶尔还吐、功能偶发成功但周期已经烂了」。拷机只看灯会把这种板子 rel 出去。1. 为什么方案测试要会 RTOS却不是来写内核无线方案几乎都跑在 RTOS 或「伪多任务主循环」上。采集、按键、AT 解析、MQTT、看门狗喂狗抢的是同一颗核的时间。客户能看见的症状经常是温度 2 秒上报一次的规格弱网时变成 10 秒云端点灯本地要等好几秒才动或命令丢失拷机一夜「还能连」但中间有过几次采样停看门狗偶发复位复位前最后一行是卡在发送如果你只会问「死了没」开发回「没死啊灯还亮」对话结束产品带着周期缺陷出厂。公开的 TXW82x FPV ReleaseNote 加过一个高优先级 workqueue用来处理不耗时的高优先级任务、节省 SRAM。这句话的测试翻译是卡的时候要问卡在哪个核、哪个队列、是耗时发送还是本该很快的回调。TXW82x 公开 SDK 还是双核CPU0 应用、网络、多媒体CPU1 无线。CPU1 没 ready不要解释业务卡顿。CPU0 上的 MQTT 同步发送卡住也不要先怪射频。学生的 Hi3861 农业终端结构已经够当教具采集任务高优先级2 秒周期MQTT 心跳 / 发送按键队列或信号量解耦本篇就把这个结构测明白。ESP8266 若只当 AT 模组模组内部任务你看不见实验要做在主控 MCU 或 PC 模拟上。不要对着 AT 口说「我看了 FreeRTOS 任务状态」。2. 最小原理任务还活着吗2.1 笔试口径先冻结实时是嵌入式系统的主要特征按截止时间分硬实时超时即严重故障。安全切断、电机急停、飞机飞控属于这一类。多士炉 310 秒超时断继电器更接近硬约束到点必须断。软实时超时会降低体验或丢数据但不立即造成安全事故。2 秒温湿度变成 3 秒通常是软实时被破坏。嵌入式 OS 相对通用 OS可裁剪、体积小、低功耗、高可靠、可固化、资源占用少。两大类实时 OSFreeRTOS、LiteOS、RT-Thread、µC/OS、QNX非实时或软实时倾向嵌入式 Linux、Android方案测试现场多数模组和 SoC 应用核是 RTOS。不要把top那套原样搬到 LiteOS 上。FreeRTOS / LiteOS 一般靠串口命令看任务和剩余堆。Linux 才是 ls/cd/top/ps/dmesg。笔试问人机交互命令按这个分不要现场编一个 LiteOS 的top。2.2 五种「看起来都不动了」名字任务还在吗CPU别人还能跑吗日志长什么样Ready在想跑一有空闲就跑抢优先级正常或高频打印Blocked在等某件事不占 CPU可以某条周期日志变稀或停其它任务还在Suspended被挂起不跑可以该任务完全消失直到被恢复死循环占 CPU在忙等占满低优先级饿死一个任务狂打或整个系统除它以外沉默看门狗可能来整机死机调度没了可能停在 fault否复位、无输出、HardFault回到第 2 篇Blocked 是设计上会等等队列、等锁、等串口、等网络、delay。它不是骂人的词。问题是等有没有超时、超时后会不会回来、会不会把不该等的活也卡住。口令阻塞还活着停在等待点。死循环还活着不让路。死机整机不跑。面试里把三者说成一句「卡死」会被追问到哑。2.3 调度优先级不是「数字越大越好」那么简单不同 RTOS 优先级方向不同。LiteOS / FreeRTOS 常见是数字越小优先级越高或反过来以你工程的头文件为准不要背网文。测试记录写采集任务优先级____文档或代码出处 MQTT 任务优先级____ 空闲任务最低高优先级任务一旦 Ready会抢低优先级。所以采集设高优先级只做采样和投递通常对采集里同步发 MQTT网络一堵高优先级自己堵住自己等于把「重要」变成「重要且爱死等」这就是农业终端要把发送拆走的原因。2.4 会阻塞的调用画出你的地图把项目里每一处「可能等」圈出来。本篇作业就是这张图。调用等什么典型超时堵住谁osDelay/sleep时间你写的毫秒当前任务队列 send队列满有人收0 / 永久 / 某 ms生产者常常是采集队列 recv队列空有人发同上消费者MQTT 发送任务互斥锁锁持有者释放死锁就永远所有需要这把锁的人信号量别人 giveUART 读 / 等 ATOK模组响应2s、5s、30s 都见过AT 任务若在采集里调采集也停同步 MQTT publishTCP 发送窗口 / 网络弱网可到数秒到数十秒调用者join/ 等线程结束另一任务超时设成「永远」是缺陷温床。测试要问开发这个 API 的 timeout 是多少0 是非阻塞还是错误失败返回后状态机回哪2.5 队列解耦采集只投递目标结构采集任务 --(短 timeout 入队)-- 消息队列 --(发送任务出队)-- MQTT / AT 按键任务 --(事件)------------/采集成功标准2 秒边界内把数据放进队列。队列满怎么办必须有规格丢最旧丢最新覆盖同一类型的上一包阻塞等待通常最差等于没解耦测试四条网络正常周期稳定队列深度常近 0网络变慢注入 delay周期仍稳定队列深度上升发送变慢队列满按规格丢包或报错采集任务不跟着延恢复网络队列排空不爆发式乱序导致云端状态错乱灯闪2.6 优先级反转、死锁、看门狗优先级反转低优先级拿着锁在跑中优先级就绪抢走 CPU高优先级卡在锁上。经典故事。测试不一定能稳定复现但你要能在缺陷单里写「怀疑反转」的证据高优先级任务阻塞在锁锁持有者是低优先级且迟迟得不到 CPU。有优先级继承的 mutex 时记录用的是哪一种锁。死锁A 拿锁等 BB 拿锁等 A。测试注入两个任务交叉拿锁故意调换顺序。产品代码里更常见的是「AT 锁 日志锁」嵌套顺序不固定。看门狗某个任务负责喂狗它被饿死或阻塞太久就复位。这会和第 2 篇死机重叠。差别是看门狗复位往往周期性地「活过来」日志出现完整启动横幅HardFault 可能连横幅都乱。拷机表要记复位次数和时间点不要写「挺稳偶尔重启一下」。公开文档说休眠前必须停掉仍访问掉电域的 DMA以及找首个错误。测试侧复位后不要只看最后一次 MQTT 超时要看复位前那个任务停在哪。2.7 双核不要用错核的日志解释现象TXW82xCPU0 AppCPU1 CoreLMAC / BLE / 802.11。公开 AT 还分成AT和AT1。测试卡顿时问CPU1 ready 有没有出现卡的是编码、SD、MQTT偏 CPU0还是关联、丢包偏 CPU1 / 射频两个核的日志时间能不能对齐学生没有该板就把这句话记进阻塞点地图的「原厂会多问的一列」。Hi3861 单核所有阻塞都在同一颗核上更要把采集和发送拆开否则没有第二颗核能救你。3. 周期抖动怎么测才叫测不叫试用规格若写「采样周期 2s」测试至少要连续 60 个点的时间戳平均、最大、最小间隔超过阈值例如 2.5s的次数同时记录 RSSI、是否正在重连、队列深度有则记表格seq t_ms delta_ms rssi note 1 0 — -48 2 2004 2004 -48 3 4001 1997 -49 ... 41 82100 8050 -79 mqtt retry「感觉差不多 2 秒」不是数据。第 1 篇说过形容词不要进实际结果。弱网注入和第 1 篇一样一次一个变量先在实验室 1m、RSSI 好的时候做基线周期再远离 AP不要同时改代码。4. 手把手实验下面三档按你手上的东西选一档做完即达标。档 A 最贴近岗位故事档 C 也能交作业但报告必须写「PC 近似不是板级 RTOS」。档 AHi3861 / LiteOS推荐目标证明同步发送会破坏 2s 周期队列解耦能保住周期。步骤环境表 ENV 照第 1 篇填。天线、AP、固件版本都要。采集任务每 2s 读传感器或假数据打印tick.... seq....。用 RTC 或osKernelGetTickCount不要用肉眼数串口。基线MQTT 不发或网络空闲采 30 个点填周期表。期望delta 在 2000±100ms按你规格改阈值。注入在采集任务里调用一次同步发送发送函数开头osDelay(3000)模拟弱网阻塞先不要真去堵路由器控制变量。再采 30 个点。记录delta 是否变成约 5s2s 周期 3s delay或更糟。修复对照采集只queue_send(timeout0 或短)delay 挪到发送任务。再采 30 个点。期望采集 delta 回到基线发送任务日志变稀。若有任务列表命令截图或抄注入时采集任务状态 Blocked 在 delay 还是在 socket解耦后采集 Ready/Delay 在周期等待。没有传感器打印假温度本篇不考 I2C。档 B主控 MCU ESP8266 ATAT 等待OK就是阻塞点。把ATCIPSEND或 MQTT 透传放在采集循环里把 AT 超时设成 3s观察采集打印。再把 AT 挪到单独任务。模组内部调度你看不到报告里写「主控侧阻塞」。档 CPC 近似无板用 Python 或 C 线程模拟。下面这段可以交但标题必须加教学注入。importthreading,time,queue qqueue.Queue(maxsize4)log[]defnow():returntime.time()defsampler_coupled():t0now()foriinrange(8):tnow()log.append((coupled,i,t-t0))time.sleep(2)time.sleep(3)# 模拟同步 MQTTdefsampler():t0now()foriinrange(8):tnow()log.append((decoupled_s,i,t-t0))try:q.put((t,i),timeout0.05)exceptqueue.Full:log.append((drop,i,t-t0))time.sleep(2)defsender():whileTrue:itemq.get()ifitemisNone:breaktime.sleep(3)# 模拟弱网发送q.task_done()print( coupled )sampler_coupled()print( decoupled )ththreading.Thread(targetsender)th.start()sampler()q.put(None)th.join()forrowinlog:print(row)期望你看到coupled 的相邻间隔约 5sdecoupled_s 仍约 2s并可能出现drop。把打印贴进作业。这不是 LiteOS它只证明控制流耦合和周期的关系。不要在面试里说「我用 Python 验证了 FreeRTOS 调度」。实验里必做的对照表无论哪一档交这一张条件采集间隔 max采集间隔 avg发送是否还在任务状态能看则写基线采集内 delay 3s队列解耦 发送 delay 3s队列满缩小队列再灌5. 缺陷单范文编号BUG-20261015-rtos-01 标题【RTOS】弱网注入下采集周期从 2.0s 变为约 5.0s云端命令窗口丢失3/3 严重级别严重 环境ENV-xxHi3861固件 agric_日期.binAP 1m本次只改采集任务内同步发送 delay3s教学注入 / 或真实断开 AP 10s 前置基线 30 点avg2002msmax2110ms 步骤 1. 打 tick 日志。 2. 注入阻塞写明哪一种一次只用一种。 3. 同时从云端下发灯开关 3 次。 4. 记录采集 delta 和灯是否执行。 期望采集 max ≤ 2200ms命令在 3s 内执行或有明确失败回读。 实际采集 max5120ms3 次命令丢 2 次。串口采集日志变稀心跳任务仍偶发打印。 概率3/3 初步分层应用任务阻塞发送耦合。不是射频RSSI -48扫网正常。 附件period.csv task-list.txt真实项目里若已经用队列解耦就不要伪造耦合缺陷。改测队列满丢包策略、发送任务自己被 AT 超时堵住、看门狗是否仍被喂。诚实比「必须有一张严重单」重要。云端命令丢失的分层提醒和第 10 篇预告采集日志还在不在 → 阻塞堆还在不在降 → 泄漏第 13 篇RSSI / 关联 → 射频关联TCP / MQTT → 第 6、10 篇本篇只把第 1 步做扎实。6. 换成泰芯公开场景会怎么变公开事实测试问法CPU0 / CPU1AT / AT1卡顿时两核日志都要不要用 DHCP 超时解释 CPU1 没起来高优先级 workqueue回调里有没有做了发送、写 SD、等锁有则周期和看门狗一起看找首个错误采集变慢可能是前面发送已经阻塞不要把症状当根因休眠循环看 heap 和唤醒唤醒后第一秒周期是否仍 2s还是任务没恢复SD 写入不要放在 ISR 或主 workqueue图传卡顿 周期烂先怀疑写卡堵了应用核中断日志不进 SD不要用 SD log 证明 ISR 没事没有原厂板用档 A/B/C 迁移「耗时回调不能放在高优先级路径」。国内仍不做 HaLow 发射。6.1 任务状态和栈水位没有 shell 时自己打笔试说 FreeRTOS 一般串口扩展命令看任务和剩余堆。现场可能什么命令都没有就要穷人插桩第 2 篇。周期打印一份就够不要每毫秒打。建议每 5 秒一行sys: up120s heapxxxx min_heapyyyy task: namesample stB prio5 stack_wm120 task: namemqtt stB prio10 stack_wm80 task: nameidle stR prio31缩写自己约定R ReadyB BlockedS Suspended。stack_wm 是剩余水位单位按 API。水位一路掉到接近 0回到第 2 篇栈溢出水位稳定但周期烂才是本篇的阻塞。LiteOS / FreeRTOS 具体 API 名称以你 SDK 为准不要抄一篇博客的函数名进报告。报告写「使用了 SDK 文档第 x 节的任务列表接口」或贴你封装的打印函数。看门狗实验可选教学注入找到喂狗任务或周期。在该任务里加 10s delay超过看门狗超时。期望复位启动横幅再现日志能算出间隔。对照delay 放在非喂狗的低优先级任务系统应仍活着除非你把整个核占死。不要在客户板上乱改看门狗超时来「试试」。教学注入只在自己的课设工程。6.2 云端命令丢失只用本篇工具走一遍现象点灯有时不亮。禁止立刻抓空口。按第 1 篇写 ENV然后本地按键是否立刻亮是则灯和驱动还在问题在云到设备的路径或任务。采集 tick 还在不在 2s 一拍停下或变稀 → 先当阻塞做耦合/解耦对照。tick 还在MQTT 发送任务日志停 → 发送阻塞或 TCP 已死本篇记下任务状态TCP 细节留给第 6、10 篇。两个任务都在仍丢命令 → 可能丢包、QoS、主题、云端本篇结论写「RTOS 未发现周期破坏」不要硬判阻塞。全程灯亮、tick 正常、但拷机 2 小时后才丢 → 带时间点可能泄漏第 13 篇或偶发阻塞。这就是方案测试本篇把 RTOS 这一刀切干净不把所有丢失都吞进「任务优化」。7. 30 秒口径任务阻塞是等锁、等队列、等网络任务还在不是死机。死循环占 CPU 会饿死别人。整机死机才是调度没了。我测采样周期的时间戳不靠灯。发送必须和采集解耦弱网时周期仍要在阈值内。双核方案还要问卡的是应用核还是无线核。8. 作业labs/week03/ env.md # 沿用第 1 篇追加任务优先级字段 period-baseline.csv period-coupled.csv period-decoupled.csv block-map.md # 阻塞点地图 states.md # 五种状态自己举一个日志例子 BUG-rtos.md note-limit.md # 若用了 Python 近似写清不是板级调度block-map.md最少 6 行按 2.4 的表填你的项目。没有项目就填「计划中的农业终端 / ESP8266 主控」虚拟路径但要标虚拟。states.md示例格式Ready采集 delay 结束那一瞬日志连续两拍间隔正常 Blocked耦合实验中采集停 3s发送函数未返回 Suspended本次未做写未做 死循环可选for(;;){} 教学注入看门狗是否复位 死机第 2 篇 overflow 或看门狗引用旧日志路径9. 自测题先闭卷采集从 2s 变成 10s灯还亮为什么不能写死机硬实时和软实时温湿度上报超时通常是哪一类继电器安全切断呢为什么「采集优先级更高」不能拯救同步 MQTT队列满时阻塞等待解耦还算不算成功Ready 和死循环占 CPU 怎么用日志区分看门狗复位应先查喂任务被谁堵住还是先换天线TXW82x 的 CPU1 没 readyCPU0 上的 RTSP 卡顿能直接当应用缺陷吗ESP8266 AT 模组上你为什么看不到 LiteOS 任务表周期表为什么必须有 max不能只有平均笔试里 FreeRTOS 没有 shell现场怎么看任务答案见附录。10. 学生常见翻车把阻塞、卡死、死机当同义词。不会看任务状态却说「我优化过调度」。只交耦合实验不解耦对照无法证明因果。同时弱网又 delay两个变量。Python 实验写成「验证了芯片调度器」。拷机结论「功能还在」不附周期表。优先级数字抄错方向记录里和代码相反。11. 下一篇预告第 4 篇《方案测试 90% 从串口开始AT 的发、等、校验、超时、重试》。阻塞点地图里如果已经圈了「等 AT OK」下一篇就把这条等写成可测的会话新行模式、错密码、超时、Wireshark 为什么抓不到 AT 文本。没有串口纪律RTOS 再清楚也进不了现场。附录 A. 自测题参考答案调度还在灯和部分日志还在只是采集任务被堵住。这是 Blocked 或周期破坏不是整机死机。上报超时多为软实时。安全切断到点必须断按硬约束测。高优先级任务自己调用了会阻塞的发送它会在发送里等别人抢不走这次等待。优先级不消灭同步 I/O。不算。采集仍可能在满队列上睡着。应短 timeout 明确丢包策略。Ready 会按优先级交替多任务日志都还在。死循环占 CPU 时低优先级日志停CPU 占用贴满可能很快看门狗。先查喂任务。天线是射频层复位横幅完整更像软件超时。当然供电 brown-out 也要记进环境一次一个变量。不能。先看 CPU1 ready 和无线日志。应用缺陷要在无线核正常之后再下。任务在模组固件里你的串口通常只是 AT 文本。要看主控 MCU 的 RTOS或模组厂商调试口若有。平均会把偶发 8s 稀释掉。规格卡的是上限和超阈次数。串口扩展命令、调试 API 打印任务列表和剩余堆。不要假装有 Linuxtop。附录 B. 公开资料与笔试笔试硬实时/软实时嵌入式 OS 特点与分类FreeRTOS 看任务和堆TXW82x FPV 文档双核职责、找首个错误、CPU1 readyTXW82x FPV ReleaseNote高优先级 workqueue、CPU 占用查询、中断日志限制农业终端测试 case周期、弱网、拷机看任务阻塞课程项目当载体不写成原厂量产附录 C. 阻塞点地图模板可直接填模块函数/AT等什么timeout失败后状态会堵住谁如何测采集周期表MQTT弱网注入AT第 4 篇日志关闭日志对照看门狗拷机复位时间点按键连按第 3 篇完
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/15 21:29:29
【研知有术论文发表】已升农林科学一区!农业生物工程SCI,非OA无版面费,审稿效率
2026/10/15 21:29:29
和小马一起学Python(四)——if、while、for、break continue、else语句
2026/10/15 21:29:29
AI获客与GEO优化实战:GEO生成式AI搜索如何提升AI搜索引擎排名
2026/10/15 22:29:37
离合器与活塞连杆组仿真分析:从边界条件到热-结构耦合实战
2026/10/15 22:29:37
VS2008+OpenCV2.x实现米粒计数与几何参数提取
2026/10/15 22:29:37
2025薪酬报告拆解指南:从分位值到调薪Offer的实战方法
2026/10/15 22:29:37
Python Anaconda创建虚拟环境及Pycharm使用虚拟环境详解
2026/10/15 22:29:37
Unity URP几何波水体:函数驱动水面顶点位移实现方案
2026/10/15 22:24:37
Agent友好型Web设计:从人机交互到机机协议的架构升级
2026/10/15 0:02:59
AI Coding时代的柔性之美:从静态软件到自演化软件,软件研发正在重新进化
2026/10/15 0:02:59
亨得利客户服务中心官方网点分布一览:2026年全国多城门店地址与最新联系电话公布
2026/10/15 0:02:59
防关联浏览器哪个好?三款产品实测差异解析
2026/10/13 12:25:09
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/14 18:35:19
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/14 14:52:59
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/15 1:07:55
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/15 5:07:59
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/15 8:10:01
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)