
1. 为什么AOV全天录像是个值得啃的硬骨头做嵌入式视觉这行的朋友都知道一个尴尬的现实想让设备全天候录像功耗和发热基本压不住想压低功耗就得牺牲录像的连续性变成事件触发。君正T32这颗芯片出来之后AOVAlways On Video这个概念在低功耗IPC圈子里被反复提起它想解决的就是这个两难——既要全天录像又要把整机平均功耗压到电池能扛住的水平。我前后用T32做过几版AOV方案从最初点亮sensor到最终把待机功耗压到毫安级中间踩的坑比想象中多。这篇就把整个从零构建的过程拆开讲包括芯片选型的逻辑、AOV的底层机制、低功耗设计的取舍、以及实际调试中那些文档里不会写的细节。适合正在做低功耗视觉产品、或者想入门嵌入式Linux视觉开发的工程师参考有C基础和Linux驱动概念就能跟上。先说清楚AOV到底是个什么东西。传统IPC要么一直全速跑功耗高要么靠PIR或雷达触发唤醒会漏录。AOV的思路是让sensor和主控维持在一个极低功耗的“常开”状态持续以低帧率采集一旦检测到有效画面再拉高帧率和编码规格。这样既保证了时间轴上的连续性又把大部分时间的功耗压下来。T32在这套逻辑里扮演的角色是它内置的智能编码和低功耗管理单元能配合sensor做这件事不需要外挂一颗MCU来管电源。2. 方案整体设计与核心器件选型2.1 T32在AOV架构里的定位君正T32属于T系列里偏视觉处理的SoC内置ISP、视频编码单元和一定的AI算力。做AOV方案时它的核心价值不在算力多强而在于低功耗状态下的快速唤醒和编码连续性。整个系统的分工大致是这样sensor负责采集T32负责ISP处理、编码和逻辑判断电源管理IC负责给各模块分时供电WiFi或4G模块负责传输。我选T32而不是其他方案主要看中三点。第一是它的低功耗模式切换足够快从浅睡到全速编码的唤醒时间在百毫秒级这个对AOV的“事件响应”体验很关键。第二是内置ISP省了一颗外置ISP的成本和功耗。第三是SDK相对成熟君正的开发包在低功耗IPC这块积累了不少参考代码能少走弯路。2.2 sensor与电源方案的搭配逻辑sensor这块我试过几款最终倾向选支持低功耗常开模式的型号。关键参数是它在低帧率下的功耗和唤醒延迟。有些sensor虽然标称功耗低但唤醒后要重新做一遍自动曝光收敛画面会闪一下这种在AOV场景里体验很差。选型时要重点看sensor是否支持快速唤醒且保持寄存器上下文。电源方案是AOV的命门。我的做法是把系统分成几个电源域sensor常开域、T32主域、通信模块域。常开域用一颗低静态电流的LDO单独供保证sensor在待机时能持续工作主域和通信域用DC-DC加负载开关按需上电。这里有个容易忽略的点——LDO的静态电流quiescent current如果选大了光这一项就能把待机功耗吃掉好几毫安。我一般要求常开域LDO的静态电流在微安级。模块供电方式待机功耗目标选型要点Sensor常开域低静态LDO微安级静态电流小、唤醒快T32主域DC-DC负载开关毫安级转换效率高、纹波小通信模块独立负载开关按需上电支持快速重连存储低功耗eMMC/SD可断电写入速度够用即可2.3 为什么不做纯事件触发有人会问既然要省电为什么不干脆用PIR触发平时完全断电这就是AOV和传统触发式的本质区别。纯触发式有两个硬伤一是触发前的画面丢了取证时经常发现关键帧在触发之前二是PIR本身有误触发和漏触发风吹草动就录真正需要的时候反而没录上。AOV用低帧率常开换来了时间轴的完整性代价是待机功耗比纯触发高一点但换来的是可靠性。这个取舍在安防、宠物监控、车载监控这些场景里可靠性往往比那点功耗更重要。3. 低功耗机制拆解与关键参数计算3.1 AOV的功耗模型怎么算要压功耗先得会算账。整机平均功耗可以拆成三部分常开域功耗、主域工作功耗、通信功耗再按时间占比加权。公式大致是P_avg P_always P_main × D_main P_comm × D_comm其中D是占空比。举个例子常开域如果做到200微安主域全速时500毫安但每天只工作2小时D2/24≈0.083通信模块平均100毫安工作1小时D≈0.042那平均功耗大约是P_avg 0.2mA 500mA×0.083 100mA×0.042 ≈ 0.2 41.5 4.2 ≈ 45.9mA这个数字看着还行但要注意这是“每天有2小时事件”的假设。如果事件很少主域占空比降到0.5小时平均功耗能压到12mA左右。所以AOV方案的实际续航很大程度上取决于事件频率和主域唤醒后的处理效率。优化方向很明确降低常开域底噪、缩短主域唤醒时间、提高单次事件的处理速度。3.2 唤醒时间对功耗的隐性影响很多人只盯着稳态功耗忽略了唤醒过程本身也耗电。T32从浅睡唤醒到能编码中间要经历时钟稳定、DDR初始化如果断电、ISP重新配置这些步骤。如果每次唤醒要花300毫秒而这300毫秒里电流是峰值那事件频繁时这部分累积起来很可观。我的优化经验是尽量用浅睡而不是深睡。浅睡保留DDR和部分上下文唤醒快但静态功耗略高深睡省电但唤醒慢。AOV场景下如果事件间隔短浅睡更划算如果事件很稀疏深睡更优。这个阈值要实测我一般会画一张“事件间隔 vs 平均功耗”的曲线找交叉点来定策略。3.3 编码参数与功耗的平衡编码规格直接影响主域功耗。分辨率、帧率、码率、编码格式H.264还是H.265都会影响。H.265同画质下码率低但编码计算量大功耗可能反而高。在T32上实测1080P15fps的H.264编码功耗比H.265低一截而画质差距在监控场景里可以接受。所以AOV方案里我倾向用H.264把省下来的算力功耗留给更重要的地方。帧率策略也要分层。常开状态用1到2帧每秒做“哨兵”检测到事件后拉到15到25帧每秒。这个切换要平滑不能让画面出现明显跳变。T32的编码器支持动态改帧率但改的时候要处理好GOP边界否则会出现花屏。我一般会在切换前先强制一个I帧再改参数。4. 从零搭建的实操过程4.1 开发环境与SDK准备君正T32的开发环境搭建不算复杂但有几个坑。官方SDK一般给的是基于Buildroot的整套包交叉编译工具链在SDK里自带。我习惯在Ubuntu下做先把工具链加到PATH然后按文档编译一遍完整镜像确认能跑起来再动代码。这里提醒一句SDK里的默认配置往往是给全速IPC用的功耗相关的宏默认是关的。要先把低功耗相关的配置项打开比如CONFIG_PM、CONFIG_SUSPEND这些再重新编译内核。我第一次做的时候没注意烧进去发现根本进不了低功耗模式查了半天才发现是内核配置没开。# 进入SDK目录后先看默认配置 make menuconfig # 在Power management里打开suspend和runtime pm # 保存后重新编译 make -j84.2 电源域的硬件验证软件之前先验硬件。把板子上的电源域一个个量一遍确认待机时各域的电流符合预期。我一般会用一个高精度的电流表串在总电源上然后分别断开各模块看电流变化定位“漏电”的模块。实测中遇到过几个典型问题。一个是负载开关的使能脚悬空导致模块没真正断电静态电流一直存在另一个是某个上拉电阻在待机时形成回路白白耗电。这些都要在硬件阶段解决软件再怎么优化也救不了硬件漏电。提示量待机电流时一定要等系统完全进入低功耗状态再读数刚上电的瞬间电流是峰值没有参考意义。我一般等30秒以上再记录。4.3 低功耗模式的软件配置T32的低功耗模式配置主要在设备树和驱动里。设备树里要正确描述各电源域的GPIO控制驱动里要实现suspend和resume的回调。关键是把sensor、通信模块、存储这些外设的电源控制接进来。// 简化的suspend回调示例 static int aov_suspend(struct device *dev) { // 关闭通信模块电源 gpio_set_value(PWR_COMM_GPIO, 0); // 关闭存储电源 gpio_set_value(PWR_STORAGE_GPIO, 0); // 配置sensor进入低功耗常开模式 sensor_enter_low_power(); return 0; }resume的时候要反过来并且注意顺序。先给存储上电再给通信上电最后配置sensor恢复正常模式。顺序错了可能导致外设初始化失败。这个顺序在调试时经常被忽略表现就是唤醒后WiFi连不上或者SD卡挂载失败。4.4 AOV状态机的实现AOV的核心是一个状态机管理“常开低帧率”和“事件高帧率”之间的切换。我用的是一个简单的三状态机IDLE常开、DETECT检测中、RECORD高帧率录像。IDLE状态下sensor跑1fpsT32做轻量级的运动检测。检测算法不能太重否则功耗下不来。我用的是基于帧差的简单算法只在ROI区域算算力开销很小。一旦连续几帧检测到运动切到RECORD拉高帧率并开始正常编码存储。RECORD持续一段时间没有运动后回到IDLE。typedef enum { STATE_IDLE, STATE_DETECT, STATE_RECORD } aov_state_t; void aov_tick(void) { switch (state) { case STATE_IDLE: if (motion_detected()) { force_i_frame(); set_framerate(15); state STATE_RECORD; record_timer 0; } break; case STATE_RECORD: record_timer; if (!motion_detected() record_timer HOLD_FRAMES) { set_framerate(1); state STATE_IDLE; } break; } }这个状态机看着简单但实际调的时候参数很讲究。HOLD_FRAMES太短会导致频繁切换太长会浪费功耗。我一般设成事件结束后再录10到15秒给取证留足上下文。4.5 存储与传输的省电策略存储这块AOV常开状态下其实不需要一直写。我的做法是IDLE状态只把低帧率画面缓存在内存环形缓冲里不落盘切到RECORD才真正写存储。这样存储大部分时间可以断电省不少功耗。传输同理。常开状态不传事件发生才建立连接传数据。但这里有个体验问题——如果每次事件都重新连WiFi连接时间可能好几秒事件都过去了。我的折中是让通信模块保持一个极低功耗的“心跳”连接事件时快速拉起来传数据。这个心跳的间隔要权衡太密费电太疏重连慢。5. 调试中踩过的坑与排查技巧5.1 唤醒后画面异常最常见的坑是唤醒后第一帧画面异常要么过曝要么偏色。原因是sensor在低功耗模式下寄存器上下文丢了唤醒后自动曝光和自动白平衡要从头收敛。解决办法是选支持上下文保持的sensor或者在唤醒后先丢几帧不编码等收敛稳定了再开始录。我遇到过一款sensor唤醒后要差不多1秒才收敛好。这1秒如果直接录画面就是废的。后来在状态机里加了个“预热”阶段唤醒后先跑几帧不写存储等ISP稳定了再正式录。这个细节文档里不会写但不处理的话录像质量没法看。5.2 功耗压不下去的排查思路功耗压不下去时按这个顺序排查效率最高排查项常见问题验证方法常开域LDO静态电流偏大单独量LDO输入电流负载开关未真正断电量模块供电脚电压GPIO状态悬空或上拉漏电逐个量GPIO待机电平时钟未关闭的时钟源查时钟树配置DDR未进自刷新查DDR控制器状态我一般先用热成像看板子哪里发热发热的地方往往就是漏电的地方。这个方法很土但很有效能快速定位问题区域。5.3 频繁唤醒导致的功耗反弹有次调完发现平均功耗比预期高不少查下来是运动检测太灵敏风吹树叶都触发导致主域频繁唤醒。唤醒本身耗电频繁唤醒把省下来的电又吃回去了。后来调高了检测阈值并且加了“冷却时间”两次事件之间至少间隔几秒功耗才降下来。这个经验说明AOV的功耗优化不只是硬件和底层的事检测算法的调参同样关键。灵敏度、ROI、冷却时间这些参数要结合实际场景调没有万能值。5.4 常见问题速查唤醒后WiFi连不上检查通信模块上电顺序确保在T32主域稳定后再上电。录像文件损坏检查存储断电时机确保文件系统sync完成后再断电。待机电流忽高忽低多半是某个模块在周期性唤醒查定时器任务。事件漏录检测算法阈值太高或ROI没覆盖到适当放宽。唤醒时间过长检查是否进了深睡考虑改浅睡。6. 几个容易被忽略的优化细节6.1 环形缓冲的大小设计IDLE状态下的环形缓冲大小要能覆盖“事件发生前”的一段时间。我一般按常开帧率和需要的回溯时长来算。比如1fps、想回溯10秒那缓冲至少要存10帧。但帧大小随场景变化要留余量。缓冲太小会导致事件前的画面被覆盖太大浪费内存。这个值我一般设成理论值的1.5倍。6.2 时间戳的连续性AOV方案里IDLE和RECORD两段录像的时间戳要能对上否则回放时会发现时间跳变。我的做法是统一用一个单调递增的时间基准两段录像都用这个基准打时间戳。这样即使中间有状态切换回放时时间轴也是连续的。这个细节在取证场景里很重要时间戳断了证据链就不完整。6.3 温度对功耗的影响低功耗方案在实验室和实际环境表现可能不一样。温度升高会让漏电流增大待机功耗上升。我做过的方案在常温下待机200微安到了夏天户外可能到300微安以上。所以设计时要留功耗余量别把电池算得太死。另外sensor在高温下噪声也会变大可能影响检测算法的准确性这个也要在实测中验证。6.4 固件升级的省电考虑AOV设备往往装在不好够到的地方固件升级要能远程做。升级过程本身耗电而且升级时不能断电。我的做法是升级前先确认电量充足升级时临时拉高主域供电升级完再回低功耗。升级包也要做校验防止传输出错导致设备变砖。7. 实际部署中的经验体会整套方案跑通之后我在几个场景里实际部署过。室内宠物监控场景下事件频率中等电池能撑两周左右户外场景事件少但温度变化大续航反而更稳定。这印证了前面说的——AOV续航高度依赖事件频率。我个人在实际操作中的体会是AOV方案最难的不是某个单点技术而是系统级的功耗平衡。硬件、驱动、算法、参数任何一环没调好最终功耗都下不来。而且这个平衡点会随场景变没有一劳永逸的配置。我的建议是先把功耗模型算清楚知道每一毫安花在哪里再针对性优化比盲目试参数高效得多。另外分享一个小技巧调试阶段可以在代码里加一个功耗统计模块记录各状态的时间占比和对应电流跑一天下来就能看出功耗都花在哪了。这个数据比拍脑袋调参靠谱得多。后续如果要做更极致的低功耗可以考虑把运动检测放到sensor端做让T32主域睡得更深这是下一步可以扩展的方向。