4. HAL层AI调度框架设计
在Camera HAL层引入AI场景识别后,调度框架需要同时处理来自ISP的实时帧数据流与AI推理任务。本章聚焦于HAL层AI任务调度器的架构设计、优先级队列的实现策略以及实时性约束分析,确保AI推理不阻塞主流水线,同时满足场景切换的响应延迟要求。
4.1 HAL层AI任务调度器架构
调度器采用分层解耦设计,将AI任务的生命周期管理与Camera HAL的帧处理流水线分离。核心架构包含三个层次:
- 任务接入层:接收来自3A算法、ISP统计模块、应用层的AI推理请求,统一封装为
AiTask结构体。 - 调度决策层:基于优先级、帧时间戳、当前负载状态,决定任务入队、抢占或延迟。
- 执行引擎层:管理NPU/DSP/GPU硬件资源池,负责任务分发与结果回收。
设计原则:调度器不直接持有AI推理硬件句柄,通过抽象接口
IExecutor与底层驱动交互,便于跨平台移植。
4.2 优先级队列设计
AI任务根据场景敏感度和帧截止时间划分为四个优先级等级。队列内部采用多级反馈机制,允许高优先级任务抢占低优先级任务的执行槽位。
| 优先级等级 | 典型任务 | 最大延迟容忍 | 抢占策略 |
|---|---|---|---|
| 实时 (P0) | 人脸检测、运动跟踪 | < 8 ms | 立即抢占,不可阻塞 |
| 高 (P1) | 场景分类、HDR触发 | < 16 ms | 等待当前帧完成,下一帧抢占 |
| 中 (P2) | 物体识别、夜景模式 | < 33 ms | 排队等待,可被P0/P1抢占 |
| 低 (P3) | 场景统计、日志分析 | > 100 ms | 空闲时执行,可被所有高优先级抢占 |
队列实现要点:使用
std::priority_queue配合自定义比较器,比较器同时考虑优先级等级和任务入队时间戳,避免低优先级任务无限饥饿。
4.3 实时性要求分析
Camera HAL层对AI调度有严格的实时性约束,主要来自三个维度:
- 帧同步实时性:AI推理结果必须在下一帧ISP处理开始前返回,否则场景决策失效。典型帧间隔为33ms(30fps)或16ms(60fps)。
- 场景切换响应:从暗光切换到夜景模式,或从普通场景切换到人像模式,AI调度器需在3帧以内完成模型切换与预热。
- 资源竞争隔离:AI推理任务不得占用超过30%的NPU算力,预留资源给3A算法和ISP后处理。
4.4 调度策略与关键指标
调度器综合使用以下策略来满足实时性要求:
| 策略 | 触发条件 | 效果 |
|---|---|---|
| EDF调度 | 同优先级队列内 | 截止时间最早的任务优先执行 |
| 优先级继承 | 低优先级任务持有锁 | 临时提升持有锁任务的优先级,避免死锁 |
| 任务降级 | 连续超时超过3次 | 降低模型精度或跳过非关键帧 |
| 负载均衡 | NPU利用率 > 80% | 将部分推理任务卸载到DSP或CPU |
避坑提示:不要将所有AI任务都设置为P0优先级。过度使用高优先级会导致低优先级任务饥饿,进而影响场景统计和长周期优化。建议P0任务占比不超过总任务量的10%。
4.5 调度器性能基准
在典型骁龙8 Gen3平台上,调度器引入的额外开销应控制在以下范围内:
- 调度决策延迟:< 50 μs(从任务入队到开始执行)
- 上下文切换开销:< 10 μs(任务间切换)
- 内存占用:< 512 KB(包含队列、任务描述符、状态缓存)
- 最大队列深度:64个待处理任务(防止内存爆炸)
调度器通过无锁队列和内存池技术减少锁竞争和动态分配,确保在极端场景下仍能稳定运行。