我需要实现使用两个定时器进行广播切换的功能,在定时器A的事件触发时进行自定义广播包的切换,在定时器B事件触发时,进行标准广播包的切换,并循环持续30s,但是当第一个广播包切换后,定时出现异常,且其他的触发事件都出现了异常,例如串口,按键,都无法触发了,请问这是什么情况导致的。
我的代码如下:
#define SP_ADV_SOS_EVT_PERIOD 300 advInt = 160 Util_constructClock(&advsos, SimplePeripheral_clockHandler, SP_ADV_SOS_EVT_PERIOD, 0, false, (UArg)&argadvsos); Util_constructClock(&advupade, SimplePeripheral_clockHandler, advInt * 0.625, 0, false, (UArg)&argadvupade); static void adv_init() { //Method 1 if (sos_state == 1) memcpy(updateAdvData, advertDataNew, sizeof(advertDataNew)); else if(sos_state == 0) memcpy(updateAdvData, advertData, sizeof(advertData)); bStatus_t status = FAILURE; status = GapAdv_prepareLoadByHandle(advHandleLegacy,GAP_ADV_FREE_OPTION_ADV_DATA); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); // Load advertising data for set #1 that is statically allocated by the app status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_ADV, sizeof(updateAdvData), updateAdvData); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); //Method 2 /* GapAdv_params_t advParamLegacy; advParamLegacy.eventProps = GAP_ADV_PROP_CONNECTABLE | GAP_ADV_PROP_SCANNABLE | GAP_ADV_PROP_LEGACY; advParamLegacy.primIntMin = advInt; advParamLegacy.primIntMax = advInt; advParamLegacy.primChanMap = GAP_ADV_CHAN_ALL; advParamLegacy.peerAddrType = PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID; //memcpy(advParamLegacy.peerAddr, pPkt->devAddr, B_ADDR_LEN); advParamLegacy.filterPolicy = GAP_ADV_WL_POLICY_ANY_REQ; advParamLegacy.primPhy = GAP_ADV_PRIM_PHY_1_MBPS; advParamLegacy.secPhy = GAP_ADV_SEC_PHY_1_MBPS; advParamLegacy.sid = 0; // Create Advertisement set #1 and assign handle status = GapAdv_create(&SimplePeripheral_advCallback, &advParamLegacy, &advHandleLegacy); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); // Load advertising data for set #1 that is statically allocated by the app status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_ADV, sizeof(updateAdvData), updateAdvData); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); // Load scan response data for set #1 that is statically allocated by the app status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP, sizeof(scanRspData), scanRspData); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); // Set event mask for set #1 status = GapAdv_setEventMask(advHandleLegacy, GAP_ADV_EVT_MASK_START_AFTER_ENABLE | GAP_ADV_EVT_MASK_END_AFTER_DISABLE | GAP_ADV_EVT_MASK_SET_TERMINATED); // Enable legacy advertising for set #1 status = GapAdv_enable(advHandleLegacy, GAP_ADV_ENABLE_OPTIONS_USE_MAX, 0); SIMPLEPERIPHERAL_ASSERT(status == SUCCESS); */ } static void SimplePeripheral_processAppMsg(spEvt_t *pMsg) { bool dealloc = TRUE; switch (pMsg->event) { ... case SP_ADV_SOS_EVT: sos_start_handler(); break; case SP_ADV_UPDATE_EVT: adv_start_handler(); break; default: // Do nothing. break; } } static void sos_start_handler(void) { flag_status.adv_clock_ticks++; Util_startClock(&advsos); if (flag_status.adv_clock_ticks == 50) { Uart0_Write("Stop\r\n", 6); flag_status.adv_clock_ticks = 0; GapAdv_disable(advHandleLegacy); sos_state = 0; adv_init(); Util_stopClock(&advsos); Util_stopClock(&advupade); } else { Uart0_Write("sos\r\n", 5); sos_state = 1; adv_init(); } } static void adv_start_handler(void) { Uart0_Write("adv\r\n", 5); Util_startClock(&advupade); sos_state = 0; adv_init(); }
如果我把代码中的adv_init()屏蔽以后,在定时器事件中添加串口log,发现定时器可以进行触发,其他事件也可以正常进行。