TI_Z-stack协议栈开发环境和工作流程
- 格式:doc
- 大小:107.50 KB
- 文档页数:10
Zstack入门教程第一步:安装Zstack从TI官方网站上下载的Zstack为:swrc072c.zip,我想这个压缩包大家都认识。
解压之后为:ZStack-CC2430-1.4.3.exe文件。
这个安装文件大家都会了。
默认安装路径为:C:\Texas Instruments\ZStack-1.4.3。
安装之后在C:\Texas Instruments\ZStack-1.4.3目录下有各PDF 文档为:Getting Started Guide CC2430.pdf,不用多说,这个肯定是要看的。
既然把它放到这么前面,说明它是入门中的入门文档。
下面就简单介绍下这个文档:1、介绍了安装ZStack-CC2430-1.4.3.exe需要的硬件软件条件:需要电脑、操作系统为Windows 2000或Windows XP。
至于更高或更低版本的本人没有尝试。
2、讲了安装流程。
这个有点多余了,这年月哪个有电脑的没有安装上百上千次的软件啊?但是需要强调的是安装路径----默认就好!3、接下来就是让我们看的第一个文档为:Start->Programs->Texas Instruments->ZStack-1.4.3->Z-Stack User’s Guide,既然让我看我就来看看这个文档!!第二步:Z-Stack 用户指导这个文档的更新时间为:2007年12月21日----应该还是比较新的版本。
由于本人英文的却有限,就不翻译了,浏览一遍,把大概意思说下就可以了:1、介绍1.1、适用范围本文档适用于CC2430ZigBee开发板----CC2430ZDK。
2、产品包描述(TI提供的CC2430ZDK工具包)2.1、安装包内容这个就是上面提到的的ZStack-CC2430-1.4.3.exe安装之后的所有内容了。
说白了就是包含Zstack开发所需要的所有软件和文档资料等。
2.2、开发板介绍两块SmartRF04EB 评估版,每个都可以用于CC2430EM评估模块。
Zstack入门教程第一步:安装Zstack从TI官方网站上下载的Zstack为:swrc072c.zip,我想这个压缩包大家都认识。
解压之后为:ZStack-CC2430-1.4.3.exe文件。
这个安装文件大家都会了。
默认安装路径为:C:\Texas Instruments\ZStack-1.4.3。
安装之后在C:\Texas Instruments\ZStack-1.4.3目录下有各PDF 文档为:Getting Started Guide CC2430.pdf,不用多说,这个肯定是要看的。
既然把它放到这么前面,说明它是入门中的入门文档。
下面就简单介绍下这个文档:1、介绍了安装ZStack-CC2430-1.4.3.exe需要的硬件软件条件:需要电脑、操作系统为Windows 2000或Windows XP。
至于更高或更低版本的本人没有尝试。
2、讲了安装流程。
这个有点多余了,这年月哪个有电脑的没有安装上百上千次的软件啊?但是需要强调的是安装路径----默认就好!3、接下来就是让我们看的第一个文档为:Start->Programs->Texas Instruments->ZStack-1.4.3->Z-Stack User’s Guide,既然让我看我就来看看这个文档!!第二步:Z-Stack 用户指导这个文档的更新时间为:2007年12月21日----应该还是比较新的版本。
由于本人英文的却有限,就不翻译了,浏览一遍,把大概意思说下就可以了:1、介绍1.1、适用范围本文档适用于CC2430ZigBee开发板----CC2430ZDK。
2、产品包描述(TI提供的CC2430ZDK工具包)2.1、安装包内容这个就是上面提到的的ZStack-CC2430-1.4.3.exe安装之后的所有内容了。
说白了就是包含Zstack开发所需要的所有软件和文档资料等。
2.2、开发板介绍两块SmartRF04EB 评估版,每个都可以用于CC2430EM评估模块。
8.1 TI Z-Stack协议栈代码介绍TI公司在提供Zigbee无线单片机CC2530的同时,也提供了Z-Stack协议栈源代码,以方便设计人员将Z-Stack直接移植到CC2530上使用,使其支持IEEE 802. 15. 4/ZigBee 协议。
TI也提供比较多的工具软件,如CC2530的FLASH编程软件,包监视分析软件,以及一些在协议之上的应用案例,简单点对点通信软件、智能家居应用软件等。
为了使我们自己的系统稳定可靠运行,必须保证硬件的设计稳定可靠,满足需要的功能要求外,软件的设计也是同样重要的。
为了使整个系统能很好的正常工作,必须让软硬件协同操作,在TI的Z-Stack协议栈之上开发我们自己的软件系统,不愧为一种很好的、省力的方式。
自己去写Z-Stack协议栈代码并让其稳定运行是不现实的,不是投入太大就是时间太长。
这样,对TI的Z-Stack协议栈代码进行必要的了解是非常必要的。
通过IAR软件打开TI的Z-Stack协议栈,如下图所示:第一次打开工程印象最深刻的就是左边一排文件夹,非常多,很庞杂,感觉无从下手。
我们先不深入目录之下,先了解每个目录放的是什么内容,那么知道各个文件夹大概是什么功能,分布在 ZIGBEE 的哪一层,那么在以后的工作中无论是查询某些功能函数还是修改某些功能函数,甚至是添加或删除某些功能函数就能顺利的找到在什么地方了,方便对Z-Stack协议栈软件的更深入的学习了解。
下面对Z-Stack协议栈的文件夹进行介绍:APP(ApplicationProgramming):应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。
APP:用户应用程序及接口,包括串口数据处理、无线接收数据处理、用户LCD显示处理、传感器数据读取和发送等。
HAL(Hardware (H/W) Abstraction Layer):硬件层目录,包含有与硬件相关的配置和驱动及操作函数。
【⽆线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组⽹项⽬及详细讲解篇物联⽹⽆线通信技术,ZigBee⽆线传感⽹络CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输Zstack协议栈是ZigBee协议栈⾥的翘楚,是ZigBee组⽹的⾸选协议栈项⽬实现功能:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果扩展功能(当前未实现,可进⼀步开发实现):l 连接协调器串⼝,将终端节点采集的数据通过串⼝发送,PC写上位机实现数据展⽰l 连接WIFI或者4G模块,WIFI模块如ESP8266,实现数据局域⽹⽆线传输或者上传到OneNET、机智云、阿⾥云、⾃⼰开发云服务器等,实现WEB或⼿机APP显⽰和控制。
⼀、项⽬测试(可想⽽知,⼴州的天⽓有多热,39℃了都)实现功能汇总:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果(⼀) 环境汇总芯⽚:CC2530F256Zstack协议栈:ZStack-CC2530-2.5.1a编程环境:IAR(⼆) 引脚分配协调器:128*64 OLED 0.96⼨屏幕供电:3.3V通信协议:IIC引脚:SDA P0_6SCL P0_7按键:IO:P0_1下降沿触发中断终端1:DHT11:通信⽅式:单总线协议供电:3.3VIO:P0_6终端2:LEDIO:P1_0说明:⾼电平点亮,低电平熄灭⼆、基础认识(⼀) CC2530单⽚机CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输。
「ZigBee模块」协议栈-Z-Stack协议栈基础和数据传输实验花了好久写的...感觉还不错的呢...如果看,请细看...Mua~Z-Stack协议栈基础和数据传输实验一、实验目的终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来。
串口优化把有线串口传输改为无线蓝牙传输。
二、实验平台硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块软件:实验基于SampleApp工程进行。
三、实验步骤1.串口初始化代码2.发送部分代码3.接收部分代码四、协议栈基础做实验之前先了解一点关于协议栈的基础知识吧~什么是协议栈?我们知道使用Zigbee一般都要进行组网、传输数据。
可想而知其中的代码数量是非常庞大的,如果我们每次使用zigbee都需要自己写所以代码的话,会非常麻烦。
因此就有了协议栈。
可以说它是一个小型的操作系统,把很多通信、组网之类的代码都封装起来了。
我们要做的只是通过调用函数来实现我们的目的。
来看一下协议栈的工作流程图(图1)。
然后我会对照流程图对协议栈进行简单的分析。
图1我们就从流程图的“开始”开始分析吧~打开工程文件SampleApp,main函数是程序执行的开始,我们要先找到它。
Main函数在ZMAin文件夹的ZMain.c下,打开它,找到main函数。
main();浏览一下main函数可以看到一开始都是各种初始化函数,即对应流程图中的“各种初始化函数”。
初始化中我们需要注意的是“osal_init_system();”初始化操作系统函数。
等一下会对它进行说明。
继续看下去,“osal_start_system();”这是执行操作系统函数,对应流程中的“运行操作系统”。
注意这个函数进去之后是不会再返回的。
总结main函数就是初始化和执行操作系统两个部分。
我们再来分析一下“osal_init_system();”这个函数,它的功能是初始化操作系统。
系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。
节点设计基于通用性及便于开发的考虑,移植了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(Application Programming Interface),HAL (Hardware Abstract Layer),MAC(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是TI公司针对Zigbee协议推出的一个开源协议栈。
它基于Zigbee协议规范,提供了从物理层到应用层的完整实现,帮助开发者快速构建Zigbee无线应用。
Z-Stack采用模块化设计,方便开发者根据需求进行功能裁剪和扩展。
同时,Z-Stack具有良好的可移植性和可维护性,支持多种平台和开发环境。
Z-Stack主要包括以下几个部分:物理层、MAC层、网络层和应用层。
其中,网络层包括Zigbee协议的核心功能,如拓扑结构、路由机制、安全机制等。
应用层则提供了丰富的API接口,方便开发者进行应用开发。
Z-Stack的发展经历了多个版本,不断优化和完善。
目前,Z-Stack已经成为Zigbee领域广泛应用的协议栈之一,被广泛应用于智能家居、工业自动化、环境监测等领域。
竭诚为您提供优质文档/双击可除zstack协议栈简介篇一:zstack完整资料\zigbee\南京\cc2530模块资料(天线杆版本)\cc2530模块资料(天线杆版本)\相关的学习文档\zstackosal详解.pdf\zigbee\南京\cc2530模块资料(天线杆版本)\cc2530模块资料(天线杆版本)\相关的学习文档\zigbee技术实践教程.pdf\zigbee\z-stack\z-stack_api.pdf配置cc2530的第2功能时,不需要配置方向寄存器,否则可能出错hal_key.c下的halkeyconfig()函数中/*Rising/Fallingedgeconfiguratinn*/hal_key_joy_moVe_ictl/*cleartheedgebit*//*Forfallin gedge,thebitmustbeset.*/#if(hal_key_joy_moVe_edge==hal_key_Falling_edge) hal_key_joy_moVe_ictl|=hal_key_joy_moVe_edgebit;#endif有错,应将hal_key_joy_moVe_ictl改为pictl1zigbee协议架构1.1zigbee简介zigbee是ieee802.15.4协议的代名词。
根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。
这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。
其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本。
主要适合用于自动控制和远程控制领域,可以嵌入各种设备。
zigbee是一种新兴的短距离、低速率、低功耗无线网络技术,它是一种介于无线标记技术和蓝牙之间的技术提案。
它此前被称作“homeRFlite”或“FireFly”无线技术,主要用于近距离无线连接。
zstack协议栈
首先,我们来看看zstack协议栈的虚拟化管理功能。
zstack协议栈提供了一套
完整的虚拟化管理解决方案,包括虚拟机的创建、启动、停止、迁移等功能。
通过zstack协议栈,用户可以方便地管理大规模的虚拟化环境,提高资源利用率,降低
管理成本。
其次,zstack协议栈还提供了丰富的网络管理功能。
在云计算环境中,网络是
至关重要的一部分,而zstack协议栈通过提供虚拟网络、网络安全、负载均衡等功能,帮助用户轻松构建和管理复杂的网络环境,保障云计算环境的稳定和安全。
此外,zstack协议栈还具备存储管理功能。
在云计算环境中,存储是非常重要
的一部分,而zstack协议栈通过提供虚拟化存储、快照、备份等功能,帮助用户高效管理存储资源,保障数据的安全和可靠性。
总的来说,zstack协议栈是一种功能强大的开源软件,它为用户提供了一套完
整的云计算解决方案,包括虚拟化管理、网络管理、存储管理等功能。
通过使用zstack协议栈,用户可以轻松构建和管理复杂的云计算基础设施,提高资源利用率,降低管理成本,保障云计算环境的稳定和安全。
在未来,随着云计算技术的不断发展,zstack协议栈将继续发挥重要作用,为
用户提供更加优质的云计算解决方案,推动云计算技术的进步和发展。
相信在不久的将来,zstack协议栈将成为云计算领域的重要支撑,为用户带来更加便利和高效
的云计算体验。
TI Z-stack协议栈开发环境和工作流程系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。
节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802. 15. 4/ZigBee的CC2430片上系统解决方案。
Z-Stack还支持丰富的新特性,如无线下载,可通过ZigBee网状网络(Mesh Network)下载节点更新。
图 ZigBee节点开发环境TI的Z-Stack装载在一个基于IAR开发环境的工程里。
强大的IAR Embed ded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。
Z-Stack根据IEEE 802. 15.4和ZigBee标准分为以下几层:API(Application Programming Interface),HAL (Hardw are Abstract Layer),MAC(Media Access Control), NWK(Zigbee Networ k Layer),OSAL(Operating System Abstract System),Security,Servic e,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 main( )函数实现硬件的初始化,其中包括关总中断osal_int_disable( INTS_ALL )、初始化板上硬件设置HAL_BOARD_INIT( )、初始化I/O口InitBoard( OB_COLD )、初始化HAL层驱动HalDriverInit( )、初始化非易失性存储器sal_nv_init( NULL )、初始化MAC层ZMacInit( )、分配64位地址zmain_ext_addr( )、初始化操作系统osal_init_system( )等。
硬件初始化需要根据HAL文件夹中的hal_board_cfg.h文件配置寄存器8051的寄存器。
TI官方发布Z-stack的配置针对的是TI官方的开发板CC2430DB、CC2 430EMK等,如采用其他开发板,则需根据原理图设计改变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 SchedulerOSAL任务OSAL是协议栈的核心,Z-stack的任何一个子系统都作为OSAL的一个任务,因此在开发应用层的时候,必须通过创建OSAL任务来运行应用程序。
通过osalIn itTasks( )函数创建OSAL任务,其中TaskID为每个任务的唯一标识号。
任何O SAL任务必须分为两步:一是进行任务初始化;二是处理任务事件。
任务初始化主要步骤如下:(1)初始化应用服务变量。
const pTaskEventHandlerFn tasksArr[ ]数组定义系统提供的应用服务和用户服务变量,如MAC层服务macEventLoop、用户服务SampleApp_ProcessEvent等(2)分配任务ID和分配堆栈内存void osalInitTasks( void )主要功能是通过调用osal_mem_alloc( )函数给各个任务分配内存空间,和给各个已定义任务指定唯一的标识号。
(3)在AF层注册应用对象通过填入endPointDesc_t数据格式的EndPoint变量,调用 afRegister( )在AF层注册EndPoint应用对象。
通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用于发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。
(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 DataRequest( )函数发送的数据请求信息的情况。
ZSuccess确认数据请求成功的发送。
如果数据请求是通过AF_ACK_REQUEST置位实现的,那么ZSussess可以确认数据正确的到达目的地。
否则,ZSucess仅仅能确认数据成功的传输到了下一个路由。
AF_INCOMING_MSG_CMD:用来指示接收到的AF信息。
KEY_ CHANGE:用来确认按键动作。
ZDO_ NEW_ DSTADDR:用来指示自动匹配请求。
ZDO_STATE_CHANGE:用来指示网络状态的变化。
网络层信息Zigbee设备有两种网络地址:1个是64位的IEEE地址,通常也叫作MAC地址或者扩展地址(Extended address),另一个是16位的网络地址,也叫做逻辑地址(Logical address)或者短地址。
64位长地址是全球唯一的地址,并且终身分配给设备。
这个地址可由制造商设定或者在安装的时候设置,是由IEEE来提供。
当设备加入Zigbee网络被分配一个短地址,在其所在的网络中是唯一的。
这个地址主要用来在网络中辨识设备,传递信息等。
协调器(Coordinator)首先在某个频段发起一个网络,网络频段的定义放在DE FAULT_ CHANLIST配置文件里。
如果ZDAPP_ CONFIG_ PANID定义的PAN ID是0 xFFFF(代表所有的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_START来实现。
通过调用ZDApp_StartUpFromApp( )来手动定义多久时间之后开始加入网络。
设备如果成功的加入网络,会将网络信息存储在非易失性存储器(NV Flash)里,掉电后仍然保存,这样当再次上电后,设备会自动读取网络信息,这样设备对网络就有一定的记忆功能。
对NV Flash的动作,通过NV_RESTORE( )和NV_ITNT( )函数来执行。
有关网络参数的设置大多保存在协议栈Tools文件夹的f8wConfig.cfg里。
路由Z-Stack采用无线自组网按需平面距离矢量路由协议AODV,建立一个Hoc网络,支持移动节点,链接失败和数据丢失,能够自组织和自修复。
当一个Router接受到一个信息包之后,NMK层将会进行以下的工作:首先确认目的地,如果目的地就是这个Router的邻居,信息包将会直接传输给目的设备;否则,Router将会确认和目的地址相应的路由表条目,如果对于目的地址能找到有效的路由表条目,信息包将会被传递到该条目中所存储的下一个hop地址;如果找不到有效的路由表条目,路由探测功能将会被启动,信息包将会被缓存直到发现一个新的路由信息。
ZigBee End Device不会执行任何路由函数,它只是简单的将信息传送给前面的可以执行路由功能的父设备。
因此,如果End Device想发送信息给另外一个En d Device,在发送信息之间将会启动路由探测功能,找到相应的父路由节点。
TI Z-stack 协议栈学习-添加新任务1.Zstack 中如何实现自己的任务在 Zstack(TI 的 Zigbee 协议栈)中,对于每个用户自己新建立的任务通常需要两个相关的处理函数,包括:(1).用于初始化的函数,如:SampleApp_Init(),这个函数是在 osalInitTasks()这个 osal(Zstack 中自带的小操作系统)中去调用的, 其目的就是把一些用户自己写的任务中的一些变量,网络模式,网络终端类型等进行初始化;(2).用于引起该任务状态变化的事件发生后所需要执行的事件处理函数,如: Sa mpleApp_ProcessEvent(),这个函数是首先在 const pTaskEventHandlerFn tas ksArr[]中进行设置(绑定),然后在 osalInitTasks()中如果发生事件进行调用绑定的事件处理函数.下面分 3 个部分分析.1.用户自己设计的任务代码在 Zstack 中的调用过程(1).main()执行(在 ZMain.c 中) main()---> osal_init_system()(2).osal_init_system()调用 osalInitTasks(),(在 OSAL.c 中) osal_init_s ystem()--->osalInitTasks()(3).osalInitTasks()调用 SampleApp_Init(),(在 OSAL_SampleApp.c 中) osa lInitTasks()--->SampleApp_Init() 在 osalInitTasks()中实现了多个任务初始化的设置,其中 macTaskInit(taskID++)到 ZDApp_Init( taskID++ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的 SampleApp_ Init()在最后,这里 taskID 随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在 osalInitTasks()中增加.void osalInitTasks( void ){ uint8 taskID = 0; //这里很重要, 调用 osal_mem_alloc()为当前 OSAL 中的各任务分配存储空间 (实际上是一个任务数组),并用 tasksEvents 指向该任务数组(任务队列).tasksEvents =(uint16 *)osal_mem_alloc(sizeof(uint16) * tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16) *tasksCnt));//将 taskSEven ts 所指向的空间清零 macTaskInit(taskID++);nwk_init(taskID++);Hal_Init(taskID++);#if defined(MT_TASK) MT_TaskInit(taskID++);#endif APS_Init(taskID++);ZDApp_Init(taskID++);SampleApp_Init(taskID); //用户自己需要添加的任务 }2.任务处理调用的重要数据结构这里要解释一下,在 Zstack 里,对于同一个任务可能有多种事件发生,那么需要执行不同的事件处理,为了方便,对于每个任务的事件处理函数都统一在一个事件处理函数中实现,然后根据任务的 ID 号(t ask_id)和该任务的具体事件 (events)调用某个任务的事件处理函数,进入了该任务的事件处理函数之后,再根据 events 再来判别是该任务的哪一种事件发生,进而执行相应的事件处理.pTaskEventHandlerFn 是一个指向函数(事件处理函数)的指针,这里实现的每一个数组元素各对应于一个任务的事件处理函数,比如 SampleApp_ProcessEvent 对于用户自行实现的事件处理函数uint16 SampleApp_ProcessEvent( uint8 task_id,uint16 events ),所以这里如果我们实现了一个任务,还需要把实现的该任务的事件处理函数在这里添加.const pTaskEventHandlerFn tasksArr[] = {macEventLoop,nwk_event_loop,Hal_ProcessEvent,#if defined( MT_TASK )MT_ProcessEvent, //一个 MT 任务命令#endifAPS_event_loop,ZDApp_event_loop,SampleApp_ProcessEvent };注意, tasksEvents 和 tasksArr[]里的顺序是一一对应的,tasksArr[] i 个事件处理函数对应于 tasksEvents 中的第 i 个任务的事件.const uint8 tasksCnt =sizeof(tasksArr)/sizeof(tasksArr[0]); uint16 *t asksEvents; //计算出任务的数量3. 对于不同事件发生后的任务处理函数的调用 osal_start_system()很重要,决定了当某个任务的事件发生后调用对应的事件处理函数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])//Task is highest priority that is ready.{ break;} }while(++idx<tasksCnt);if(idx<tasksCnt) {uint16 events;halIntState_t intState;HAL_ENTER_CRITICAL_SECTION(intState);events=tasksEvents[idx];//处理该 idx 的任务事件,是第 idx 个任务的事件发生了tasksEvents[idx] = 0; // Clear the Events for this task.HAL_EXIT_CRITICAL_SECTION(intState); //对应调用第 idx 个任务的事件处理函数,用 events 说明是什么事件events = (tasksArr[idx])( idx, events ); //当没有处理完,把返回的 even ts 继续放到 tasksEvents[idx]当中HAL_ENTER_CRITICAL_SECTION(intState);tasksEvents[idx] |= events; // Add back unprocessed events to the cu rrent task.HAL_EXIT_CRITICAL_SECTION(intState); }#if defined( POWER_SAVING )else // Complete pass through all task events with no activity?{ osal_pwrmgr_powerconserve(); // Put the processor/system into slee p }#endif } }2.Z-stack 添加一个新的任务在 osalInitTasks()和 tasksArr[]添加相应的项就可以了.1.修改 osalInitTasks()void osalInitTasks(void){OuhsApp_Init(taskID++); PhotoApp_Init(taskID);}2.修改 tasksArr[]const pTaskEventHa 在 osalInitTasks()和 tasksArr[]添加相应的项就可以了.1.修改 osalInitTasks()void osalInitTasks( void ) {…… OuhsApp_Init( taskID++ );PhotoApp_Init( taskID); }2.修改 tasksArr[]const pTaskEventHandlerFn tasksArr[] = {…… OuhsApp_ProcessEventPhotoApp_ProcessEvent };3.添加_Init()和_ProcessEvent()void PhotoApp_Init(uint8 task_id){ PhotoApp_TaskID=task_id;PhotoInit();RegisterForPhoto( PhotoApp_TaskID );}uint16 PhotoApp_ProcessEvent( uint8 task_id uint16 events ){ afIncomingMSGPacket_t *MSGpkt;if ( events &SYS_EVENT_MSG ) {MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( PhotoApp_TaskID ); while ( MSGpkt ){ switch ( MSGpkt->hdr.event ) {case PHOTO_CHANGE: HalLedblink( HAL_LED_1 3 30 300 ); //P0IE=1; break; } // Release the memoryosal_msg_deallocate( (uint8 *)MSGpkt ); // Next - if one is availableMSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( PhotoApp_TaskID ); } // return unprocessed eventsreturn (events ^ SYS_EVENT_MSG); } // Discard unknown eventsreturn 0; }。