zIgbee协议栈浅析

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

#ifndef NONWK // Since the AF isn't a task, call it's initialization routine afInit(); #endif
// Initialize the operating system osal_init_system(); // Allow interrupts osal_int_enable( INTS_ALL ); // Final board initialization InitBoard( OB_READY ); // Display information about this device zmain_dev_info(); /* Display the device info on the LCD */ #ifdef LCD_SUPPORTED zmain_lcd_init(); #endif
在协议栈中宏定义了 tasksArr[idx] 函数指针数组 用来存储任务处理函数 tasksEvents[idx] 无符号短整型数组 用来存储各个任务中的事件编号 idx为任务编号 下面我们来详细介绍这几个数组的作用 和OSAL任务轮询机制的原理
tasksArr[]函数的定义如下:
const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, #if defined( MT_TASK ) MT_ProcessEvent, #endif APS_event_loop, #if defined ( ZIGBEE_FRAGMENTATION ) APSF_ProcessEvent, #endif ZDApp_event_loop, #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_event_loop, #endif SampleApp_ProcessEvent }; 这里的每一个紫色的字段都是一个函数的函数名,也是对应的函数的地址空间, 因为pTaskEventHandlerFn的定义如下 typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); 这样就可以用tasksArr[N](task_id,shorevent);的形式来调用tasksArr[N]对应的函数
Z-Stack采用操作系统的思想来构建,采用事件轮循机制, 当各层初始化之后,系统进入低功耗模式,当事件发生时, 唤醒系统,开始进入中断处理事件, 结束后继续进入低功耗模式。如果同时有几个事件发生,判 断优先级,逐次处理事件。这种软件构架可以极大地降级 系统的功耗。 在Main()函数中完成了: 关所有中断、初始化StackRAM、初始化IO口、初始化HAL 层驱动、初始化NV flash、初始化MAC层、分配64位长 地址、读取NV ITEMS、初始化OSAL、开中断、设置 TIMER、在LCD上显示设备信息、进入OSAL任务轮询循 环(这是一个死循环,不会再返回main()函数)。
zIgbee典型的组网方式:
Z-Stack协议栈的开发 一、开发环境的搭建: 见 详细的操作方法可以打开
二、Z-Stack协议栈工程文件的介绍 下的
Source文件里存放的是我们自己编写的程序文件 和协议栈自带的OSAL_SampleApp.c、 SampleApp.c、SampleApp.h、 SampleAppHw.h 文件。这里的SampleApp.c是我们最常用的文件, 在这文件中我们可以在协议栈中加入并执行我们 自己的功能程序。
四、Z-Stack的main()函数
/********************************************************************* * @fn main * @brief First function called after startup. * @return don't care */ int main( void ) { // Turn off interrupts osal_int_disable( INTS_ALL );// 关闭所有中断 // Initialization for board related stuff such as LEDs HAL_BOARD_INIT(); // Make sure supply voltage is high enough to run zmain_vdd_check(); // Initialize board I/O InitBoard( OB_COLD ); // Initialze HAL drivers HalDriverInit(); // Initialize NV System osal_nv_init( NULL ); // Initialize the MAC ZMacInit(); // Determine the extended address zmain_ext_addr(); // Initialize basic NV items zgInit();
#ifdef WDT_IN_PM1 /* If WDT is used, this is a good place to enable it. */ WatchDogEnable( WDTIMX ); #endif
osal_start_system(); // No Return from here return 0; // Shouldn't get here. } // main()
在ZStack协议栈中是通过下面的事件记录函数对tasksEvents[task_id] 数组赋值的,通过该函数可以将某一任务的某一事件存入到数组中, 然后在osal_start_system()函数中将对该事件进行处理
uint8 osal_set_event( uint8 task_id, uint16 event_flag ) { if ( task_id < tasksCnt ) { halIntState_t intState; HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts return ( SUCCESS ); } else { return ( INVALID_TASK ); } }
简介: ZigBee是一种低速短距离传输的无线网络协 议。 ZigBee协议从下到上分别为物理层(PHY)、媒体 访问控制层(MAC)、传输层(TL)、网络层(NWK)、 应用层(APL)等。其中物理层和媒体访问控制层遵 循IEEE 802.15.4标准的规定
优点: ZigBee网络主要特点是低功耗、低成本、低 速率、支持大量节点、支持多种网络拓扑、低 复杂度、快速、可靠、安全。 ZigBee网络中的设备可分为协调器 (Coordinator)、汇聚节点(Router)、传感器节 点(EndDevice)等三种角色
三、Zigbee协议栈ZStack构架
http://blog.sina.com.cn/s/blog_6184e67b01018upb.html
APP:应用层目录,这是用户创建各种不同工程的区域, 在这个目录中包含了应用层的内容和这个项目的主要内容, 在协议栈里面一般是以操作系统的任务实现的。 HAL:硬件层目录,包含有与硬件相关的配置和驱动及操 作函数。 MAC:MAC 层目录,包含了MAC 层的参数配置文件及其 MAC 的LIB 库的函数接口文件。 MT: 监控调试层,主要用于调试目的,即实现通过串口 调试各层,与各层进行直接交互。 NWK:网络层目录,含网络层配置参数文件及网络层库的 函数接口文件,APS 层库的函数接口。 OSAL:协议栈的操作系统。 Profile:AF 层目录,包含AF 层处理函数文件。 Security:安全层目录,安全层处理函数接口文件,比如 加密函数等。 Services:地址处理函数目录,包括着地址模式的定义及 地址处理函数。 Tools:工程配置目录,包括空间划分及ZStack 相关配置 信息。 ZDO:ZDO 目录。 ZMac: MAC 层目录,包括MAC 层参数配置及MAC 层 LIB 库函数回调处理函数。 ZMain:主函数目录,包括入口函数main()及硬件配置 文件。 Output:输出文件目录,这个EW8051 IDE 自动生成的。
wenku.baidu.com
五、OSAL任务轮询机制
在main()中最后进入了osal_start_system();函数。我们打开该函数:
void osal_start_system( void )
{ #if !defined ( ZBIT ) && !defined ( UBIT ) for(;;) // Forever Loop #endif { uint8 idx = 0; osalTimeUpdate(); 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]; tasksEvents[idx] = 0; // Clear the Events for this task. HAL_EXIT_CRITICAL_SECTION(intState); events = (tasksArr[idx])( idx, events ); HAL_ENTER_CRITICAL_SECTION(intState); tasksEvents[idx] |= events; // Add back unprocessed events to the current 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 sleep } #endif } }
osal_start_system()函数中处理某一任务的 某一事件的过程:
①将tasksEvents[idx] 的值赋给变量events,并将tasksEvents[idx]清 0
②通过tasksArr[idx](idx,events)调用与任务相应的函数处理事件,因 为该函数引用了events,然后处理完对应的事件后,函数将该事件 的对应位清零,最后返回更新过的events ③将新的events赋给tasksEvents[idx],这样如果events!=0,那就表 明这个任务还有事件没有处理完,在下次的任务轮询中会将其处理掉。
相关文档
最新文档