最新ti_zstack协议栈开发环境和工作流程资料

合集下载

Zstack协议栈

Zstack协议栈
Internet+ Education Solu Zstack协议栈
目录 Contents
ZStack协议栈的结构 ZStack协议栈的工作流程 ZStack协议栈设备类型的选择 ZStack协议栈编译选项的配置 ZStack协议栈的寻址 OSAL调度 Zstack协议栈的信道配置
20:28 / 5
项目实施
任务一 L-赖氨酸的发酵生产
一、生产前准备 (二)确定生产技术、生产菌种和工艺路线 1. 生产技术:微生物直接发酵技术 2.菌种:北京棒状杆菌AS1.563 3.发酵工艺路线
20:28 / 6
二、生产工艺过程
(一)菌种培养 1、斜面培养基和培养条件 (1)培养基成分(%)为: 葡萄糖0.5(保藏斜面培养基不加),牛肉膏1.0, 蛋白胨1.0,NaCl0.5,琼脂2.0,pH7.0~7.2。 0.1MPa,灭菌30min后,于30℃保温24h,检 查无菌后,放冰箱备用。 (2)培养条件:菌种活化后于30~32℃恒温培 养18~24h 。
到如打图开3.Z1S所ta示ck的协协议议栈栈提目供录的结示构例。工 程 , 可 以 看 ZStack协议栈的开发主要涉及HAL目录和App目 录。HAL目录主要针对具体的硬件进行修改, App目录主要用于添加具体的应用程序。OSAL 是ZStack协议栈特有的系统层,相当于一个简单
的操作系统,用于对各层的任务进行管理,理解 其工作原理对ZStack协议栈的开发是很重要的。 下面对各层进行简要介绍。
②培养条件:温度:30~32℃,搅拌转速:108 r/min(冲程7.6cm,下同), 培养15~16h。
(2)二级种子:
①培养基成分:以淀粉水解糖代替葡萄糖,其余成分同一
级种子培养基。

Z-Stack协议栈代码介绍

Z-Stack协议栈代码介绍

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协议栈组网项目及详细讲解篇

【无线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组网项目及详细讲解篇

【⽆线通信篇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)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输。

ZStack开发流程

ZStack开发流程

一、Zigbee协议栈Zstack架构ZigBee的体系结构由称为层的各模块组成。

每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。

每个服务实体通过相应的服务接入点(SAP) 为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。

Z igBee 协议的体系结构如下图所示:物理层(PHY)物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务和物理层管理服务,物理层内容:1) Zi gBe e 的激活;2)当前信道的能量检测;3)接收链路服务质量信息;4) ZigBee信道接入方式;5) 信道频率选择;6) 数据传输和接收。

介质接入控制子层(MAC)MAC 层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PAN连接和分离,提供两个对等MAC实体之间可靠的链路。

MAC 层功能:1)网络协调器产生信标;2)与信标同步;3)支持PAN (个域网) 链路的建立和断开;4)为设备的安全性提供支持;5)信道接入方式采用免冲突载波检测多址接入(CSMA-CA )机制;6)处理和维护保护时隙( GTS )机制;7)在两个对等的MAC 实体之间提供一个可靠的通信链路。

网络层(NWK)ZigBee 协议栈的核心部分在网络层。

网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。

网络层功能:1) 网络发现;2) 网络形成;3) 允许设备连接;4) 路由器初始化;5) 设备同网络连接;6) 直接将设备同网络连接;7) 断开网络连接;8) 重新复位设备;9) 接收机同步;10) 信息库维护。

应用层(APL)ZigBee 应用层框架包括应用支持层(APS)、ZigBee 设备对象(ZDO) 和制造商所定义的应用对象。

应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。

ZigBee 设备对象的功能包括:定义设备在网络中的角色(如ZigBee 协调器和终端设备) ,发起和响应绑定请求,在网络设备之间建立安全机制。

zstack流程

