打印
[其他产品]

Bug解决的时候,你对什么都熟了

[复制链接]
96|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-4-24 19:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的时候,你真的对什么都熟了,包括产品代码框架,协议栈和相关芯片数据手册等,你得到的会很多很多.....



61908680a1e0bc7dd7.png (19.83 KB )

61908680a1e0bc7dd7.png

使用特权

评论回复
沙发
chenqianqian| | 2025-4-24 21:28 | 只看该作者
解决的bug越多,经验积累越丰富

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

160

帖子

3

粉丝