一次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 无符号类型