码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-08 13:29:38      阅读:231      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!