观察者 CH58X/CH57X/V208 Observer例程讨论讲解

使用的是沁恒的CH582M的Observer例程与官方的demo板 。
本例程的功能是主机扫描到从机的MAC地址并打印出来 。
先对宏定义进行理解讨论 。

观察者 CH58X/CH57X/V208 Observer例程讨论讲解

文章插图
最大响应扫描数为8,在串口调试助手那里可以看到打印出的8个MAC地址 。
这里的白名单是默认关闭的 。
观察者 CH58X/CH57X/V208 Observer例程讨论讲解

文章插图
接下来对初始化进行讨论 。
void Observer_Init(){ObserverTaskId = TMOS_ProcessEventRegister(Observer_ProcessEvent);// Setup Observer Profile{uint8_t scanRes = DEFAULT_MAX_SCAN_RES;GAPRole_SetParameter(GAPROLE_MAX_SCAN_RES, sizeof(uint8_t), &scanRes);}// Setup GAPGAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);// Setup a delayed profile startuptmos_set_event(ObserverTaskId, START_DEVICE_EVT);}这里是初始化期间调用的功能,这里的详解可以参照CH58X/CH57X/V208的Broadcaster(广播者)例程讲解 - 小舟从此逝_1 - 博客园 (cnblogs.com)这篇文章 。
接下来是对任务的管理调度,这里用的是TMOS事件管理 。关于TMOS的理解具体可以参照WCH TMOS用法详解 - debugdabiaoge - 博客园 (cnblogs.com)
再次之前我们要了解一下TMOS任务的调度,在这里TMOS任务可以定义16个其中有15个自定义,1个系统任务 。
【观察者 CH58X/CH57X/V208 Observer例程讨论讲解】广播者的例程里共写了两个任务,首先看到第一个任务
if(events & SYS_EVENT_MSG){uint8_t *pMsg;if((pMsg = tmos_msg_receive(ObserverTaskId)) != NULL){Observer_ProcessTMOSMsg((tmos_event_hdr_t *)pMsg);// Release the TMOS messagetmos_msg_deallocate(pMsg);}// return unprocessed eventsreturn (events ^ SYS_EVENT_MSG);}这个任务就是唯一的一个系统任务,这里是在各层协议栈之间传递数据,这这里是接收消息 。同时还有这几个函数用于内部数据的传递 。这部分可以参考CH579/CH57x 的TMOS系统使用 - iot-fan - 博客园 (cnblogs.com)对这部分进行更详尽的了解 。
extern bStatus_t tmos_msg_send( tmosTaskID taskID, uint8_t *msg_ptr );extern uint8_t *tmos_msg_receive( tmosTaskID taskID );extern uint8_t *tmos_msg_allocate( uint16_t len );extern bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr );第二个任务则是用户自定义事件,本例程中只使用了这一个自定义事件;
if(events & START_DEVICE_EVT){// Start the DeviceGAPRole_ObserverStartDevice((gapRoleObserverCB_t *)&ObserverRoleCB);return (events ^ START_DEVICE_EVT);}// Discard unknown eventsreturn 0;} GAPRole_ObserverStartDevice((gapRoleObserverCB_t *)&ObserverRoleCB);此函数是观察者角色启动设备,在系统启动期间调用一次 。下面讨论的是对自定义任务的回调函数 。static void ObserverEventCB(gapRoleEvent_t *pEvent){switch(pEvent->gap.opcode){//事件初始化完成之后发送case GAP_DEVICE_INIT_DONE_EVENT:{GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,

    经验总结扩展阅读