编号:_______________本资料为word版本,可以直接编辑和打印,感谢您的下载TIZstack协议栈开发环境和工作流程甲方:___________________乙方:___________________日期:___________________TI Z-stack 协议栈开发环境和工作流程系统软件设计是在硬件设计的基础上进行的,良好的软件设计是 实现系统功能的重要环节,也是提高系统性能的关键所在。
节点设计基丁通用 性及便丁开发的考虑,移植了 TI 公司的Z-Stack 协议栈,其主要特点就是其兼 容性,完全支持IEEE 802. 15. 4/ZigBee 的CC2430片上系统解决方案。
Z-Sta ck 还支持丰富的新特性,如无线下载,可通过 ZigBee 网状网络(Mesh Networ k)下载节点更新。
Z furn gr irrc vrivci t Bfei AS JJiflll-ltC -liNri l -lie *4--? U ■Bl.K II图ZigBee 节点开发环境TI 的Z-Stack 装载在一个基丁 IAR 开发环境的工程里。
强大的IAR E mbedded Workbench 除了提供编译下载功能外,还可以结合编程器进行单步跟踪 调试和监测片上寄存器、Flash 数据等。
Z-Stack 根据IEEE 802. 15.4 和ZigB ee 标准分为以下几层: API (Application Programming Interface ) , HAL (H ardware Abstract Layer ) , MAC( Media Access Control) , NWK( Zigbee Ne twork Layer ) , OSAL( Operating System Abstract System ) , Security , Se rvice , ZDO(Zigbee Device Objects )。
使用 IAR 打开工程文件 SampleApp.e ww 后,即可查看到整个协议栈从 HAL 层到APP 层的文件夹分布。
该协议栈可以 实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储, 因此网络具有一定的记忆功能。
Z-Stack 采用操作系统的思想来构建,采用事件轮循机制,当各层 初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断 Ri-TPr —iw"" t ■ WT ■ E M ± -处理事件,结束后继续进入低功耗模式。
如果同时有几个事件发生,判断优先级,逐次处理事件。
这种软件构架可以极大地降级系统的功耗。
整个Z-stack的主要工作流程,大致分为系统启动,驱动初始化,OSAL 初始化和启动,进入任务轮循几个阶段,下面将逐一详细分析。
图Z-Stack系统运行流程图Figure . The Flow Chart of Z-Stack系统初始化系统上电后,通过执行ZMain文件夹中ZMain.c的ZSEG int main() 函数实现硬件的初始化,其中包括关总中断osal_int_disable( INTS_ALL ) 、初始化板上硬件设置HAL_BOARD_INIT( > 初始化I/O 口InitBoard( OB_COLD )、初始化HAL层驱动HalDriverInit() 、初始化非易失性存储器sal_nv_init( NULL)、初始化MAd ZMacInit()、分配64 位地址zmain_ext_addr()、初始化操作系统osal_init_system() 等。
硬件初始化需要根据HAL文件夹中的hal_board_cfg.h 文件配置寄存器8051的寄存器。
TI官方发布Z-stack的配置针对的是TI官方的开发板CC2430DB CC2 430EM溯,如采用其他开发板,则需根据原理图设计改变hal_board_cfg.h 文件配置,例如本方案制作的实验板与TI官方的I/O 口配置略仆同,其中状态指示LED2的需要重新设置LED2控制引脚口、通用I/O 口方向和控制函数定义华当顺利完成上述初始化时,执行osal_start_system() 函数开始运行OSALR统。
该任务调度函数按照优先级检测各个任务是否就绪。
如果存在就绪的任务则调用tasksArr[] 中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。
如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。
程序流程如图3-13所示。
osal_start_system() —旦执行,则不再返回Main()函数。
OSALff务调度流程图Figure . The Flow Chart of OSAL SchedulerOSAL任务OSA配协议栈的核心,Z-stack的任何一个子系统都作为OSAL勺一个任务,因此在开发应用层的时候,必须通过创建OSALff务来运行应用程序。
通过osalI nitTasks() 函数创建OSALff务,其中TaskID为每个任务的唯一标识号。
任何OSALS务必须分为两步:一是进行任务初始化;二是处理任务事件。
任务初始化主要步骤如下:(1) 初始化应用服务变量。
const pTaskEventHandlerFn tasksArr[] 数组定义系统提供的应用服务和用户服务变量,如MACM服务macEventLoo》用户服务SampleApp_ProcessEvent (2) 分配任务ID和分配堆栈内存void osalInitTasks( void ) 主要功能是通过调用osal_mem_alloc()函数给各个任务分配内存空间,和给各个已定义任务指定唯一的标识号。
(3) 在AF层注册应用对象通过填入endPointDesc_t数据格式的EndPoint变量,调用afRegiste r()在AF层注册EndPoint应用对象。
通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用丁发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。
(4) 注册相应的OSA或则HAL系统服务在协议栈中,Z-stack提供键盘响应和申口活动响应两种系统服务,但是任何Z-Stask任务均不自行注册系统服务,两者均需要由用户应用程序注册。
值得注意的是,有且仅有一个OSAL Task可以注册服务。
例如注册键盘活动响应可调用RegisterForKeys() 函数。
(5) 处理任务事件处理任务事件通过创建“ ApplicationName ” _ProcessEvent()函数处理。
一个OSALff务除了强制事件(Mandatory Events )之外还可以定义15个事件。
SYS_EVENT_MSGx8000)是强制事件。
该事件主要用来发送全局的系统信息,包括五下信息:AF_DATA_CONFIRM_CMD言息用来指示通过唤醒AF DataRequest()函数发送的数据请求信息的情况。
ZSuccess确认数据请求成功的发送。
如果数据请求是通过AF_ACK_REQUEW实现的,那么ZSussess可以确认数据正确的到达目的地。
否则,ZSucess仅仅能确认数据成功的传输到了下一个路由。
AF_INCOMING_MSG_CMW 指示接收到的AF信息。
KEY_ CHANG削来确认按键动作。
ZDO_ NEW_ DSTADD用来指示自动匹配请求。
ZDO_STATE_CHAN GE来指示网络状态的变化。
网络层信息Zigbee设备有两种网络地址:1个是64位的IEEE地址,通常也叫作MAC!址或者扩展地址(Extended address ),另一个是16位的网络地址,也叫做逻辑地址(Logical address )或者短地址。
64位长地址是全球唯一的地址,并且终身分配给设备。
这个地址可由制造商设定或者在安装的时候设置,是由IEEE来提供。
当设备加入Zigbee网络被分配一个短地址,在其所在的网络中是唯一的。
这个地址主要用来在网络中辨识设备,传递信息等。
协调器(Coordinator )首先在某个频段发起一个网络,网络频段的定义放在D EFAULT_ CHANLIST置文件里。
如果ZDAPP_ CONFIG_ PANID义的PAN ID是0xFFFF(代表所有的PAN ID),则协调器根据它的IEEE地址随机确定一个PAN ID。
否则,根据ZDAPP_ CONFIG_ PANID定义建立PAN ID。
当节点为Router 或者End Device时,设备辱会试图加入DEFAULT_ CHANLIST指定的工作频段。
如果ZDAPP_ CONFIG_ PANID有设为 0xFFFF,则Router 或者End Device 会加入ZDAPP_ CONFIG_ PANID定义的PAN ID。
设备上电之后会自动的形成或加入网络,如果想设备上电之后不马上加入网络或者在加入网络之前先处理其他事件,可以通过定义HOLD_AUTO_STA RT现。
通过调用ZDApp_StartUpFromApp()来手动定义多久时间之后开始加入网络。
设备如果成功的加入网络,会将网络信息存储在非易失性存储器( NV Flash )里,掉电后仍然保存,这样当再次上电后,设备会自动读取网络信息,这样设备对网络就有一定的记忆功能。
对NV Flash的动作,通过NV_RESTORE(帮NV _ITNT()函数来执行。
有关网络参数的设置大多保存在协议栈Tools文件夹的f8wConfig.cfg 里。
路由Z-Stack采用无线自组网按需平面距离欠量路由协议AODV建立一个Hoc网络,支持移动节点,链接失败和数据丢失,能够自组织和自修复。
当一个Router接受到一个信息包之后,NMKS将会进行以下的工作:首先确认目的地,如果目的地就是这个Router的邻居,信息包将会直接传输给目的设备;否则,Router将会确认和目的地址相应的路由表条目,如果对丁目的地址能找到有效的路由表条目,信息包将会被传递到该条目中所存储的下一个hop地址;如果找不到有效的路由表条目,路由探测功能将会被启动,信息包将会被缓存直到发现一个新的路由信息。
ZigBee End Device不会执行任何路由函数,它只是简单的将信息传送给前面的可以执行路由功能的父设备。
因此,如果End Device想发送信息给另外一个E nd Device ,在发送信息之间将会启动路由探测功能,找到相应的父路由节点。