背景
cc2640项目需要添加oad功能,为了降低功耗,默认连接参数设置的比较大,这将导致oad时间过长,此时需要在oad之前先更新一组较小的连接参数,提高oad的速度。
更新连接参数的api
/********************************************************************
* @fn GAPRole_SendUpdateParam
*
* @brief Update the parameters of an existing connection
*
* @param minConnInterval - the new min connection interval
* @param maxConnInterval - the new max connection interval
* @param latency - the new slave latency
* @param connTimeout - the new timeout value
* @param handleFailure - what to do if the update does not occur.
* Method may choose to terminate connection, try again,
* or take no action
*
* @return SUCCESS, bleNotConnected, or bleInvalidRange
*/
bStatus_t GAPRole_SendUpdateParam(uint16_t minConnInterval,
uint16_t maxConnInterval,
uint16_t latency, uint16_t connTimeout,
uint8_t handleFailure)
移植官方ccservice的回调函数
/*********************************************************************
* @fn ccChangeCB
*
* @brief Callback from Connection Control indicating a value change
*
* @param paramID - parameter ID of the value that was changed.
*
* @return none
*/
static void ccChangeCB( uint8 paramID )
{
// CCSERVICE_CHAR1: read & notify only
// CCSERVICE_CHAR: requested connection parameters
if (paramID == CCSERVICE_CHAR2)
{
uint8_t buf[CCSERVICE_CHAR2_LEN];
// Get new connection parameters
CcService_getParameter( CCSERVICE_CHAR2, buf);
// Update connection parameters
GAPRole_SendUpdateParam( BUILD_UINT16(buf[0],buf[1]),
BUILD_UINT16(buf[2],buf[3]), // minConnInterval, maxConnInterval
BUILD_UINT16(buf[4],buf[5]),
BUILD_UINT16(buf[6],buf[7]), // slaveLatency, timeoutMultiplier
GAPROLE_TERMINATE_LINK);
}
// CCSERVICE_CHAR3: Disconnect request
else if (paramID == CCSERVICE_CHAR3)
{
// Any change in the value will terminate the connection
GAPRole_TerminateConnection();
}
}
更新现象
测试发现按照官方demo这样直接更新连接参数,会导致断开连接,细查发现是会导致死机
解决方法
分析导致死机可能是跟ti-rtos有关,没有细查死机原因,解决这个死机问题,只需要将更新连接参数的接口放到其它地方执行,而不能在回调函数里面直接执行。
参考方法:使用定时器任务