专栏感知J6 VIO Frame buffer管理

J6 VIO Frame buffer管理

新手村2025-03-12
101
0

底层buffer状态机

系统通过五个状态队列实现帧缓冲区的全生命周期管理,各状态定义及转换逻辑如下:

  1. FREE(空闲态)

  • 功能描述 :管理初始可用缓冲区

  • 初始化操作 :

    • 场景运行时预分配所有 frame buffer 数组至该队列

    • 记录 buffer 的内核虚拟地址及物理地址信息

  • 数据结构 :frame buffer 结构体存储地址映射关系

  1. REQUEST(请求态)

  • 状态转换触发 :用户层调用 qbuf 接口

  • 处理逻辑 :

    • 解析用户传入的 frame buffer index 参数

    • 校验目标 frame buffer 状态有效性

    • 更新 buffer 元数据并置为 REQUEST 状态

    • 将 buffer 移入 REQUEST 队列

  1. PROCESS(处理态)

  • 状态转换触发 :Frame Start 硬件中断

  • 处理逻辑 :

    • 从 REQUEST 队列提取首帧 buffer

    • 置为 PROCESS 状态并压入处理队列

    • 启动硬件模块数据处理

  1. COMPLETE(完成态)

  • 状态转换触发 :Frame End 硬件中断

  • 处理逻辑 :

    • 从 PROCESS 队列提取完成帧

    • 置为 COMPLETE 状态并移入完成队列

    • 生成帧元数据(时间戳、帧ID等)

  1. USED(用户态)

  • 状态转换触发 :用户调用 dqbuf 接口

  • 处理逻辑 :

    • 检测 COMPLETE 队列非空时触发状态转换

    • 返回 frame buffer index 至用户空间

    • 将 buffer 置为 USED 状态并移入用户队列

HAL层交互

  • 初始化阶段

层级

操作内容

HAL 层

申请用户态 buffer 空间

驱动层

分配内核态 frame buffer

协同操作

建立双向地址映射关系

  • 帧获取阶段:

用户调用hb_vio_get_data接口,HAL通过dqbuf操作从驱动层获取包含帧识别信息,帧识别信息包含frame index,timestamp,frame id等帧信息,通过frame index,找到数组中的image结构体,并把相关的帧识别信息赋值到image结构体中,最后memcpy给用户;

  • 帧释放阶段:

用户调用hb_vio_free_xxxbuf接口(每个模块都有对应的释放接口)传入需要释放的image信息,HAL通过获取image信息中的frame index识别标志,通过ioctl接口通知驱动层对应frame index的buffer使用完毕;

调试举例

常见调用获取帧失败,可通过logcat查看对应的buffer状态,并通过分析对应的buffer状态信息,可以定位问题的出错点:

通过出错通路的buffer状态可知,PYM1的输出buffer都在USED队列,说明底层buffer都被用户层拿走了,进而导致用户获取帧失败,需要用户查看自己的持有帧逻辑和归还逻辑;

感知
社区征文征程6技术深度解析
评论0
0/1000