Z-Stack的main函数在Zmain.c中,总体上来说,它一共做了两件工作,一个是系统初始化,即有启动代码来初始化硬件系统和软件架构需要的各个模块,另一个作用就是开始执行操作系统实体。

1.系统初始化

系统启动代码需要完成初始化硬件平台和软件架构所需要的各个模块,为操作系统的运行做好准备工作,主要分为初始化系统时钟,检测芯片工作电压、初始化堆栈、初始化各个硬件模块、初始化FLASH存储、形成芯片MAC地址、初始化非易失量、初始化MAC层协议、初始化化应用帧层协议、初始化操作系统等十余部分,其具体流程图和对应的函数如下:
 
                                              

 图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在项目中的目录结构

个根目录,具体是有什么作用:

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

(2)HAL:硬件层目录,Common目录下的文件是公用文件,基本上与硬件无关,其中hal_assert.c是断言文件,用于调用,hal_drivers.c是驱动文件,抽象出与硬件无关的驱动函数,包含有与硬件相关的配置和驱动及操作函数。Include目录下主要包含各个硬件模块的头文件,而Target目录下的文件是跟硬件平台相关的,可能看到有两个平台,分别是Cc2430DB平台和一个CC2430EB平台。后面的DB和EB表示的是TI公司开发板的型号,其实还有一种类型是BB的,BB:
Battery Board

DB: Development BoardEB: Evaluation Board

分别对应TI公司开发的三种板型,其功能按上顺序依次变强。可以参看"Z-Stack User's Guide for CC2430"的图片,可以获得更直观的认识。

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

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

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

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

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

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

(9)Services:ZigBee和802.15.4设备地址处理函数目录,包括地址模式的定义及地址处理函数

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

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

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

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

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

Z-Stack 软件架构分析的更多相关文章

  1. wpa_supplicant软件架构分析

    wpa_supplicant软件架构分析 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bi ...

  2. 013 - 关于GC root: Native Stack | MAT分析

      Question:   I have some third library code that I run and after some time I run into OutOfMemoryEr ...

  3. openstack(liberty): devstack之stack.sh分析

    学习openstack,从devstack入手,是个不错的选择.devstack中,首先需要分析stack.sh都做了些什么! 这里面涉及到了很多shell的基础知识.我就做个简单的梳理,方便后续查阅 ...

  4. Week2 Teamework from Z.XML 软件分析与用户需求调查(二)应用助手功能评测

    评测人:薛亚杰 周敏轩. 说明:言辞激烈,请勿介意. 软件使用概述 我们团队这次评测的必应助手是必应缤纷桌面的一个小功能,根据评测人员试用几天后发现,它的作用大概就是能够用一种看上去比较生动的形式来给 ...

  5. Week2 Teamework from Z.XML 软件分析与用户需求调查(三)必应助手体验评测

    评测人:毛宇 肖俊鹏 说明:言辞激烈,请勿介意 我花了2天的时间来试用这个软件<必应缤纷桌面手机助手>,有了很多体会,这里,我来谈一下这款软件在体验部分的表现情况. 体验部分主要分为三个部 ...

  6. Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展

    一.Bing搜索的相关背景 第一,必应搜索前几年的发展重点在于欧美市场,并且取得了一定的成效:根据 Hitwise 的统计数据,Bing 在 2011年3 月份市场占有率突破了 30% 大关,达到 3 ...

  7. Week2 Teamework from Z.XML 软件分析与用户需求调查(五)从对比中看见必应助手发展空间

    本文将主要探讨软件功能前景(浮动头像界面,升级式角色),找出与bing助手相类似功能的资深软件,分析这些软件的发展趋势和用户体验,从历史的角度来评测bing助手的某些功能的前景. 1.浮动头像界面-曲 ...

  8. VNPY 软件架构分析

    VNPY 架构设计文档 版本日志: 一. 引言 编写目的: 该软件概要设计说明书是“VNPY”开发中的重要文献资料,所完成的工作是将需求说明书中的数据流图转化成软件结构和数据结构,为后续进行详细设计说 ...

  9. 我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)

    目录 文章目录 目录 Neutron 的软件架构分析与实现 Neutron Server 启动流程 获取 WSGI Application Core API & Extension API C ...

随机推荐

  1. merge into sql优化

    今天网友说他的merge into sql跑了15分钟了还没有跑出数据,问我能不能优化一下,我让他把sql和sql的执行计划发过来 merge into F_Sal_P_Camp_Samp_Cust_ ...

  2. 解决 kindle 书籍字体颜色偏淡问题的方法

    现象 通过Markdown转换而来的mobi格式书籍都有一个大问题:字体偏淡,放在kindle上看对比度很差. 原因分析: 导致这种问题的原因,可能是因为在制作电子书的过程中,这些内容是被标注了彩色或 ...

  3. Linux关闭防火墙、SELinux

    使用root权限: Linux关闭防火墙: 1. chkconfig –list|grep iptables 2. chkconfig iptables off 永久关闭防火墙 3. chkconfi ...

  4. C#后台验证身份证号码的一个方法

    简单的调用了正则表达式进行简单的验证,记下来留着以后备用 if ((!Regex.IsMatch(txtID.Text, @"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X ...

  5. VS2010数据库连接问题

    我用SQL server 2008写了一个小表格,运行VS的前选择了 工具-连接数据库,然后选择了那个表格的名称.运行后出现如下错误提示,请问是哪里出了问题呢? 数据库连接版本有问题.在VS中把信用数 ...

  6. apache2.2 + tomcat6 整合以及集群配置整理

    运行环境:apache2.2.X + tomcat6.0.X + window xp 1. 安装Apache,服务启动后在浏览器中输入http://localhost进行测试,如果能看到一个" ...

  7. 0基础学习ios开发笔记第二天

    C语言的基本结构 c语言的入口函数是main函数. main函数的返回值行业标准是int return 数字:返回值 每条语句最后以分号结尾 注释:行注释.块注释 int main(void) { / ...

  8. UITableView优化的那些事儿

    作为iOS开发,UITableView可能是平时我们打交道最多的UI控件之一,其重要性不言而喻. 关于TableView,我想最核心的就是UITableViewCell的重用机制了. 简单来说呢就是当 ...

  9. javascript 去除字符串中重复字符

    /** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...

  10. Codevs 3233 古道

    3233 古道 时间限制: 1 s 空间限制: 8000 KB 题目等级:**白银 Silver** [传送门](http://codevs.cn/problem/3233/) 题目描述 Descri ...