ImageVerifierCode 换一换
格式:DOC , 页数:12 ,大小:134KB ,
资源ID:1782972      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/1782972.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Z-stack协议栈开发.doc)为本站上传会员【精****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Z-stack协议栈开发.doc

1、TI Z-stack协议栈开发环境和工作流程 系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802.15.4/ZigBee的CC2430片上系统解决方案。Z-Stack还支持丰富的新特性,如无线下载,可通过ZigBee网状网络(Mesh Network)下载节点更新。 图 ZigBee节点开发环境 TI的Z-Stack装载在一个基于IAR开发环境的工程里。强大的IAR Embedded Workbench

2、除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、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打开工程文件Sa

3、mpleApp.eww后,即可查看到整个协议栈从HAL层到APP层的文件夹分布。该协议栈可以实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储,因此网络具有一定的记忆功能。 Z-Stack采用操作系统的思想来构建,采用事件轮循机制,当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。如果同时有几个事件发生,判断优先级,逐次处理事件。这种软件构架可以极大地降级系统的功耗。 整个Z-stack的主要工作流程,大致分为系统启动,驱动初始化,OSAL初始化和启动,进入任务轮循几个阶段,下面将逐一详细分析。 图 Z

4、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()、初始化操作系统

5、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系统。该任务调度函数按照优先级检测各个任务是否就绪

6、如果存在就绪的任务则调用tasksArr[]中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。程序流程如图3-13所示。osal_start_system()一旦执行,则不再返回Main()函数。 OSAL任务调度流程图 Figure . The Flow Chart of OSAL Scheduler OSAL任务 OSAL是协议栈的核心,Z-stack的任何一个子系统都作为OSAL的一个任务,因此在开发应用层的时候,必须通过创建OSAL任务来运行应用程序。通过osalInitTasks()函数创建

7、OSAL任务,其中TaskID为每个任务的唯一标识号。任何OSAL任务必须分为两步:一是进行任务初始化;二是处理任务事件。任务初始化主要步骤如下: (1)初始化应用服务变量。 const pTaskEventHandlerFn tasksArr[]数组定义系统提供的应用服务和用户服务变量,如MAC层服务macEventLoop、用户服务SampleApp_ProcessEvent等 (2)分配任务ID和分配堆栈内存 void osalInitTasks(void)主要功能是通过调用osal_mem_alloc()函数给各个任务分配内存空间,和给各个已定义任务指定唯一的标识号。 (3)

8、在AF层注册应用对象 通过填入endPointDesc_t数据格式的EndPoint变量,调用afRegister( )在AF层注册EndPoint应用对象。 通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用于发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。 (4)注册相应的OSAL或则HAL系统服务 在协议栈中,Z-stack提供键盘响应和串口活动响应两种系统服务,但是任何Z-Stask任务均不自行注册系统服务,两者均需要由用户应用程序注册。值得注意

9、的是,有且仅有一个OSAL Task可以注册服务。例如注册键盘活动响应可调用RegisterForKeys()函数。 (5)处理任务事件 处理任务事件通过创建“ApplicationName”_ProcessEvent()函数处理。一个OSAL任务除了强制事件(Mandatory Events)之外还可以定义15个事件。 SYS_EVENT_MSG(0x8000)是强制事件。该事件主要用来发送全局的系统信息,包括以下信息: AF_DATA_CONFIRM_CMD:该信息用来指示通过唤醒AF DataRequest()函数发送的数据请求信息的情况。ZSuccess确认数据请求成功的发送。

10、如果数据请求是通过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位的网络地址,也叫做逻辑地址(Logi

11、cal address)或者短地址。64位长地址是全球唯一的地址,并且终身分配给设备。这个地址可由制造商设定或者在安装的时候设置,是由IEEE来提供。当设备加入Zigbee网络被分配一个短地址,在其所在的网络中是唯一的。这个地址主要用来在网络中辨识设备,传递信息等。 协调器(Coordinator)首先在某个频段发起一个网络,网络频段的定义放在DEFAULT_CHANLIST配置文件里。如果ZDAPP_CONFIG_PANID定义的PAN ID是0xFFFF(代表所有的PAN ID),则协调器根据它的IEEE地址随机确定一个PAN ID。否则,根据ZDAPP_CONFIG_PANID的定义建

12、立PAN ID。当节点为Router或者End Device时,设备将会试图加入DEFAULT_ CHANLIST所指定的工作频段。如果ZDAPP_CONFIG_PANID没有设为0xFFFF,则Router或者End Device会加入ZDAPP_CONFIG_PANID所定义的PAN ID。 设备上电之后会自动的形成或加入网络,如果想设备上电之后不马上加入网络或者在加入网络之前先处理其他事件,可以通过定义HOLD_AUTO_START来实现。通过调用ZDApp_StartUpFromApp( )来手动定义多久时间之后开始加入网络。 设备如果成功的加入网络,会将网络信息存储在非易失性存储

13、器(NV Flash)里,掉电后仍然保存,这样当再次上电后,设备会自动读取网络信息,这样设备对网络就有一定的记忆功能。对NV Flash的动作,通过NV_RESTORE()和NV_ITNT()函数来执行。 有关网络参数的设置大多保存在协议栈Tools文件夹的f8wConfig.cfg里。 路由 Z-Stack采用无线自组网按需平面距离矢量路由协议AODV,建立一个Hoc网络,支持移动节点,链接失败和数据丢失,能够自组织和自修复。当一个Router接受到一个信息包之后,NMK层将会进行以下的工作:首先确认目的地,如果目的地就是这个Router的邻居,信息包将会直接传输给目的设备;否则,Ro

