现在的位置: 首页 > 综合 > 正文

Z-Stack 软件架构分析 Z-Stack 软件架构分析

2013年09月01日 ⁄ 综合 ⁄ 共 7595字 ⁄ 字号 评论关闭

 

Z-Stack 软件架构分析

分类: ZigBee 79人阅读 评论(0) 收藏 举报
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
自动生成的

揭开ZigBee 2006协议栈Z-Stack的”开源“面纱

 (2011-05-27 07:51:14)

标签: 

转载

 

转自:http://blogold.chinaunix.net/u3/104447/showart_2403579.html   

   我们都在说ZigBee 2006协议栈Z-Stack是开源的,但是这个协议栈到底是全部开源的,还是只是开源一部分,让我们来揭开它的“开源”面纱?

   Z-Stack是在2007年4月,德州仪器推出业界领先的ZigBee协议栈,Z-Stack符合ZigBee 2006规范,支持多种平台,Z-Stack包含了网状网络拓扑的几近于全功能的协议栈,在竞争激烈的ZigBee领域占有很重要地位。配合OSAL完成整个协议栈的运行。
   Z-Stack只是ZigBee协议的一种具体的实现,我们要澄清的是ZigBee不仅仅有Z-Stack这一种,也不能把Z-Stack等同于ZigBee2006协议,现在也有好几个真正开源的ZigBee协议栈,例如:msstatePAN协议栈,freakz协议栈,这些都是ZigBee协议的具体实现,而且是全部真正的开源的,它们的所有源代码我们都可以看到,而Z-Stack中的很多关键的代码是以库文件的形式给出来,也就是我们只能用它们,而看不到它们的具体的实现。那下面我们就以Z-Stack1.4.3-1.2.0看看它的组织架构,那些功能是开源的,那些是以库文件的形式提供给我们的。我们利用Z-Stack开发应用,只能知道怎么做和做什么也就是“how”和“what”,而不能准确的知道“为什么”,“why”.我们也可以通过真正这些开源的ZigBee协议栈了解为什么。
   我们可以从TI的官方网站下载最新的协议栈,http://www.ti.com/zigbee 我这里的是ZigBee2006版本为版本的。下载完以后我们可以点击EXE文件进行安装,默认会在C盘的根目录下建立Texas
Instruments目录,该目录下面的子目录就是安装Z-Stack的文件。下面的这个图就是Z-Stack协议栈的目录结构,
[转载]【转】揭开ZigBee <wbr>2006协议栈Z-Stack的鈥澘粹溍嫔
   根目录下有一个Getting Started Guide CC2430.pdf文件,是安装卸载协议栈的说明文件,另外三个文件夹分别是Documents Components 和Project。
1.Documents
   Documents文件夹包含了对整个协议栈进行说明的所有文档信息,下面有很多的PDF格式的文档,内容比较多,不过也无需全部的细读,我们可以把它们当做参考手册,根据需要来阅读。
2. Components
   Components文件夹是Z-Stack协议栈的各个功能部件的实现,本文件夹下包含的子目录如下:

[转载]【转】揭开ZigBee <wbr>2006协议栈Z-Stack的鈥澘粹溍嫔
 
1)hal文件夹为硬件平台的抽象层
2)mac文件夹包含了802.15.4物理协议的实现说需要代码文件的头文件,由于TI公司处于某种考虑,这部分并没有给出具体的源代码,而是以库文件的形式存在.ProjectszstackLibraries文件夹给出
3)mt 文件夹包含了为系统添加在电脑上有Z-tools调试的功能所需要的源文件
4)osal包含了操作系统抽象层所需要的文件
5)service文件夹保护了Z-Stack提供的两种服务:寻址服务和数据服务所需要的文件
6)stack文件夹是components文件夹最核心的部分,是ZigBee协议栈具体实现部分,在在其下有分为了af(应用框架),nwk(网络层),sapi(简单应用接口)、sec(安全)、sys(系统头文件),zcl(ZigBee簇库),zdo(ZigBee设备对象)等7个文件夹。
7)zmac文件夹包含了Z-Stack MAC 导出层文件。
还有一个Project目录,该目录下包含了用于Z-Stack功能演示的各个项目的例子。可供开发者们参考。
   从上面我们可以看到其中核心部分的代码都是编译好的,以库文件的形式给出的,比如安全模块,路由模块,和Mesh自组网模块。如果要获得这部分的源代码可以向TI购买,可能花费不菲,可要大几万人民币。TI所谓的“开源”只是提供给我们一个平台,开发者可以在上面做应用而已,而绝不是我们通常理解的开源。也就我们在下载后源代码后,有些函数我们根本无法查看到它们的源代码的原因。现在TI公司提供的CC2480芯片,已经把这个协议栈固化到了硬件中,我们只需要掌握几个简单的API就可以完成基本的应用开发。现在也有公司开发出了基于AT指令集的ZigBee协议栈,更方便开发了。
在前面也提到过一些真正开源的ZigBee协议栈,不过这些协议栈没有大的商业公司的支持,开发升级方面,性能方面和TI公司的还是有很大的差距,这里就简单的介绍几个:
(1)msstatePAN协议栈
   msstatePAN协议栈是由密西西比大学的R.Reese教授为广大无线技术爱好者开发的精简版ZigBee协议栈,基于标准C语言编写,基本具备了 ZigBee协议标准所规定的功能,最新版本为V0.2.6,该版本支持多种开发平台,包括PICDEM Z、CC2430评估板、MSP430+CC2420(Tmote)以及WIN32虚拟平台。源代码是开放的,整个协议栈是基于状态机(FSM)实现的。如果你的程序构架不是基于操作系统的,有限状态机应该是一个很好的选择。而且OS(operating
system)中进程的状态也是个各个状态间的切换。
该协议栈的网站地址如下   http://www.ece.msstate.edu/~reese/msstatePAN/   
在网站上我们可以看到起最近的更新是在2007年,到目前为止已经有三年多的时间没有更新升级了。
(2)freakz协议栈和contiki操作系统。
    freakz是一个彻底的开源zigbee协议,配合contikj操作系统,相当于Z-Stack+OSAL。相对于另外一个开源的WSN(Wireless
Sensor Networking
,无线传感网)操作系统TinyOS来讲,contiki的代码全部为C语言写成,用GCC进行编译,对广大应用C语言多年的开发者
来说,减少了学习另外一种语言与编译平台所带来的时间花费。
其下载地址如下:
   这里介绍一个专门研究开源ZigBee协议的网站,主要是frankz协议栈,已经写了很多好的文章。下面是他们的网站:
(3) TinyOS  :
    TinyOSUC Berkeley(加州大学伯克利分校)开发的开放源代码操作系统,专为嵌入式无线传感网络设计,操作系统基于构件(component-based)的架构使得快速的更新成为可能,而这又减小了受传感网络存储器限制的代码长度。TinyOS的构件包括网络协议、分布式服务器、传感器驱动及数据识别工具。它只是一个操作系统,不过现在已经成立了
TinyOS ZigBee Working Group 已经开始设计开源的zigbee。非常值得我们的期待。
下载地址如下:

抱歉!评论已关闭.