Z-Stack 软件架构分析

本文详细解析了Z-Stack的系统初始化过程及任务处理机制,介绍了main函数所在文件Zmain.c的作用,展示了系统初始化的具体步骤,并深入探讨了操作系统实体osal_start_system()的工作原理。
摘要由CSDN通过智能技术生成

Z-Stackmain函数在Zmain.c中,总体上来说,它一共做了两件工作,一个是系统初始化,即有启动代码来初始化硬件系统和软件架构需要的各个模块,另一个作用就是开福寺执行操作系统实体。
1.系统初始化
   系统启动代码需要完成初始化硬件平台和软件架构所需要的各个模块,为操作系统的运行做好准备工作,主要分为初始化系统时钟,检测芯片工作电压、初始化堆栈、初始化各个硬件模块、初始化FLASH存储、形成芯片MAC地址、初始化非易失量、初始化MAC层协议、初始化化应用帧层协议、初始化操作系统等十余部分,其具体流程图和对应的函数如下:
 
                                              
Z-Stack 软件架构分析 - 洪军 - 洪军的博客500)this.width=500;">
                                             图1 系统初始化流程图
2. 操作系统的执行
   启动代码为操作系统的执行做好准备工作后,就开始执行操作系统入口程序,并由此彻底将控制权移交给操作系统。
其实,操作系统实体只有一行代码:
Osal_start_system(); // No Return from here
   在这句话后面有一条注释,意思是本函数不会返回,也就是说它是一个死循环,永远不可能执行完。这个函数就是osal系统轮转查询操作的主体部分,它所做的工作就是不断的查询每个任务中是否有事件发生,如果有事件发生,就调用相应的事件处理函数,如果没有任何事件发生就一直查询。我们可以看到下面就是这个函数的实现,其实这个函数的就是在一个无限的循环中。

void osal_start_system( void )
{
#if !defined ( ZBIT )
  for(;;) 
// Forever Loop

#endif
  {
    uint8 idx = 0;

    Hal_ProcessPoll(); 
// This replaces MT_SerialPoll() and osal_check_timer().


    do {
      if (tasksEvents[idx]) 
// 最高优先级任务被找到

      {
        break;
      }
    } while (++idx < tasksCnt); 
//其中tasksCnt为tasksArr数组中元素的个数

//得到了待处理的具有最高优先级的任务的索引号 idx

    if (idx < tasksCnt) 
    {
      uint16 events;
      halIntState_t intState;
  
// 进入/退出临界区,来提取出需要处理的任务中的事件,其实这和μC/OS-II操作系统中进入临界区很相似,μC/OS-II中使用OS_ENTER_CRITICAL();OS_EXIT_CRITICAL();

      HAL_ENTER_CRITICAL_SECTION(intState);
      events = tasksEvents[idx];
      tasksEvents[idx] = 0; 
// Clear the Events for this task.

      HAL_EXIT_CRITICAL_SECTION(intState);
//通过指针调用来执行对应的任务处理函数


      events = (tasksArr[idx])( idx, events );
    
//进入/退出临界区,保存尚未处理的事件

          HAL_ENTER_CRITICAL_SECTION(intState);
      tasksEvents[idx] |= events; 
// Add back unprocessed events to the current task.

          HAL_EXIT_CRITICAL_SECTION(intState);
      } 
//本次事件处理结束,

#if defined( POWER_SAVING )
    else 
// 所有的任务事件都被查询结束后,没有任何事件被激活

    {
      osal_pwrmgr_powerconserve(); 
// 系统进入休眠状态。

    }
#endif
    }
}

操作系统专门分配了存放所有任务事件的tasksEvents[]数组,每一个单元对应存放着每一个任务的所有事件,在这个函数中首先通过一个do—while循环来遍历tasksEvents[],找到一个具有待处理事件的优先级最高的任务,序号低的任务优先级高,然后跳出循环,此时,就得到了最高优先级任务的序号idx,然后通过events=tasksEvents[idx]语句,将这个当前具有最高优先级的任务的事件取出,接着就调用(tasksArr[idx])(inx,events)函数来执行具体的处理函数了,taskArr[]是一个函数指针数组,根据不同的idx就可以执行不同的函数。

TI给出了几个例子来演示Z-Stack协议栈,其实这些例子中的大部分代码是相同的,只有用户的应用层,添加了不同的任务及事件处理函数。这里以GeneralApp这个例子来说明。

首先,明确系统中要执行的几个任务。在GeneralApp这个例子中,几个任务函数组成了上述的tasksArr函数指针数组,在Osal_GeneralApp.c中定义,osal_start_system()函数通过函数指针(tasksArr[idx])(inx,events)调用。

tasksArr数组如下:

const pTaskEventHandlerFn tasksArr[] = {

  macEventLoop,         //MAC层任务处理函数

  nwk_event_loop,       //网络层任务处理函数

  Hal_ProcessEvent,     //硬件抽象层任务处理函数

#if defined( MT_TASK )

  MT_ProcessEvent,     //调试任务处理函数可选

#endif

  APS_event_loop,     //应用层任务处理函数,用户不用修改

  ZDApp_event_loop,  //设备应用层任务处理函数,用户可以根据需要修改

  GenericApp_ProcessEvent  //用户应用层任务处理函数,用户自己生成

};

如果不算调试任务,操作系统一共要处理6项任务,分别为MAC层,网络层。硬件抽象层,应用层,ZigBee设备应用层以及完全由用户处理的应用层,其优先级由高到低。MAC层任务具有最高优先级,用户层具有最低的优先级。Z-Stack已经编写了对从MAC层到ZigBee设备应用层这五层任务的事件处理函数,一般情况下不需要修改这些函数,只需要按照自己的需求编写应用层的任务及事件处理函数就可以。