14、uter将会确认和目的地址相应的路由表条目,如果对于目的地址能找到有效的路由表条目,信息包将会被传递到该条目中所存储的下一个hop地址;如果找不到有效的路由表条目,路由探测功能将会被启动,信息包将会被缓存直到发现一个新的路由信息。 ZigBee End Device不会执行任何路由函数,它只是简单的将信息传送给前面的可以执行路由功能的父设备。因此,如果End Device想发送信息给另外一个End Device,在发送信息之间将会启动路由探测功能,找到相应的父路由节点。 TI Z-stack协议栈学习-添加新任务 1.Zstack中如何实现自己的任务 在Zstack(TI的Zigbee

15、协议栈)中,对于每个用户自己新建立的任务通常需要两个相关的处理函数,包括: (1).用于初始化的函数,如:SampleApp_Init(),这个函数是在osalInitTasks()这个osal(Zstack中自带的小操作系统)中去调用的,其目的就是把一些用户自己写的任务中的一些变量,网络模式,网络终端类型等进行初始化; (2).用于引起该任务状态变化的事件发生后所需要执行的事件处理函数,如: SampleApp_ProcessEvent(),这个函数是首先在const pTaskEventHandlerFn tasksArr[]中进行设置(绑定),然后在osalInitTasks()中如

16、果发生事件进行调用绑定的事件处理函数. 下面分3个部分分析. 1.用户自己设计的任务代码在Zstack中的调用过程 (1).main()执行(在ZMain.c中) main()---> osal_init_system() (2).osal_init_system()调用osalInitTasks(),(在OSAL.c中) osal_init_system()--->osalInitTasks() (3).osalInitTasks()调用SampleApp_Init(),(在OSAL_SampleApp.c中) osalInitTasks()--->SampleApp_Ini

17、t() 在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit(taskID++)到ZDApp_Init( taskID++ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加. void osalInitTasks( void ) { uint8 taskID = 0; //这里很重要, 调用osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任/

18、/务数组),并用tasksEvents指向该任务数组(任务队列). tasksEvents =(uint16 *)osal_mem_alloc(sizeof(uint16) * tasksCnt); osal_memset(tasksEvents,0,(sizeof(uint16) *tasksCnt));//将taskSEvents所指向的空间清零 macTaskInit(taskID++); nwk_init(taskID++); Hal_Init(taskID++); #if defined(MT_TASK) MT_TaskInit(taskID++); #endif

19、APS_Init(taskID++); ZDApp_Init(taskID++); SampleApp_Init(taskID); //用户自己需要添加的任务 } 2.任务处理调用的重要数据结构 这里要解释一下,在Zstack里,对于同一个任务可能有多种事件发生,那么需要执行不同的事件处理,为了方便,对于每个任务的事件处理函数都统一在一个事件处理函数中实现,然后根据任务的ID号(task_id)和该任务的具体事件(events)调用某个任务的事件处理函数,进入了该任务的事件处理函数之后,再根据events再来判别是该任务的哪一种事件发生,进而执行相应的事件处理.pTaskEventH

20、andlerFn是一个指向函数(事件处理函数)的指针,这里实现的每一个数组元素各对应于一个任务的事件处理函数,比如SampleApp_ProcessEvent对于用户自行实现的事件处理函数uint16 SampleApp_ProcessEvent( uint8 task_id,uint16 events ),所以这里如果我们实现了一个任务,还需要把实现的该任务的事件处理函数在这里添加. const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, #if defined

21、 MT_TASK ) //一个MT任务命令 MT_ProcessEvent, #endif APS_event_loop, ZDApp_event_loop, SampleApp_ProcessEvent }; 注意, tasksEvents和tasksArr[]里的顺序是一一对应的,tasksArr[]中的第i个事件处理函数对应于tasksEvents中的第i个任务的事件. //计算出任务的数量 const uint8 tasksCnt =sizeof(tasksArr)/sizeof(tasksArr[0]); uint16 *tasksEvents; 3.

22、对于不同事件发生后的任务处理函数的调用 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[

23、idx])//Task is highest priority that is ready. { break; } }while(++idx

24、HAL_EXIT_CRITICAL_SECTION(intState); //对应调用第idx个任务的事件处理函数,用events说明是什么事件 events = (tasksArr[idx])( idx, events ); //当没有处理完,把返回的events继续放到tasksEvents[idx]当中 HAL_ENTER_CRITICAL_SECTION(intState); tasksEvents[idx] |= events; // Add back unprocessed events to the current task. HAL_EXIT_CRITICAL_SE

25、CTION(intState); } #if defined( POWER_SAVING ) else // Complete pass through all task events with no activity? { osal_pwrmgr_powerconserve(); // Put the processor/system into sleep } #endif } } 2.Z-stack添加一个新的任务 在osalInitTasks()和tasksArr[]添加相应的项就可以了。 1.修改osalInitTasks()void osalInitTasks

26、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[] = { ……

27、 OuhsApp_ProcessEvent PhotoApp_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 (

28、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 memory osal_msg_deallocate( (uint8 *)MSGpkt ); // Next - if one is available MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( PhotoApp_TaskID ); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } // Discard unknown events return 0; }

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服