微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540开关广播一定次数后GAPROLE_ERROR问题求教

CC2540开关广播一定次数后GAPROLE_ERROR问题求教

时间:10-02 整理:3721RD 点击:

在用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
}

看来这里的函数并不适合长时间运行的程序,其实这个标题也是可有可无的,感觉有点画蛇添足

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top