ZStack-OSAL中任务初始化中的afRegister函数调用分析总结

来源:互联网 发布:网络如何人肉搜索 编辑:程序博客网 时间:2024/04/30 06:03

首先看下以下几个结构体,定义在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指针、初始化简单描述符等。



0 0