cc2540添加用户代码会断开连接
求教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太过频繁。
