当前位置: 首页 > article >正文

一次32bit有符号数据类型转换为64bit无符号数据类型引发的溢出错误

现象:

        在调试一款sensor,通过10帧->8帧->6帧,这样不断的降低帧率调试低照度下的图像效果。ISP配置文件上设置的最大曝光曝光参数为:

EXP:15266  Again:15494 Dgain:714  ISPDGain:1360。

当达到最低帧率最低亮度时,其调试工具界面上应该显示的也应该是如上最大的AE参数。

但实际情况是:在图像调试工具上显示的AE参数时,ispdgain显示居然可以达到1416,超过了isp配置中所设定的最大ispdgain阈值。
    

原因:

      当AE参数为:EXP:15266  Again:15494 Dgain:714  ISPDGain:1360,在驱动库调用接口设置相应节点EV值的时候,
      由于保存AE节点的数据类型都是设置的有符号的int类型,其最大值范围为-2147483648~2147483647,计算机中负数以补码的形式保存,故对应的二进制为:(10000000   00000000    00000000   00000000) ~(01111111   11111111   11111111  11111111)

    在计算节点最大EV值的时候,代入相应的曝光参数计算得到最大EV值为: 3360890160
    3360890160 转换为二进制为:11001000  01010011  00011101  00110000,已经超过了int的最大范围了。由于驱动库内部把最大EV值定义为无符号的64bit数据类型。转换为无符号的64位时,需要根据32位的最高位对64位高位的进行补充操作。即底层在转换将有符号数据类型转换为无符号的时候,需要根据高位进行判断,最高位是1的话则用1进行扩展高位,是0的话则用0进行扩展高位。
    即有符号的32bit 3360890160 转换为无符号的64bit类型时,转换得到如下二进制数值:
    11111111   11111111   11111111   11111111  11001000  01010011  00011101  00110000,转换为10进制为:18446744072775474480。因此对应节点最大的EV值为: 18446744072775474480
         
        AE算法逻辑计算的EV值超过最大EV值的时候,本应该限制到最大值。但是由于现在32bit 有符号转换为64bit无符号过程中,中间乘积出现了溢出情况,导致最大的EV值比实际的最大EV值大很多,无法进行最大值的EV值的限制。相当于最大EV值的限制操作失效了。
        后续调整曝光参数的过程中,特别是的照度下比较暗的情况下计算出来的EV值可能超过最大EV值,导致调试界面上显示的AE参数会超过配置文件中设置设置的最大曝光参数值。

        虽然sensor驱动会对相关的AE参数最大值进行限制,但是在应用中是通过ISP 驱动库相关的接口获取当前的AE参数,如果此时应用再将这些获取的AE操作做些逻辑处理时,可能就会引发一些错误行为。
   

措施:

        将相关节点AE参数数据类型由32bit 有符号的数据类型定义为64bit 无符号类型


http://www.kler.cn/a/382149.html

相关文章:

  • 【已解决】黑马点评项目Redis版本替换过程中误删数据库后前端显示出现的问题
  • GMSSL的不同python版本
  • CSPM认证最推荐学习哪个级别?
  • 数据库管理系统——数据库设计
  • 基于DockerCompose搭建Redis主从哨兵模式
  • MySQL深度解析:高效查询优化与实战案例
  • 各地级市能源消耗量数据-基于灯光数据的反演(2000-2022年)
  • 在 Hive SQL 中判断字段是否包含指定字符串的几种方法
  • 安卓内核内存回收
  • RHCE-SElinux+防火墙
  • Git 测验
  • JavaScript数据类型- BigInt详解(处理任意大小整数的终极指南)
  • C#应用随系统启动 - 开源研究系列文章
  • Tornado简单使用
  • React中 useEffect 的原理
  • Python数据可视化seaborn
  • Idea如何推送项目到gitee
  • 使用 Python 写一个后端程序的项目方案
  • JDK 安装、环境变量配置、nano 和 vim 的使用
  • Fastify Swagger:自动化API文档生成与展示
  • Docker cp命令详解及实战案例
  • Python并发编程——multiprocessing
  • 自动化仓库堆垛机结构解析
  • 2025年山东省考报名流程图解
  • 基于stm32的火灾报警系统(开源)
  • vue使用方法创建组件