第 116 / 120 课 · 隔离与综合工程案例。返回课程合集。
机制与资源关系
无图沿供电、控制、出流、接收、ISP、缓冲和应用逐层检查。花屏关注格式、stride、缓存和缓冲复用;丢帧关注帧序号、队列深度及各段处理速率。三种现象可能共享根因,也可能完全不同。
实际用法与观察入口
以下是操作说明;先确认执行环境、工具帮助和目标对象。设备名、PID、地址及项目名示例需要按实际替换,不能将整段命令当通用板端脚本执行。
|
输出解读与排查顺序
保持 sensor mode 和输入场景一致,先保存原始帧再测试模型。不要一边改 ISP 参数一边换缓冲格式。DMA 完成与 CPU 可读、应用消费完成分别记录。
情境推演
帧日志从 11 跳到 14,同时应用启用了“只取最新帧”,跳号可能是主动策略。需要记录策略与丢弃位置,不能仅凭序号间断认定 CSI 丢包。
练习与参考分析
用样例帧日志找序号间断与持有缓冲增长。参考结论:只看到帧号跳跃不能区分采集端丢失与应用主动丢弃,需要记录丢弃位置和原因。
独立实验包
Python 标准库;构造帧序号和持有量,未接入摄像头。 默认入口、源文件和实际运行记录都在下载包中。
实验:案例:摄像头无图、花屏与丢帧
查看完整代码:main.py
import csv
from pathlib import Path
with Path(__file__).with_name("frames.csv").open(newline="") as stream:
rows = list(csv.DictReader(stream))
ids = [int(row["frame"]) for row in rows]
held = [int(row["held_buffers"]) for row in rows]
gaps = [(a, b) for a, b in zip(ids, ids[1:]) if b != a + 1]
assert gaps == [(11, 14)] and held == [1, 2, 3, 4]
print("constructed frame gap:", gaps)
print("held buffers:", held)
print(
"clues only: need source sequence, drop policy and release records to identify cause"
)
在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。
cd 'content/posts/驱动、bootloader、文件系统/嵌入式Linux系统工程/116-案例:摄像头无图、花屏与丢帧/code' && python3 main.py
官方资料与版本边界
内核、工具和厂商 BSP 的支持范围需分别核对。参考资料可能对应较新版本;不要据此推定旧 BSP 支持所有接口。