CC2540开关广播一定次数后GAPROLE_ERROR问题求教
在用CC2540做一个东西,现在的测试流程是从机每隔一秒开机一次,开广播,开一个关机定时器,上位机定时广播,扫描到从机,连接,从机连接以后在GAP状态回调函数里用Indication的方式上传一个数据,等待关机定时器定时时间到,断开连接,关闭广播,开一个一秒的定时器,OSAL自动进入休眠,等待一秒定时器时间到,重新这个过程。现在的问题是在开机122次之前,开关广播上传数据断连接都没问题,也比较稳定,在122次时可以连接,但是Indication没有上传数据,可以断开,123次时可以连接,没有上传数据,也不能断开,再往后就不能控制了,packet sniffer抓包看是连接状态的,开广播回的也是GAPROLE_ERROR,但是程序其他部分运行没问题。改了几天,没有效果,而且每次都是122-123次出问题,偶尔有61次就开始这种情况,今天想重现下61次的情况,却发现原来认为有问题的地方修改回去没有出现61次的问题,还是122次,感觉有点抓瞎了,没地下手了。用debugger运行到122次时没有发现自己定义的静态变量有超范围的情况。还望各位前辈给个建议或者想法,怎么去解决这种问题,有什么需要注意的地方,Thanks
程序是使用HeartRate修改的,上传操作如下
linkDB_PerformFunc( Weight_ScaleIndicateCB );
Weight_ScaleIndicateCB定义如下:
static void AppIndicateCB( linkDBItem_t *pLinkItem )
{
if ( pLinkItem->stateFlags & LINK_CONNECTED )
{
//是否开启了上传
uint16 value = GATTServApp_ReadCharCfg( pLinkItem->connectionHandle,
AppLevelClientCharCfg );
//若开启了上传,则上传数据,这里不进行判断,一直开启上传
// if ( value & GATT_CLIENT_CFG_INDICATE )
{
attHandleValueInd_t indi;
indi.handle = AppAttrTbl[APP_LEVEL_VALUE_IDX].handle;
indi.len = 2;
indi.value[0] = appLevel[0];
indi.value[1] = appLevel[1];
//通知主机数据
GATT_Indication (pLinkItem->connectionHandle, &indi, FALSE,
RegisterForAppServiceTaskID );
}
}
}
已解决,协议栈原来的LCD函数里有几行代码
if ( Lcd_Line1 == NULL )
{
Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 );
//HalLcdWriteString( "TexasInstruments", 1 );
}
由于注释不完全,在每次开机lcd上电初始化时候会调用下面函数,设置Lcd_Line1 = NULL ,导致上面的代码每次开机都要开辟内存空间,最终导致内存溢出射频部分出错
void HalLcdInit(void)
{
#if (HAL_LCD == TRUE)
Lcd_Line1 = NULL;
HalLcd_HW_Init();
#endif
}
看来这里的函数并不适合长时间运行的程序,其实这个标题也是可有可无的,感觉有点画蛇添足