TI论坛
直播中

代攀

7年用户 221经验值
私信 关注
[问答]

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 );
    ]
  ]
]

回帖(1)

代攀

2020-4-2 10:37:04
已解决,协议栈原来的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
]
看来这里的函数并不适合长时间运行的程序,其实这个标题也是可有可无的,感觉有点画蛇添足
举报

更多回帖

发帖
×
20
完善资料,
赚取积分