本帖最后由 dffzh 于 2025-4-24 19:35 编辑
#申请原创#
@21小跑堂
刚入公司时,开发了一款产品,当时遇到一个软件Bug,由于那个时候对整个协议栈不是很熟悉,确实花了一些时间和精力才解决;
现在回想一下,其实在有些时候,特别是刚入新公司或者接触新产品时,遇到一些问题什么的,也并不一定是坏事吧,起码我是这么认为的!为什么这么说呢?等作者与大家详细分享完这个Bug的排查和解决过程,你也许就知道了......
一、问题描述
问题最终呈现为xml文件一致性测试问题,如下图:
错误的详细信息如下: 0x1C32 : C SI0 Complete Access data is different toSingle Access data, although the entry description provides default data,翻译为: CSI0完全访问数据不同于单一访问数据,尽管条目描述提供了默认数据。 0x1C32 ‘SM output parameter’: Comparsion of SI0 complete access data tosingle access data failed,翻译为: 将SI0完整访问数据与单次访问数据进行比较失败。
二、问题排查1、xml文件分析 所用的xml文件除了EEPROM节点的一个字节和之前模块的不一样,其余全部相同; 2、MCU软件分析 xml一致性测试的问题都是关于索引 0x1C32的,而该索引对应的对象是存放同步管理器参数的:
其对象字典存放在一个通用数组 GenObjDic 中:
这块的内容和原模块是一样的,因为是通用的对象字典,没做任何修改。 和0x1C32类似的是0x1C33:
疑问: 为何只有0x1C32产生报错信息? 对比原来模块和现在模块的软件协议栈:配置是一致的,因此也基本排除这个原因。 后面将问题的详细信息发给一位资深开发同事,经分析后,让尝试将代码里的PDI_Isr函数的以下两句代码屏蔽掉试试: 经应用测试后,xml一致性问题未出现; 至此,至少是找到了问题产生的直接原因;但是根本原因是什么呢? 正常来说,在程序运行正常的情况下,是不会进入这个if语句的;但通过仿真发现,现在会执行这段代码: 怀疑是PDI_Isr这个函数执行的有问题? 在代码里查找,发现有2个地方调用了这个函数:
1、 PDI中断调用,即正常情况下触发一次PDI中断就执行一次这个函数; 2、 MainLoop里调用,即判断为PDI中断异常丢失后句执行一次这个函数; 通过Keil IDE+Jlink工具进行在线仿真后发现,是一直在MainLoop里执行PDI_Isr,但正常情况是只在PDI中断里执行,难道是PDI中断一直没进去??? 真相逐渐浮出水面… 打断点调试,PDI中断的确未触发。 正常情况下,只要连上主站,PDI中断会根据设置的扫描周期循环触发的。
和同事沟通了一下,他怀疑是不是没有配置PDI中断对应的从站9252的寄存器? 打开另外一个模块的代码,看HW_Init函数里的初始化配置,真的有对应的寄存器配置代码: 而现在模块的代码里没有这块配置; 添加这块代码后,马上验证,果不其然,可以正常触发PDI中断了;且之前的那段if语句代码也不会再执行了。 到这里,问题的根本原因应该是找到了。
三、总结
估计很多网友看过此帖以后,会觉得主要原因是对代码或协议栈或产品通用性不熟悉造成的,其实我也认可;
之所以想把这个Bug排查和分析写出来形成文章,主要是想告诉初入职场从事软件开发的朋友们,有时候遇到Bug问题,不要慌,因为这对你来说,可能并不是坏事;实践出真知,当你在对这个业务流程不是很熟悉的情况下,通过花费一定的时间和精力把遇到的Bug解决,当你解决掉Bug的时候,你真的对什么都熟了,包括产品代码框架,协议栈和相关芯片数据手册等,你得到的会很多很多.....
|