zigbee协议栈OSAL分析

zigbee协议栈OSAL分析本文从源程序出发,分享本人学习zigbee协议栈的一些理解,介绍zigbee协议栈OSAL任务调度及用户自定义任务的调度处理过程。为了便于抓住本质,理清思路,本文剔除一些无关部分。程序的入口是ZMain.c文件下的main(),是系统的主流程,核心为osal_init_system()(初始化操作系统)和osal_start_system()(启动操作系统)。在osal_init_system()中主要需要关注的是osalInitTasks()(初始化系统任务),该函数为tasksEvents[..

大家好,又见面了,我是你们的朋友全栈君。

本文从源程序出发,分享本人学习zigbee协议栈的一些理解,介绍zigbee协议栈OSAL任务调度及用户自定义任务的调度处理过程。为了便于抓住本质,理清思路,本文剔除一些无关部分。

程序的入口是ZMain.c文件下的main(),是系统的主流程,核心为 osal_init_system()(初始化操作系统)和osal_start_system()(启动操作系统)。

在 osal_init_system()中主要需要关注的是osalInitTasks()(初始化系统任务),该函数为tasksEvents[idx]分配内存空间,用于存储任务号为idx的任务所触发的事件。当某一任务发生某个事件时,系统会自动填写该表。用户创建的任务SampleApp_Init( taskID )添加在该函数的末尾。

void osalInitTasks( void )
{
uint8 taskID = 0;

  // 分配tasksEvents内存空间,并设置为0
  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
  //各任务初始化
  macTaskInit( taskID++ );  
  nwk_init( taskID++ );     
  Hal_Init( taskID++ );     
  MT_TaskInit( taskID++ );
  APS_Init( taskID++ );  
  APSF_Init( taskID++ );
  ZDApp_Init( taskID++ );   
  ZDNwkMgr_Init( taskID++ );
  SampleApp_Init( taskID );  //用户创建的任务
 
}

tasksArr[]是定义好的事件处理函数表,里面按照osalInitTasks()中任务初始化的顺序存放各个任务的事件处理函数,这样就可以保证各任务与其事件处理函数一致。

const pTaskEventHandlerFn tasksArr[] = {
  macEventLoop,
  nwk_event_loop,
  Hal_ProcessEvent,
  MT_ProcessEvent,
  APS_event_loop,
  APSF_ProcessEvent,
  ZDApp_event_loop,
  ZDNwkMgr_event_loop,
  SampleApp_ProcessEvent//用户创建的任务事件处理函数
};

 tasksEvents与tasksArr关系如下图。

zigbee协议栈OSAL分析

  1. 用tasksEvents[idx]事件表记录任务号为idx的任务发生的事件;
  2. 用tasksArr[idx]函数表任务号为idx的任务事件处理函数;
  3. 通过任务号idx关联事件表和函数表;

在osal_start_system中扫描tasksEvents[idx],找到tasksEvents[idx]!=0的任务号idx,并通过 (tasksArr[idx])( idx, events )调用tasksArr[idx]中的函数处理该任务的事件;

在事件处理函数中判断事件类型,如SYS_EVENT_MSG(系统消息事件)、用户自定义事件等。针对SYS_EVENT_MSG,需先从消息队列中获取本任务的消息,再判断该消息的类型,如:KEY_CHANGE(按键事件)、AF_INCOMING_MSG_CMD(接收数据事件)、ZDO_STATE_CHANGE(网络状态改变事件)等。

前面有点散,最后总结一下,osal工作原理:

  1. 建立tasksArr[idx]函数表,用于记录任务号为idx的任务事件处理函数;
  2. 建立tasksEvents[idx]事件表,用于记录任务号为idx的任务发生的事件;
  3. 循环扫描tasksEvents[idx]事件表,找到tasksEvents[idx]!=0的任务号idx,并通过 (tasksArr[idx])( idx, events )调用tasksArr[idx]中的函数处理该任务的事件。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144766.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • django models.py(python和django)

    本人java10年开发经验,现就职于电信,因工作需要学习python,记录自己的学习记录。后面也会持续分享真实工作经验,及项目。欢迎大家互关,一起学习!!文章有不严谨的地方请指出1.创建模型类打开pay应用的models.py创建模型类fromdatetimeimportdatetimefromdjango.dbimportmodels#Createyourmodelshere.#创建品牌的模型类classBrand(models.Model):#创建字段

    2022年4月13日
    53
  • WrapPanel水平布局保持不换行的写法示例[通俗易懂]

    WrapPanel水平布局保持不换行的写法示例[通俗易懂]UI需求宽高:235px*285px内容宽度:191px要求:每行2个,右边距15,下边距10代码写法:测量后发现两个item+margin=191,所以让wrappanel定宽191item中grid套个border,在border中设置左右间距7.5,这样两个元素加起来的宽就是15,由于左边距多了7.5,所以在上一层grid左缩进7.5拉回来就可以了效果:…

    2022年7月22日
    10
  • 利用pycharm安装requests库「建议收藏」

    利用pycharm安装requests库「建议收藏」最近在学python,虽然也没怎么系统的学。像我这种小白giser一般对于编程的态度就是当工具来用,用到什么学一点儿。因为以后的研究可能会涉及到爬数据,所以最近开始试水爬虫。爬虫第一步就是安装第三方库,这里我用requests库。我看了很多博文都是用pipinstall,觉得挺麻烦,后来试了一下直接在pycharm中安装,秒装上。1.打开pycharm,file-setting2.点右侧小加号3、搜索requests库4、installpackage…

    2022年8月28日
    1
  • python-louvain_louvin算法

    python-louvain_louvin算法本发明涉及数据挖掘技术领域,尤其涉及一种基于Louvain算法的社区发现方法及一种基于Louvain算法的社区发现系统背景技术:随着信息化技术的发展,信息系统中保存着大量用户的信息特征,用户与用户之间也存在着某种关联性。用户的特征具有多维度,且多关联性。社区发现能帮助人们更有效地了解网络的结构特征,从而提供更有效、更具个性化的服务。当前,许多研究通过分析网络的结构来发现社区。其中,Blondel等…

    2022年10月30日
    0
  • tabnine激活码(破解版激活)

    tabnine激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    48
  • setScale,preScale 和 postScale 的区别

    setScale,preScale 和 postScale 的区别setScale,preScale和postScale的区别上面讲到,Matrix由3*3矩阵中9个值来决定。而我们对Matrix的所有设置,也是对这9个值的各种不同的改变,来达到我们想要的效果。下面是Matrix3*3的矩阵结构{MSCALE_X,MSKEW_X,MTRANS_X,MSKEW_Y,MSCALE_Y,MTRANS_Y,MPERSP_0,MPERSP_1,MPERSP_2}一、首先介绍Scale缩放的控制scale就是缩放,我们调用Matrix的setScale、preSc

    2022年10月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号