我在Broadcaster工程里加入了按键功能,当按键按下之后修改广播数据。
在Board_initKeys(KeyPressHandler)初始化按键之后程序正常运行。当按键按下之后board_key.c里会在中断里面开启定时器,
当200ms到了之后会回调KeyPressHandler。
1.我就是直接在KeyPressHandler里面修改广播数据,advertData里面数据确实变化了但是实际广播出来的数据却没有变。 static void KeyPressHandler(uint8 keys){ if (keys & KEY_UP) { advertData[7] = 0xFF; GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); }}
2.只在KeyPressHandler设置事件后里面将消息入队,在SimpleBLEBroadcaster_processAppMsg直接改变广播数据,
这种是可以实现动态修改广播数据。
static void KeyPressHandler(uint8 keys){// Enqueue the event. sbbEvt_t *pMsg;
// Create dynamic pointer to message. if (pMsg = ICall_malloc(sizeof(sbbEvt_t))) { pMsg->hdr.event = KEY_CHANGE_EVT; pMsg->hdr.state = keys; // Enqueue the message. Util_enqueueMsg(appMsgQueue, sem, (uint8_t*)pMsg); }}
static void SimpleBLEBroadcaster_processAppMsg(sbbEvt_t *pMsg){ switch (pMsg->hdr.event) { case SBB_STATE_CHANGE_EVT: SimpleBLEBroadcaster_processStateChangeEvt((gaprole_States_t)pMsg-> hdr.state); break;
case KEY_CHANGE_EVT: { if ((pMsg->hdr.state) & KEY_UP) { advertData[7] = 0xFF; GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); } } break;
default: // Do nothing.
break; }}
我的疑问是难道修改广播数据只能在SimpleBLEBroadcaster_taskFxn线程里面?
user5329684:
按键事件可以看作是个中断。
中断处理应该尽可能短,所以需要把处理工作放到queue中。
linux的话,中断分为上半部和下半部,把处理工作放到下半部,理解应该差不多。
但是奇怪的是,只是设置一个gaprole参数而已,非常简单,为什么有问题呢?
这个问题后来你解决了吗?