Thread 中讨论的其他器件:SysConfig
您好!
通过扩展广播广播广播数据后、我需要为下一个广播更改数据。 因此、我调用 GapAdv_prepareLoadByBuffer 函数来停止广播、更改我的数据(当前仅为虚拟数据、因此我在数据中增加一个字节)、然后我尝试使用 GapAdv_loadByBuffer 重新加载缓冲区、因此也会重新启用广播。 这是在 processAppMsg 函数中完成的、因此 应该不会因为回调上下文而出现问题。 遗憾的是、没有来自 GapAdv_loadByBuffer 的返回、并且软件在调用此函数后没有响应。 我调试了这个问题、当 iCall 尝试发布事件时、似乎会发生这种情况。 在下面、您将找到 来自 processAppMsg 的代码
static void SimpleBroadcaster_processAppMsg(ttEvt_t *pMsg)
{
bool safeToDealloc = TRUE;
switch (pMsg->hdr.event)
{
case SC_EVT_ADV_REPORT:
{
GapScan_Evt_AdvRpt_t* pAdvRpt = (GapScan_Evt_AdvRpt_t*) (pMsg->pData);
bStatus_t status = FAILURE;
Display_print2(dispHandle, ++mrLine, 0, "Advertising Addr: %s RSSI: %d",
Util_convertBdAddr2Str(pAdvRpt->addr), pAdvRpt->rssi);
Display_print1(dispHandle, ++mrLine, 0, "Advertising Data: %s",
Util_convertBytes2Str(pAdvRpt->pData, pAdvRpt->dataLen));
/* Update some data */
status = GapAdv_prepareLoadByBuffer(advData1, GAP_ADV_FREE_OPTION_DONT_FREE);
SIMPLEBROADCASTER_ASSERT(status == SUCCESS);
advData1[4] += 1;
/* error: no return from this function.... */
status = GapAdv_loadByBuffer(sizeof(advData1), advData1);
SIMPLEBROADCASTER_ASSERT(status == SUCCESS);
// Free report payload data
if (pAdvRpt->pData != NULL)
{
ICall_free(pAdvRpt->pData);
}
break;
}
代码在下面复制的 ICall 代码的第49行停止。 请注意、这一行代码会在我的错误发生之前多次执行、以解决问题。
ICall_Errno ICall_send(ICall_EntityID src,
ICall_EntityID dest,
ICall_MSGFormat format,
void *msg)
{
ICall_CSState key;
ICall_MsgHdr *hdr = (ICall_MsgHdr *) msg - 1;
if (dest >= ICALL_MAX_NUM_ENTITIES ||
src >= ICALL_MAX_NUM_ENTITIES)
{
return (ICALL_ERRNO_INVALID_PARAMETER);
}
key = ICall_enterCSImpl();
if (!ICall_entities[dest].task)
{
ICall_leaveCSImpl(key);
return (ICALL_ERRNO_INVALID_PARAMETER);
}
ICall_leaveCSImpl(key);
/* Note that once the entry is valid,
* the value does not change and hence it is OK
* to leave the critical section.
*/
hdr->srcentity = src;
hdr->dstentity = dest;
hdr->format = format;
#ifdef ICALL_NO_APP_EVENTS
// for applications, call direct to callback without enqueue/event_pend/dequeue
if (ICall_entities[dest].service == ICALL_SERVICE_CLASS_APPLICATION)
{
if (ICall_entities[dest].appCallback != NULL)
{
uint8_t safeToDealloc = ICall_entities[dest].appCallback(0 /*event*/, (uint8_t *)msg);
if (msg && safeToDealloc)
{
ICall_freeMsg(msg);
}
}
return (ICALL_ERRNO_SUCCESS);
}
#endif // ICALL_NO_APP_EVENTS
ICall_msgEnqueue(&ICall_entities[dest].task->queue, msg);
/* Software stops working here */
ICALL_SYNC_HANDLE_POST(ICall_entities[dest].task->syncHandle);
return (ICALL_ERRNO_SUCCESS);
}
下面显示了完整的调用堆栈。

提前感谢您
