当前位置:文档之家› TIZstack协议栈开发环境和工作流程

TIZstack协议栈开发环境和工作流程

TIZstack协议栈开发环境和工作流程

TI Z-stack协议栈开发环境和工作流程

By KuangJunBin

KuangJunBin: 如您对本项目感兴趣或者有任何疑问, 欢迎与我一起探讨: 。谢谢您的阅读!

系统软件设计是在硬件设计的基础上进行的, 良好的软件设计是实现系统功能的重要环节, 也是提高系统性能的关键所在。节点设计基于通用性及便于开发的考虑, 移植了TI公司的Z-Stack协议栈, 其主要特点就是其兼容性, 完全支持IEEE 802. 15. 4/ZigBee的CC2430片上系统解决方案。Z-Stack还支持丰富的新特性, 如无线下载, 可经过ZigBee网状网络( Mesh Network) 下载节点更新。

图 ZigBee节点开发环境

TI的Z-Stack装载在一个基于IAR开发环境的工程里。强大的IAR Embedded Workbench除了提供编译下载功能外, 还能够结合编程器进行单步跟踪调试和监测片上寄存器、 Flash数据等。Z-Stack根据IEEE 802. 15.4和ZigBee标准分为以下几层: API( Appli cation Programming Interface) , HAL ( Hardware Abstract Layer) , M AC( Media Access Control), NWK( Zigbee Network Layer) , OSAL( Operating System Abstract System) , Security, Service, ZDO( Zigbee Device Objects) 。使用IAR打开工程文件SampleApp.eww后, 即可查看到整个协议栈从HAL层到APP层的文件夹分布。该协议栈能够实现复杂的网络链接, 在协调器节点中实现对路由表和绑定表的非易失性存储, 因此网络具有一定的记忆功能。

Z-Stack采用操作系统的思想来构建, 采用事件轮循机制, 当各层初始化之后, 系统进入低功耗模式, 当事件发生时, 唤醒系统, 开始进入中断处理事件, 结束后继续进入低功耗模式。如果同时有几个事件发生, 判断优先级, 逐次处理事件。这种软件构架能够极大地降级系统的功耗。

整个Z-stack的主要工作流程, 大致分为系统启动, 驱动初始化, OSAL初始化和启动, 进入任务轮循几个阶段, 下面将逐一详细分析。

图 Z-Stack

系统运行流程图

Figure . The Flow Chart of Z-Stack

系统初始化

系统上电后, 经过执行ZMain文件夹中ZMain.c的ZSEG int m ain( )函数实现硬件的初始化, 其中包括关总中断osal_int_disable( I NTS_ALL )、初始化板上硬件设置HAL_BOARD_INIT( )、初始化I/O口InitBoard( OB_COLD )、初始化HAL层驱动HalDriverIn it( )、初始化非易失性存储器sal_nv_init( NULL )、初始化MAC 层ZMacInit( )、分配64位地址zmain_ext_addr( )、初始化操作系统osal_init_system( )等。

硬件初始化需要根据HAL文件夹中的hal_board_cfg.h文件配置寄存器8051的寄存器。TI官方发布Z-stack的配置针正确是TI 官方的开发板CC2430DB、 CC2430EMK等, 如采用其它开发板, 则需根据原理图设计改变hal_board_cfg.h文件配置, 例如本方案制

作的实验板与TI官方的I/O口配置略有不同, 其中状态指示LED2的需要重新设置LED2控制引脚口、通用I/O口方向和控制函数定义等。

当顺利完成上述初始化时, 执行osal_start_system( )函数开始运行OSAL系统。该任务调度函数按照优先级检测各个任务是否就绪。如果存在就绪的任务则调用tasksArr[ ]中相对应的任务处理函数去处理该事件, 直到执行完所有就绪的任务。如果任务列表中没有就绪的任务, 则能够使处理器进入睡眠状态实现低功耗。程序流程如图3-13所示。osal_start_system( )一旦执行, 则不再返回Main ( )函数。

OSAL任务调度流程图

Figure . The Flow Chart of OSAL Scheduler

OSAL任务

OSAL是协议栈的核心, Z-stack的任何一个子系统都作为OS AL的一个任务, 因此在开发应用层的时候, 必须经过创立OSAL任务来运行应用程序。经过osalInitTasks( )函数创立OSAL任务, 其中TaskID为每个任务的唯一标识号。任何OSAL任务必须分为两步: 一是进行任务初始化; 二是处理任务事件。任务初始化主要步骤如下:

( 1) 初始化应用服务变量。

const pTaskEventHandlerFn tasksArr[ ]数组定义系统提供的应用服务和用户服务变量, 如MAC层服务macEventLoop、用户服

务SampleApp_ProcessEvent等

( 2) 分配任务ID和分配堆栈内存

void osalInitTasks( void )主要功能是经过调用osal_mem_alloc( )函数给各个任务分配内存空间, 和给各个已定义任务指定唯一的标识号。

( 3) 在AF层注册应用对象

经过填入endPointDesc_t数据格式的EndPoint变量, 调用 afRegi ster( )在AF层注册EndPoint应用对象。

经过在AF层注册应用对象的信息, 告知系统afAddrType_t地址类型数据包的路由端点, 例如用于发送周期信息的SampleApp_P

eriodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAdd r。

( 4) 注册相应的OSAL或则HAL系统服务

在协议栈中, Z-stack提供键盘响应和串口活动响应两种系统服务, 可是任何Z-Stask任务均不自行注册系统服务, 两者均需要由用户应用程序注册。值得注意的是, 有且仅有一个OSAL Task能够注册服务。例如注册键盘活动响应可调用RegisterForKeys( )函数。

( 5) 处理任务事件

处理任务事件经过创立”ApplicationName”_ProcessEvent( )函数处理。一个OSAL任务除了强制事件( Mandatory Events) 之外还能够定义15个事件。

SYS_EVENT_MSG( 0x8000) 是强制事件。该事件主要用来发送全局的系统信息, 包括以下信息:

AF_DATA_CONFIRM_CMD: 该信息用来指示经过唤醒AF D ataRequest( )函数发送的数据请求信息的情况。ZSuccess确认数据请求成功的发送。如果数据请求是经过AF_ACK_REQUEST置位实现的, 那么ZSussess能够确认数据正确的到达目的地。否则, ZS ucess仅仅能确认数据成功的传输到了下一个路由。

AF_INCOMING_MSG_CMD: 用来指示接收到的AF信息。

KEY_ CHANGE: 用来确认按键动作。

ZDO_ NEW_ DSTADDR: 用来指示自动匹配请求。

相关主题