案例 1
试验环境:CPX8216 CPCI 机架、vxWorks操作系统、Tornado1.0.1调试环境
测试用例:测试板间通信性能。从接口板A向接口板B循环发送消息,通过超级终端观察消息的收发情况。
测试结果:每发送一定数量的消息帧后,会出现发送地址出错现象。
原因分析:接收板回送缓冲区指针给发送板,是采用memcpy单字节拷贝的方式。若发送速度快于接收速度,两板竞用发送板系统总线访问缓冲区指针所在的共享内存,导致数据访问冲突。memcpy过程被打断,即出现发送板读发送地址出错现象。
采用四字节拷贝函数bcopyLongs传送发送缓冲区指针,问题解决。
共享内存的访问设计,除了考虑互斥外,还有总线竞用问题。
案例 2
问题描述:
在进行主BCCH载频互助新功能开发的并行联调测试的过程中,发现了以下的问题:在数管台设置“TRX倒换是否允许”为“是”,进行设定整表后,关闭基站其中配有4个TRX的小区的主BCCH所在的TRX电源,发现对应小区重新初始化并成功,也就是载频互助成功。这个时候从后台对该小区所在的站点进行4级复位,同时重新打开之前关闭的该小区的原配主BCCH所在TRX的电源,发现对应小区初始化失败。
问题定位:
在问题定位开始,先是查看了载频互助相关代码在站点初始化流程中的处理。BTSM程序初始化过程中,先是判断这一次初始化之前是否发生过载频互助,若发生过,再判断原配主BCCH(即数据库中实际配置的主BCCH所在的TRX)是否已经恢复(即能正常建立TEI,能正常设置该TRX对应的RC属性,总之能正常开工)。若载频互助发生过,且原配主BCCH所在的TRX(CoTRXGroupForBts[BtsNo].MainTRX)已经恢复,即把之前进行互助的TRX (CoTRXGroupForBts[BtsNo].AidTRX)的数据和原配的主BCCH所在TRX的数据交换回来,并重新进行初始化。表面上看原理应该没有什么逻辑错误,怎么会出现初始化不成功呢?
我们对程序中的每一个可能导致该问题的变量加打印调试程序,然后重现该问题,终于在打印出来的信息中发现在载频互助发生后其互助的主BCCH所在的TRX与实际数据配置主BCCH所在的TRX为同一TRX,这有问题,因为载频互助的实质就是实际数据配置主BCCH所在的TRX不能正常开工而借用其他TRX作为主BCCH。于是我们根据此线索查询了所有BTSM的程序,没有发现问题的根源。于是我们查了最近合进版本的相关模块的程序,终于找出了问题的根源所在。
在载频互助程序中以全局变量ptrBTS_CONFIG_MAP[BtsNo].TRX_no_BCCH_in表示当前实际运行的主BCCH所在的TRX号,是随时变化的;以CoTRXGroupForBts[BtsNo].MainTRX表示原配的主BCCH所在的TRX号,是固定的。两者在系统开工的系统开工的接口函数FetchOneSiteConfig( )中赋了相同的值:该函数的409行有赋值语句CoTRXGroupForBts[BTS_no_temp].MainTRX = ptrBTS_CONFIG_MAP[BTS_no_temp].TRX_no_BCCH_in。以前函数FetchOneSiteConfig()只是在系统开工时才调用过一次,故CoTRXGroupForBts[BTS_no_temp].MainTRX 在系统开工以后是不变的,但是在DBMI同步开发的整改中,作了如下处理:在每一次数据动态设定后,先判断站点下有没有发生过载频互助,若发生过则试图先把目前进行互助的TRX的数据与实际数据配置成主BCCH的TRX的数据倒换回来,然后进行站点初始化。问题就出现在这,在DBMI中认为DB中原配的主BCCH的TRX是ptrBTS_CONFIG_MAP[BTS_no_temp].TRX_no_BCCH_in,而且每次进行站点初始化时都调用函数FetchOneSiteConfig(),这样将导致CoTRXGroupForBts[BTS_no_temp].MainTRX的值与DB中实际原配主BCCH所在TRX不一致,从而导致主BCCH的相关数据倒换是出现错误,最终导致相应小区初始化不成功。
收获及反思:这个问题的出现是因为主机程序两个功能模块DBMI与BTSM之间的开发缺少相互沟通引起,如果在开发之前两个模块的的开发人员先约定好各个全局变量的用途,如果DBMI与BTSM两个功能模块都认为CoTRXGroupForBts[BTS_no_temp].MainTRX是实际数据的原来的主BCCH所在的TRX号,那么就不会出现以上问题。现在BSC主机程序的各个功能模块都同时合进了许多代码,各个功能模块之间的联系与冲突肯定会存在,这就需要开发人员在开发设计方案时就相互沟通,否则以上由于功能模块间的的冲突引起的问题肯定会存在,而且可能不那么明显的暴露了出来。我们的产品埋伏的炸弹的机会就越多。