zstack流程
采集节点zmain初始化——>sapiinit初始化——>进入事件——>按键事件(设置设备类型和启动方式)——>进入事件——>启动设备请求——>检查设备逻辑类型是否正确——>初始化设备——>设置一个网络初始化事件(初始化网络)交给zdapp处理——>网络形成请求——>网络形成确认(反馈信息)——>网络启动事件处理——>ZDO状态改变事件处理——>更新网络状态——向sapi发送ZDO状态改变事件——>启动确认【至此采集节点已经启动】——>按键事件(允许绑定)【至此采集节点已设置完毕】——>传感节点zmain初始化——>sapiinit初始化——>进入事件——>按键事件(设置设备类型和启动方式)——>进入事件——>启动设备请求——>检查设备逻辑类型是否正确——>初始化设备——>设置一个网络初始化事件(初始化网络)交给zdapp处理——>网络发现请求——网络发现确认——>向ZDO发送网络发现处理信息——>网络层加入请求——>网络加入确认——>向ZDO发送网络加入处理信息——>设置ZDO状态改变事件——>更新网络——>向sapi发送ZDO状态改变事件——>启动确认【至此传感节点已经启动】——>向sapi发送发现并绑定采集节点事件(包含于用户事件)——>(发现采集节点后)向采集节点发送匹配描述符请求消息(包含于系统消息)——>采集节点处理匹配描述符消息处理(ZDO层ZDO_ProcessMatchDescReq)——>如果找到与之匹配描述符,就给传感节点发送响应信息——>传感节点处理匹配响应(由于初始化时已经在sa置网络更新事件(空操作)——>查找绑定设备的IE地址(向采集节点发送IE地址请求)——>采集节点处理传感节点的请求(包含于ZDO层AF消息输入处理)并查找自己的IE地址,将其发送给传感节点——>(由于未在sapi层注册IE地址响应处理,那么就在ZDApp层处理(包含在ZDO层AF消息输入处理))传感节点对IE地址做响应处理(更新网络地址和IE地址)——>向应用程序绑定确认消息——>设置用户事件(开始处理用户函数)——>发送数据给采集节点——>采集节点处理接收到的数据(sapi层AF消息输入处理)

协议栈的主要工作流程

协议栈的主要工作流程

协议栈的主要工作流程姓名:____________________________职位:____________________________联系方式:____________________________姓名:____________________________职位:____________________________联系方式:____________________________根据《劳动合同法》及相关法律法规,结合实际工作情况,为明确薪酬追索及扣回的相关事宜,双方经友好协商,达成如下补充协议:1. 协议背景1.1 为了保障银行的合法权益,明确薪酬追索及扣回的条件,双方依据《劳动合同法》和《银行劳动合同》的相关条款,制定本补充协议,以规范薪酬追索及扣回的程序和要求。

1.2 本协议旨在补充和完善原劳动合同中的薪酬管理条款,以便在出现薪酬错误支付、超额支付或其他需要扣回薪酬的情况下,能有明确的操作规范和解决方案。

2. 薪酬追索扣回条件2.1.1 银行因误操作或其他原因,错误支付了超出应支付金额的薪酬。

2.1.2 员工因故意隐瞒或虚报事实,导致银行支付了超额薪酬。

2.1.3 员工在合同终止或劳动关系变动后,银行发现有误发薪酬情况需要进行追索。

2.1.4 其他法律法规或合同约定的情形。

2.2 乙方确认上述条件成立时,银行将有权按照本协议的规定进行薪酬追索或扣回。

3. 扣回金额和方式3.1 扣回金额的计算应以实际支付金额和实际应支付金额之间的差额为准。

银行应提供详细的扣回金额计算依据和相关证明材料。

3.2.1 一次性扣回:银行在通知乙方后,直接从乙方下一期薪酬中扣除相关金额。

3.2.2 分期扣回:银行与乙方协商,按照一定的分期计划进行扣回,每期扣回金额不超过乙方月薪的30%。

3.2.3 其他双方协商确定的合理方式。

4. 追索和扣回程序4.1 银行发现需要追索或扣回薪酬的情况后,应立即书面通知乙方,说明扣回的原因、金额和计算依据。

zstack协议栈简介

zstack协议栈简介

竭诚为您提供优质文档/双击可除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”无线技术,主要用于近距离无线连接。

协议栈软件的开发流程

协议栈软件的开发流程

协议栈软件的开发流程英文文档内容:Development Process of Protocol Stack Software1.Requirement AnalysisThe first step in the development of protocol stack software is to analyze the requirements.This involves understanding the needs of the system and the specific protocols that need to be implemented.It is important to gather all the necessary information and document the requirements clearly.2.System DesignOnce the requirements are analyzed, the next step is to design the system.This includes creating a high-level architecture of the protocol stack and defining the interfaces between different layers.The design should also take into consideration factors like performance, reliability, and security.3.Protocol ImplementationAfter the system design is complete, the next step is to implement the protocol stack.This involves writing code for each layer of the stack, following the design specifications.The implementation should adhere to the standards and guidelines provided for each protocol.4.Testing and DebuggingOnce the protocol stack is implemented, it needs to be thoroughly tested to ensure that it works correctly.This includes unit testing, integration testing, and system testing.Any bugs or issues that are found during testing should be debugged and fixed.5.Optimization and Performance TuningAfter the protocol stack is tested and any issues are resolved, the next step is to optimize the software for better performance.This may involve optimizing the code, improving the algorithms, or fine-tuning the system settings.6.Documentation and MaintenanceFinally, it is important to document the protocol stack software, including the design, implementation, and testing processes.This will help in future maintenance and updates.The software should also be maintained regularly to ensure that it remains compatible with any changes in the system or protocols.中文文档内容:协议栈软件开发流程1.需求分析协议栈软件开发的第一步是需求分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TI Z-stack协议栈开发环境和工作流程系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。

节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802. 15. 4/ZigBee的CC2430片上系统解决方案。

Z-Stack 还支持丰富的新特性,如无线下载,可通过ZigBee网状网络(Mesh Network)下载节点更新。

图 ZigBee节点开发环境TI的Z-Stack装载在一个基于IAR开发环境的工程里。

强大的IAR E mbedded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。

Z-Stack根据IEEE 802. 15.4和ZigBe e标准分为以下几层:API(Application Programming Interface),HAL (Ha rdware Abstract Layer),MAC(Media Access Control), NWK(Zigbee Net work Layer),OSAL(Operating System Abstract System),Security,Ser vice,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变量,调用 afRegiste r( )在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 events精品文档return (events ^ SYS_EVENT_MSG); } // Discard unknown events return 0; }精品文档。

相关文档
最新文档