其它的几个例子文件中,唯一不同的是最后一个函数其它的函数都是一样的。一般情况下用户只需要额外添加三个文件就可以完成一个项目。一个是主文件,存放具体的任务事件处理函数如上述事例中的GenericApp_ProcessEvent,一个是这个主文件的头文件,另外一个是操作系统的接口文件以Osal开头,是专门存放任务处理函数数组tasksArr[]的文件。这样就实现了Z-Stack代码的公用,用户只需要添加这几个文件,编写自己的任务处理函数就可以了。到现在是不是感觉很简单,别不想想像的那么复杂,这个操作系统抽象层和实时操作系统中的μC/OS-II有相似之处,唉μC/OS-II中可以分配给64个任务。了解了这个操作系统的话,理解OSAL应该不是很困难,但是,Z-Stack只是基于这个OSAL运行,但重点不在这里,而是ZigBee设备之间的通信的实现,以及组网,组成不同的网络结构,这些才是整个ZigBee协议中的核心内容,当然也应该远比我们添加几个文件来的复杂。

Z-Stack 软件架构分析 - 洪军 - 洪军的博客500)this.width=500;">

Z-Stack在项目中的目录结构

Z-Stack项目中大约有14个目录文件,目录文件下面又有很多的子目录和文件。下面就来看看这14个根目录,具体是有什么作用:

(1)      App:应用层目录,这个目录下的文件就是创建一个新项目时自己要添加的文件,

(2)       HAL:硬件层目录,Common目录下的文件是公用文件,基本上与硬件无关,其中hal_assert.c是断言文件,用于调用,hal_drivers.c是驱动文件,抽象出与硬件无关的驱动函数,包含有与硬件相关的配置和驱动及操作函数。Include目录下主要包含各个硬件模块的头文件,而Target目录下的文件是跟硬件平台相关的,可能看到有两个平台,分别是Cc2430DB平台和一个CC2430EB平台。后面的DBEB表示的是TI公司开发板的型号,其实还有一种类型是BB的,BB: Battery Board
DB: Development Board
  EB: Evaluation Board
分别对应TI公司开发的三种板型,其功能按上顺序依次变强。可以参看"Z-Stack User's Guide for CC2430"的图片,可以获得更直观的认识。

(3)       MACMAC层目录,High LevelLow Level两个目录表示MAC层分为了高层和底层两层,Include目录下则包含了MAC层的参数配置文件及基MACLIB库函数接口文件,这里的MAC层的协议是不开源的,以库的形式给出

(4)       MT:监制调试层目录,该目录下的文件主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互。

(5)       NWK:网络层目录,含有网络层配置参数文件及网络层库的函数接口文件,及APS层库的函数接口

(6)       OSAL:协议栈的操作系统抽象层目录

(7)       ProfileAF层目录,Application Farmework 应用框架,包含AF层处理函数接口文件。

(8)       Security:安全层目录,包含安全层处理函数接口文件

(9)       ServicesZigBee802.15.4设备地址处理函数目录,包括地址模式的定义及地址处理函数

(10)   Tools:工作配置目录,包括空间划分及Z-Stack相关配置信息

(11)   ZDO:指ZigBee设备对象,可认为是一种公共的功能集,文件用户用自定义的对象调用APS子层的服务和NWK层的服务

(12)   ZMAC:其中Zmac.cZ-StackMAC导出层接口文件,zmac_cb.cZMAC需要调用的网络层函数

(13)   Zmain:Zmain.c主要包含了整个项目的入口函数main(),OnBoard.c包含硬件开始平台类外设进行控制的接口函数

(14)   Output:输出文件目录,这个是EW8051 IDE自动生成的

写的很透彻,这是第二次看,所以转到这里了,以下是我转载地址

http://wanghongjunhust.blog.163.com/blog/static/739259122010112383929594/

Z-Stack 3.0.x is TI's Zigbee 3.0 compliant protocol suite for the CC2530, CC2531, and CC2538 Wireless MCU. Supports the CC2592 and CC2590 RF front ends which extend up to +22dBm and +14dBm transmit power, respectively, and provide improved receiver sensitivity Z-Stack 3.0 combines multiple previous Zigbee profiles into one unified standard Incorporates the unified Zigbee Cluster Library which is at the foundation of dotdot, the universal language for IoT applications defining data objects, models and functionalities for embedded IoT applications Implements Zigbee Base Device Behavior specification, which defines a common set of mechanisms for network forming, discovering, and application provisioning to be used by all Zigbee devices Based on Zigbee PRO 2015 stack, it provides new and improved security modes, including Install Codes for out-of-band key exchange, and Distributed Security Networks for Coordinator-less network topology Supports Green Power Proxy, allowing energy-harvesting and ultra-low power devices to connect seamlessly to a Zigbee network Forwards and backwards compatibility with previous Zigbee PRO and application profiles is maintained Sample Applications included for quick prototyping, including door lock, thermostat, light and switch, and temperature sensor Zigbee Network Processor firmware, providing an abstracted access to the Zigbee Pro 2015 stack and Base Device Behavior functionality via a serial port for two-chip architectures Zigbee-based applications Over-the-air firmware upgrade and serial bootloader capability, allowing for future updates of deployed systems Compatible with TI's Z-Stack Linux Gateway, a reference implementation of an Ethernet-to-Zigbee gateway using a Linux-based platform as host processor, that makes it easy to integrate applications on top of an IP-based interface which abstracts Zigbee protocol functionality to the users.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值