写点什么

征程 6 VIO Frame buffer 管理

  • 2025-04-24
    广东
  • 本文字数:1363 字

    阅读完需:约 4 分钟

征程 6 VIO Frame buffer管理

1.底层 buffer 状态机


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


1.FREE(空闲态)


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

  • 初始化操作 :

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

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

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


2.REQUEST(请求态)


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

  • 处理逻辑 :

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

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

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

  • 将 buffer 移入 REQUEST 队列


3.PROCESS(处理态)


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

  • 处理逻辑 :

  • 从 REQUEST 队列提取首帧 buffer

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

  • 启动硬件模块数据处理


4.COMPLETE(完成态)


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

  • 处理逻辑 :

  • 从 PROCESS 队列提取完成帧

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

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


5.USED(用户态)


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

  • 处理逻辑 :

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

  • 返回 frame buffer index 至用户空间

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

2.HAL 层交互


  • 初始化阶段



  • 帧获取阶段:



用户调用 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 使用完毕;

3.调试举例

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


 E/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dev_node_dqbuf_poll][1012]dev poll Timeout(4000): 0, Success I/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dbg_log_show][964] I/        ( 2087): [S9] vin4_C2*-m2m-(dma)pym1_C6*(dma) I/        ( 2087): gtask-vin4: res 1 rcnt 0 [vin4:0] I/        ( 2087): gtask-pym1: res 0 rcnt 0 [pym1:0] I/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dbg_log_show][964] I/        ( 2087): ---------------------------------------------------------- I/        ( 2087): flowid    module    cid chn   FREE   REQ   PRO   COM  USED I/        ( 2087): ---------------------------------------------------------- I/        ( 2087): 9         vin4      2   0       16     0     0     0     0 I/        ( 2087): 9         vin4      2   8        0     6     0     0     0 I/        ( 2087): I/        ( 2087): 9         pym1      6   0       10     0     0     0     6 I/        ( 2087): 9         pym1      6   8        0     0     0     0     5
复制代码


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


用户头像

还未添加个人签名 2021-03-11 加入

还未添加个人简介

评论

发布
暂无评论
征程 6 VIO Frame buffer管理_自动驾驶;_地平线开发者_InfoQ写作社区