专栏中心

EEPW首页 > 专栏 > 征程 6 VIO Frame buffer管理

征程 6 VIO Frame buffer管理

发布人:地平线开发者 时间:2025-04-24 来源:工程师 发布文章

1.底层 buffer 状态机

img

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

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 层交互

img

初始化阶段

层级操作内容
HAL 层申请用户态 buffer 空间
驱动层分配内核态 frame buffer
协同操作建立双向地址映射关系

帧获取阶段:

aW1hZ2U=.png

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

帧释放阶段:

aW1hZ2U=.png

用户调用 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 都被用户层拿走了,进而导致用户获取帧失败,需要用户查看自己的持有帧逻辑和归还逻辑;


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

关键词: 算法 自动驾驶 算法工具链 地平线 征程5

相关推荐

ADI:传感技术助力未来自动驾驶的发展

视频 2020-03-16

PID算法

资源下载 2007-02-16

地平线HSD引领智能驾驶普惠新时代

物理人工智能如何在自动驾驶和电动汽车中应用?

英伟达 “全天候” 芯片实现毫秒级人脸检测

自动驾驶的时代,呼唤线控底盘

数字PID控制算法之一

资源下载 2007-12-28

CRC算法原理及C语言实现

资源下载 2007-02-16

加密算法之MD5算法

ZF与SiliconAuto推出用于自动驾驶的实时I/O芯片

采埃孚与SiliconAuto推出自动驾驶实时I/O接口芯片

76-81GHz自动驾驶CMOS RADAR

视频 2018-05-31

携手ADI赢得未来

视频 2019-11-08

为什么可扩展高性能 SoC 是自动驾驶汽车的未来

汽车电子 2026-03-06

日产联手优步与 Wayve,计划在东京推出自动驾驶出租车服务

赋能自动驾驶和机器人感知,读懂二维可寻址VCSEL | 硬科技有点意思

英伟达宣布与比亚迪、吉利展开自动驾驶业务合作

2026-03-17

简单实用的单片机CRC 快速算法

资源下载 2007-02-16

自动驾驶的现状与未来(节选)

视频 2020-03-16

加快实现自动驾驶(完整小组讨论)

视频 2020-06-12
更多 培训课堂
更多 焦点
更多 视频

技术专区