本文从源程序出发,分享本人学习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内存空间,并设置为0tasksEvents = (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关系如下图。

  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]中的函数处理该任务的事件。

zigbee协议栈OSAL分析相关推荐

  1. Zigbee协议栈OSAL层API函数

      OSAL层提供了很多的API来对整个的协议栈进行管理.主要有下面的几类:信息管理.任务同步.时间管理.中断管理.任务管理.内存管理.电源管理以及非易失存储管理.看到这些管理是不是感觉越来越像一个操 ...

  2. Zigbee协议栈 OSAL机制

    内容为帮助自己的理解,注明转载. OSAL,主要是一种机制,一种任务分配资源的机制.从而形成了一个简单多任务的操作系统(今天有个人说这不算是系统,不过我认为这就是系统了). 首先,OSAL初始化系统, ...

  3. zigbee协议栈OSAL运行原理-----个人理解

    OSAL运行原理: 前提:OSAL是按照不同层运行的.分别是应用层(App).硬件层(HAL).mac层(MAC).......等多个层.我们现在把每一层可以当成一个任务.也可以比喻每一层是一个房间. ...

  4. ZigBee协议栈之osal浅析

    ZigBee是目前比较流行的一种低功耗无线组网技术,主要用于智能家居控制以及智能工业生产.ZigBee大的特点就是低功耗.自组网. 说到ZigBee就不得不提IEEE802.15和ZigBee联盟,他 ...

  5. ZIGBEE通讯-10.ZigBee协议栈的无线点灯

    在ZIGBEE协议栈中已经自带了按键与LED的驱动与使用函数,所以只需要将按键与LED修改为使用的开发板所连接IO就可以使用了.接下来将主要分析在协议栈中按键的初始化.按键的检测以及按键事件的传递与处 ...

  6. Zigbee协议栈ZStack构架

     协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1 1.ZStack协议栈构架 Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些 ...

  7. ZigBee协议栈Zstack介绍

    文中所讲述的协议栈是基于ZigBee2006\Zstack-1.4.3-1.2.1 1.ZSTACK协议栈的架构 ZigBee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一 ...

  8. ZStack通信(Zigbee协议栈通信)

    ZStack通信-Zigbee协议栈通信 一.注册端点 二.发送数据函数 三.接收数据 一.注册端点 应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要 ...

  9. zigbee之OSAL操作系统

    概述 OSAL(Operating System AbstractionLayer),即操作系统抽象层. OSAL是一种基于事件驱动的轮询式操作系统,所提供的管理功能有: (1)任务登记.任务初始化. ...

最新文章

  1. java me sdk_Java ME SDK 3.0不运行的问题及解决
  2. News | 经有限数据研究显示瑞德西韦有望治疗冠状病毒患者
  3. opengl纹理示例
  4. opencv的K近邻算法
  5. 数据库如何生成sql语句
  6. Tensorflow中文文档
  7. unicode编码转ascii编码
  8. 一个java处理JSON格式数据的通用类(三)
  9. SAGA-GIS软件下载
  10. JimuReport积木报表——分组报表怎么做
  11. 软件开发中的成本意识
  12. Janis—CCR闭循环系列探针台
  13. Java设计模式及类图
  14. 数字地与模拟地解释及PBC底线布局
  15. Java Logging之JUL系列——Log Levels
  16. chrome插件,装这个就够了
  17. 计算机软件水平考试什么题型,计算机软考考什么内容
  18. PHP生成微信小程序码
  19. 如何减少http请求
  20. QT运行时报错Gtk-Message: 20:31:49.219: Failed to load module “canberra-gtk-module

热门文章

  1. 基于时间序列的股票趋势预测模型
  2. C语言排序函数——qsort
  3. Java实现字节小程序微信担保支付及回调超详细
  4. python中input函数最简单详细的了解
  5. typescript:Mapped Types
  6. java 函数给默认值_函数参数的默认值
  7. 普通用户加入root组
  8. Unity3D 游戏加密解密那些事
  9. 检信智能语音情感识别-基于SVM的语音情感识别系统设计
  10. ISCSI网络存储(Linux主机中磁盘共享给Windows主机)