微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > cc2540添加用户代码会断开连接

cc2540添加用户代码会断开连接

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

求教ti的工程师和各位大牛, 我用cc2540做从机, 工程是在SimpleBLEPeripheral这个基础上改的 ,我要增加自己的一段比较长的代码。现在出现这样一个问题:用lightblue或自己开发的app连接上cc2540之后,能正常通信,但是等十几分钟之后,蓝牙就会自动断开,然后用lightblue和app就再也搜索不到从机了,要断开电源再重新上电或者复位之后才能搜索到并重新建立连接。

我这段代码是放在SimpleBLEPeripheral_ProcessEvent下新开的一个3ms的周期事件中,我也试过在tasks中重新开一个Event,但结果是一样的,我这段代码中没有长时间的延时,我试过删减代码中的功能,发现减少代码之后这个问题就消失了,我怀疑是在执行这段代码的时候打断了蓝牙的通信。请问各位有什么好的办法解决这个问题?

另外我想问一下,上电时候从机会发起广播,当连接上了之后就停止广播了,然后断开app,从机又会自动发起广播,我想问的是重新发起广播的函数是在哪实现的?

有谁能解答我的问题 ,谢谢了!

Hi zhao jia

    1.断开连接问题:周期事件的处理有没有测过占用多长时间呢?(尽管没有长时间的延时,但如果涉及浮点数运算,还是会造成执行时间的增加);

       另外,我认为这个事件的周期只有3ms,是过于频繁的事件循环,有可能影响其他地方的处理,你可以尝试将3ms修改为50ms试试,看看会不会改善。

    2.广播的使能/禁止:

uint8 initial_advertising_enable = TRUE;

GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );

你可以找到peripheral.c中变量gapRole_AdvEnabled。每次调用这个函数其实都是写入到这个变量,而连接结束后是根据这个变量来决定要不要重新启动广播的。

在peripheral.c的函数static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg )中可以找到 

case GAP_LINK_ESTABLISHED_EVENT:

{

...

gapRole_AdvEnabled = FALSE;  //建立连接后,将其强制为FALSE。

}

case GAP_LINK_TERMINATED_EVENT://断开连接

{

...

if ( gapRole_AdvEnabled)      //如果最后的状态为TRUE,则不重新启动广播
{
// End advertising so we can restart advertising in order
// to change to connectable advertising from nonconnectable.
VOID GAP_EndDiscoverable( gapRole_TaskID );
}
else // Turn advertising back on.//如果为FALSE
{
gapRole_AdvEnabled = TRUE;
VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT);//启动广播
}

}

感谢你的回答! 我想请问一下,我之所以用3ms事件,是因为我在此时间中使用一个变量计数, 如果增加事件时间,就不方便计数了。根据你所说的频繁的事件循环会影响别的事件,那我想实现类似单片机定时器计时能使用什么函数呢?(cc2540的T1和T3已经被我用来实现pwm了)

Hi zhaojia

    你用3ms事件来实现变量计数,是为了做什么呢?如果只是计时,那可以设的长一点啊。

而且osal的定时器是不精确的,osal是非实时性的操作系统。

    我也不能确定一定就是3ms事件过于频繁造成的,你试过将3ms修改成50ms吗?效果如何呢?

    我觉得还是先找到问题所在吧。

    

hi shaokai:

     谢谢你的回答。

     我将3ms换成50ms,未见改善。

      现在的主要问题是刚开始建立连接的时候没任何问题,等一段时间(15分钟或更长)才会失去连接,这让我很迷惑。

Hi zhaojia

    3ms改成15ms后未见改善,那就说明不是时间间隔过短造成的。

    等一段事件才失去连接,能找到失去连接是什么原因吗?有没有出现这样的现象:

    周期设置为3ms从建立连接到断开连接的时间短一点,而设置为50ms则从建立连接到断开连接要久一点呢?检测一下断开连接会不会是器件复位了呢。

能否把你3ms周期事件处理的代码贴出来。

hi shaokai 

能加你qq一下么?我qq:470656464,谢谢!

Hi zhaojia

   由于某些原因。。。不能!

hi shaokai:

     事件处理的代码比较长 ,而且涉及到一些硬件的控制,所以贴出来估计也没多大作用。我之前有怀疑是这个事件直接添加在SimpleBLEPeripheral_ProcessEvent任务中会影响蓝牙的连接,后来我重新开了一个任务,在任务下重新建立一个周期时间来处理我的用户程序,发现问题同样存在,我还怀疑过是内存的问题(用户程序也就是事件中的代码是从之前的另外的控制mcu程序移植过来的),我将比较大的数组使用osal_mem_alloc函数分配了内存,我发现这样处理后有所改善,出现断开连接的时间有所加长。

      另外你说的器件复位应该不会的 ,因为现在我要是发现无法连接的时候,我按下复位按钮或者重新上电就能重新建立连接了。

Hi zhaojia

     1.你动态分配的内存占用多大呢?有没有遗漏忘了释放,检查是不是内存泄露的问题。

     2.如果不是很必要,你直接分配一个数组作为静态变量来存储你的数据可以吗?如果空间不足,可以减小堆空间的大小来增加静态存储空间的大小。

    3.你能否用示波器测量这个周期事件处理总的占用时间吗?从每次进入,到处理完出来的时间间隔。

hi  shaokai:

感谢你的回答。

1.动态分配的内存大概为40个字节,因为相当于全局变量,我并没有释放,这样会有影响?

2.3.我去试一试。

 那你是只分配了一次,还是每次进来都会重新再分配一次啊。如果每次都重新分配,而又不释放,堆空间很快就会用完的。

hi  shaokai 

只分配了一次,在初始化的时候分配的

hi shaokai 

刚用示波器测试过了,这个时间处理总时间为100us。

100us不长啊。

那你能否试试把你存储数据的变量不要使用动态分配   而改用静态数组存储吗?看看有没有改善。

我这看不见,摸不着的也帮不了你啊。

hi  shaokai:

非常感谢你的这些回答,我再找找别的办法试一试。

最后原因是操作flash太过频繁。

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

网站地图

Top