标签:afregister zstack-osal cc2530
首先看下以下几个结构体,定义在AF.h文件中
typedef struct { uint8 EndPoint; //端点/端口/终端号 1-240 uint16 AppProfId; //支持的Profile ID,配置文件ID uint16 AppDeviceId; //支持的设备ID uint8 AppDevVer:4; //执行的设备描述的版本 uint8 Reserved:4; // AF_V1_SUPPORT uses for AppFlags:4. uint8 AppNumInClusters; //终端支持的输入群集数目 cId_t *pAppInClusterList; //指向输入Cluster ID(输入群集)列表的指针 uint8 AppNumOutClusters; //终端支持的输入簇数目 cId_t *pAppOutClusterList; //指向输出Cluster ID(输出)列表的指针 } SimpleDescriptionFormat_t;//简单描述符
typedef struct { uint8 endPoint; //终端号 uint8 *task_id; // Pointer to location of the Application task ID.任务ID指针 SimpleDescriptionFormat_t *simpleDesc; //简单描述符,就是上面定义的结构体 afNetworkLatencyReq_t latencyReq; //必须赋值为noLatencyReqs } endPointDesc_t;//终端描述符
typedef struct _epList_t { struct _epList_t *nextDesc; //下一个节点或称下一个终端条目 endPointDesc_t *epDesc; //终端/端点/端口描述符,里面包括简单的描述符 pDescCB pfnDescCB; // Don't use if this function pointer is NULL.回调函数 afAPSF_Config_t apsfCfg; eEP_Flags flags; //终端标志,eEP_Flags是一个枚举类型,里面含有两个变量eEP_AllowMatch=1,eEP_NotUsed=2 } epList_t;//终端列表条目描述符afRegister函数解析
afStatus_t afRegister( endPointDesc_t *epDesc ) { /*查找是否已经存在此端点*/ if (afFindEndPointDescList(epDesc->endPoint)) // Look for duplicate endpoint. { return afStatus_INVALID_PARAMETER; } /* * 不存在,则调用afRegisterExtended,注册 * 注册成功(不为NULL)返回afStatus_SUCCESS * 注册失败(为NULL)返回afStatus_MEM_FAIL */ return ((NULL == afRegisterExtended(epDesc, NULL)) ? afStatus_MEM_FAIL : afStatus_SUCCESS); }
epList_t *afRegisterExtended( endPointDesc_t *epDesc, pDescCB descFn ) { /*开辟一个终端条目节点*/ epList_t *ep = osal_mem_alloc(sizeof(epList_t)); if (ep != NULL) { ep->nextDesc = epList; //将此节点的nextDesc指向终端条目的头节点,即链表头插法 epList = ep; //重新将终端条目链表的头指向最后一个插入的节点 ep->epDesc = epDesc; //将参数中的终端描述符赋值给终端条目结构体中的终端描述符成员 ep->pfnDescCB = descFn; //回调函数赋值,这里赋值为NULL ep->apsfCfg.frameDelay = APSF_DEFAULT_INTERFRAME_DELAY;// #define APSF_DEFAULT_INTERFRAME_DELAY 50 ep->apsfCfg.windowSize = APSF_DEFAULT_WINDOW_SIZE; // #define APSF_DEFAULT_WINDOW_SIZE 1 ep->flags = eEP_AllowMatch; // Default to allow Match Descriptor.赋值为1 } return ep; }总结:
ZStask-OSAL中将所有的终端以一个终端列表条目表现出来,并将它们都串在一个链表上,用全局epList结构体指针指向最后一个注册的终端列表条目结构体。一个任务就是一个应用程序,也就是一个终端,在任务初始化函数中调用afRegister函数,只需要我们传一个终端描述符endPointDesc_t,所有在调用afRegister函数之前需要将终端描述符endPointDesc_t进行初始化,初始化终端号、初始化任务ID指针、初始化简单描述符等。
ZStack-OSAL中任务初始化中的afRegister函数调用分析总结
标签:afregister zstack-osal cc2530
原文地址:http://blog.csdn.net/thanksgining/article/details/42521443