您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 第6章_Zstack协议栈
-1-第6章Zstack协议栈-2-本章目标理解Zstack软件架构掌握操作系统的运行机制掌握Zstack各层作用-3-本章目标理解Zstack软件架构掌握操作系统的运行机制掌握Zstack各层作用-4-Zstack协议栈是德州仪器(英文简称TI)公司为Zigbee提供的一个解决方案,结合CC2530F256芯片可以实现Zigbee完整的解决方案。本章将对Zstack协议栈进行分层剖析,以了解其运作原理,这是进行Zstack应用开发的基础6.1概述-5-Zstack文件结构6.1概述双击此文件安装协议栈相关文件安装完成后生成此文件协议栈各目录文件说明文档工程文档工具文件-6-Zstack协议栈符合Zigbee协议结构,由物理层、MAC层、网络层和应用层组成。物理层和MAC层由IEEE802.15.4定义,网络层和应用层由Zigbee联盟来定义。Zigbee联盟将应用层又详细划分为应用支持子层、应用设备框架以及Zigbee设备对象等。6.2Zstack软件架构-7-Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层6.2.1Zigbee协议栈-8-Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层6.2.1Zigbee协议栈物理层内容:物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务单元(PD-SAP)和物理层管理服务(MLME-SAP)。MAC(介质接入控制子层):MAC层负责处理所有物理无线信道的访问,并产生网络信号、同步信号;支持PAN连接和分离,提供两个对等的MAC实体之间可靠链路。NWK(网络层):网络层是Zigbee协议栈的核心部分,网络层主要实现节点加入或者离开网络、接收或抛弃其它节点、路由查找及维护等功能。-9-Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层6.2.1Zigbee协议栈APL(应用层):Zigbee应用层包括应用支持子层APS、应用程序框架AF、Zigbee设备对象ZDO等。应用支持子层APS:APS层在NWK层和APL层之间,提供APSDE-SAP和APSME-SAP两个接口,两个接口的主要功能如下:APSDE-SAP提供在同一个网络中的两个或者更多的应用实体之间(即端点)的数据通信。APSME-SAP提供多种服务给应用对象ZDO,这些服务包括安全服务和绑定设备服务,并维护管理对象的数据库(即AIB)。-10-Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层6.2.1Zigbee协议栈应用程序框架AF:运行在Zigbee协议栈上的应用程序实际是厂商自定义的应用对象,并且遵循规范(Profile)运行在端点1~240上。设备对象层ZDO:远程设备通过ZDO请求描述信息,接收到这些请求时,ZDO会调用配置对象获取相应的描述符值。ZDO通过APSME-SAP接口提供绑定服务。-11-Zstack协议栈可以从TI的官方网站下载(截止本书出版时,Zstack协议栈的最新版本为Zstack-CC2530-2.5.1a),其下载网址为,下载完成后,双击可执行程序即可安装。使用IAR8.10版本打开Zstack-CC2530-2.5.1a中的SampleApp工程,其协议栈代码文件夹6.2.2Zstack协议栈-12-6.2.2Zstack协议栈APP:为应用层目录,用户可以根据需求添加自己的任务。这个目录中包含了应用层和这个项目的主要内容,在协议栈里面一般是以操作任务实现的。HAL:硬件驱动层,包括硬件相关的配置、驱动以及操作函数。OSAL:协议栈的操作系统。Profile:AF层目录,包含AF层处理函数。Security&Services:安全服务层目录,安全层和服务层处理函数,比如加密。Tools:工程配置目录,包括空间划分及ZStack相关配置信息。-13-6.2.2Zstack协议栈ZDO:ZDO设备对象目录。ZMac:MAC层目录,包括MAC层参数及MAC层的LIB库函数回调处理函数。Zmain:主函数目录,包括入口函数及硬件配置文件。Output:输出文件目录,由IAR自动生成。-14-6.2.3Zigbee协议栈与Zstack对比Zigbee协议栈结构Zstack应用层,APP层、OSALZDO、APS层ZDO层AF层ProfileNWKNWKMACZMAC、MAC物理层HAL、MAC安全服务提供商Security&ServicesZstack协议栈是一个半开源的协议栈,其中MAC层和ZMAC层的源码没有全部开源,关于他们的具体内容,在实际的工程开发中也不需要详细了解。-15-6.3HAL层分析Zigbee的HAL层提供了开发板所有硬件设备(例如LED、LCD、KEY、UART等)的驱动函数及接口。HAL文件夹为硬件平台的抽象层,包含common、include和target三个文件夹-16-6.3.1Common文件夹Common目录下包含有hal_assert.c和hal_dirvers.c两个文件。其中hal_assert.c是声明文件,用于调试。hal_dirvers.c是驱动文件一般不需要修改,了解即可一些底层驱动文件,需要用户掌握的-17-6.3.1Common文件夹hal_assert.chalAssertHandler()halAssertHazardLights()-18-6.3.1Common文件夹halAssertHandler()这个函数为硬件系统检测函数,如果定义了ASSERT_RESET宏定义,系统将调用HAL_SYSTEM_RESET复位,否则将调用halAaaertHazardLights()执行闪烁LED命令voidhalAssertHandler(void){//如果定义了ASSERT_RESET宏定义#ifdefASSERT_RESET//系统复位HAL_SYSTEM_RESET();#else!definedASSERT_WHILE//当检测到错误时,LED灯闪烁命令函数halAssertHazardLights();#elsewhile(1);#endif}-19-6.3.1Common文件夹halAssertHazardLights()此函数控制LED灯闪烁,但是根据不同的硬件平台定义的LED的个数不同来决定闪烁不同的LED。例如CC2430和CC2530所使用的硬件平台不同决定闪烁的LED不同//如果硬件平台定义的LED的个数为1#if(HAL_NUM_LEDS=1)//LED1闪烁HAL_TOGGLE_LED1();//如果硬件平台定义的LED的个数为2#if(HAL_NUM_LEDS=2)//LED2闪烁HAL_TOGGLE_LED2();//如果硬件平台定义的LED的个数为3#if(HAL_NUM_LEDS=3)//LED3闪烁HAL_TOGGLE_LED3();//如果硬件平台定义的LED的个数为4#if(HAL_NUM_LEDS=4)//LED4闪烁HAL_TOGGLE_LED4();#endif#endif#endif#endif-20-6.3.1Common文件夹hal_drivers.c:hal_drivers.c文件中包含了与硬件相关初始化和事件处理函数。此文件中有4个比较重要的函数:硬件初始化函数Hal_Init()硬件驱动初始化函数HalDriverInit()硬件事件处理函数Hal_ProcessEvent()询检函数Hal_ProcessPoll()-21-6.3.1Common文件夹硬件初始化函数Hal_Init()Hal_Init()函数是硬件初始化函数。其功能是通过“注册任务ID号”以实现在OSAL层注册,从而允许硬件驱动的消息和事件由OSAL处理。voidHal_Init(uint8task_id){//注册任务IDHal_TaskID=task_id;}-22-6.3.1Common文件夹硬件驱动初始化函数HalDriverInit()HalDriverInit()函数被main()函数调用,用于初始化与硬件设备有关的驱动voidHalDriverInit(void){//如果定义了定时器则初始化定时器#if(definedHAL_TIMER)&&(HAL_TIMER==TRUE)/*在Zstack-CC2530-2.5.1a版本中移除了定时器的初始化,但不影响Zstack的运行。*/#errorThehaltimerdrivermoduleisremoved.#endif//如果定义了ADC,初始化ADC#if(definedHAL_ADC)&&(HAL_ADC==TRUE)HalAdcInit();#endif//如果定义了DMA,初始化DMA#if(definedHAL_DMA)&&(HAL_DMA==TRUE)HalDmaInit();#endif//如果定义了AES,初始化AES#if(definedHAL_AES)&&(HAL_AES==TRUE)HalAesInit();#endif-23-6.3.1Common文件夹硬件驱动初始化函数HalDriverInit()HalDriverInit()函数被main()函数调用,用于初始化与硬件设备有关的驱动//如果定义了LCD,初始化LCD#if(definedHAL_LCD)&&(HAL_LCD==TRUE)HalLcdInit();#endif//如果定义了LED,初始化LED#if(definedHAL_LED)&&(HAL_LED==TRUE)HalLedInit();#endif//如果定义了UART,初始化UART#if(definedHAL_UART)&&(HAL_UART==TRUE)HalUARTInit();#endif//如果定义了按键,初始化KEY#if(definedHAL_KEY)&&(HAL_KEY==TRUE)HalKeyInit();#endif//如果定义了SPI,初始化SPI#if(definedHAL_SPI)&&(HAL_SPI==TRUE)HalSpiInit();#endif//如果定义了USB,初始化USB,只限CC2531#if(definedHAL_HID)&&(HAL_HID==TRUE)usbHidInit();#endif}-24-6.3.1Common文件夹硬件事件处理函数Hal_ProcessEvent()Hal_ProcessEvent()函数在APP层中的任务事件处理中调用,用于对相应的硬件事件作出处理,具体包括系统消息事件、LED闪烁事件、按键处理事件和睡眠模式等。uint16Hal_ProcessEvent(uint8task_id,uint16events){uint8*msgPtr;(void)task_id;//系统消息事件if(events&SYS_EVENT_MSG){msgPtr=osal_msg_receive(Hal_TaskID);while(msgPtr){osal_msg_deallocate(msgPtr);msgPtr=osal_msg_receive(Hal_TaskID);}returnevents^SYS_EVENT_MSG;}//LED闪烁事件if(events&HAL_LED_BLINK_EVENT){#if(defined(BLINK_LEDS))&&(HA
本文标题:第6章_Zstack协议栈
链接地址:https://www.777doc.com/doc-3917743 .html