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

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ZigBee协议栈初始化网络启动流程.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ZigBee协议栈初始化网络启动流程.docx

1、ZigBee协议栈初始化网络启动流程 ZigBee协议栈初始化网络启动流程ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络。基本流程:main()-osal_init_system()-osalInitTasks()-ZDApp_Init(),进协议栈初始化函数ZDApp_Init()。1.1 进入程序入口main()。ZMain.c中C+ Codeint main( void )/ Turn off interruptsosal_int_disable( INTS_ALL );/ Initialization for board relate

2、d stuff such as LEDsHAL_BOARD_INIT();/ Make sure supply voltage is high enough to runzmain_vdd_check();/ Initialize board I/OInitBoard( OB_COLD );/ Initialze HAL driversHalDriverInit();/ Initialize NV Systemosal_nv_init( NULL );/ Initialize the MACZMacInit();/ Determine the extended addresszmain_ext

3、_addr();/ Initialize basic NV itemszgInit();#ifndef NONWK/ Since the AF isnt a task, call its initialization routineafInit();#endif/ Initialize the operating systemosal_init_system();/ Allow interruptsosal_int_enable( INTS_ALL );/ Final board initializationInitBoard( OB_READY );/ Display information

4、 about this devicezmain_dev_info();/* Display the device info on the LCD */#ifdef LCD_SUPPORTEDzmain_lcd_init();#endif#ifdef WDT_IN_PM1/* If WDT is used, this is a good place to enable it. */WatchDogEnable( WDTIMX );#endifosal_start_system(); / No Return from herereturn 0; / Shouldnt get here. / mai

5、n()1.2 给任务添加IDsapi.c中C+ Codevoid osalInitTasks( void ) /为各自进程添加ID 用于任务的查找uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt);macTaskInit( taskID+ );nwk_init( taskID+ );Hal_Init( taskID+ );/硬件抽象层初始化#if define

6、d( MT_TASK )MT_TaskInit( taskID+ );#endifAPS_Init( taskID+ );ZDApp_Init( taskID+ );/判断如果协调器节点建立网络、如果终端节点加入网络SAPI_Init( taskID );1.3 初始化ZigBee协议栈网络ZDApp.cC+ Codevoid ZDApp_Init( uint8 task_id )/ Save the task IDZDAppTaskID = task_id;/ Initialize the ZDO global device short address storageZDAppNwkAddr

7、.addrMode = Addr16Bit;ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;(void)NLME_GetExtAddr(); / Load the saveExtAddr pointer./ Check for manual Hold Auto Start/检测到有手工设置HAL_KEY_SW_1则会设置devState = DEV_HOLD,从而避开网络初始化ZDAppCheckForHoldKey();/ Initialize ZDO items and setup the device - type of device to

8、 create.ZDO_Init(); /通过判断预编译来开启一些函数功能/ Register the endpoint description with the AF/ This task doesnt have a Simple description, but we still need/ to register the endpoint.afRegister( (endPointDesc_t *)&ZDApp_epDesc );#if defined( ZDO_USERDESC_RESPONSE )ZDApp_InitUserDesc();#endif / ZDO_USERDESC_R

9、ESPONSE/ Start the device?if ( devState != DEV_HOLD )ZDOInitDevice( 0 );else/ Blink LED to indicate HOLD_STARTHalLedBlink ( HAL_LED_4, 0, 50, 500 );ZDApp_RegisterCBs(); /* ZDApp_Init() */如果设置devState为DEV_HOLD,则不会执行ZDOInitDevice;反之,系统会调用此函数是设备组网或者入网。看下这个函数完成的功能是什么样子的。ZDOInitDevice是设备在网络中启动。它会读取NV中的ZC

10、D_NV_STARTUP_OPTION选项决定是否恢复网络状态。如果应用层强制进行新的join操作,它应该在调用这个函数之前设置ZCD_NV_STARTUP_OPTION中的ZCD_STARTOPT_DEFAULT_NETWORK_STATE位。可以调用zgWrieStartupOptions()函数完成这些设置。1.4 初始化设备(启动网络和设置网络类型)ZDApp.cC+ Codeuint8 ZDOInitDevice( uint16 startDelay )uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;uint16 extend

11、edDelay = 0;if ( devState = DEV_HOLD )/ Initialize the RAM items table, in case an NV item has been updated.zgInitItems( FALSE );ZDConfig_InitDescriptors();/devtag.071807.todo - fix this temporary solution_NIB.CapabilityInfo = ZDO_Config_Node_Descriptor.CapabilityFlags;devState = DEV_INIT; / Remove

12、the Hold state/ 函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值/ Initialize leave control logicZDApp_LeaveCtrlInit();/ Check leave control reset settings/设备的断开会造成DEV_HOLD状态ZDApp_LeaveCtrlStartup( &devState, &startDelay );/ Leave may make the hold state come backif ( devState = DEV_HOLD )/设置启动选项/ Se

13、t the NV startup option to force a new join.zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );/通知应用层触发事件/ Notify the applicationsosal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); / Dont join - (one time).#if defined ( NV_RESTORE )

14、/ Get Keypad directly to see if a reset nv is needed./ Hold down the SW_BYPASS_NV key (defined in OnBoard.h)/ while booting to skip past NV Restore.if ( HalKeyRead() = SW_BYPASS_NV )networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;else/ 通过读取ZCD_NV_STARTUP_OPTION选项决定是否进行网络恢复/ Determine if NV should be

15、restorednetworkStateNV = ZDApp_ReadNetworkRestoreState();if ( networkStateNV = ZDO_INITDEV_RESTORED_NETWORK_STATE )networkStateNV = ZDApp_RestoreNetworkState();else/ Wipe out the network state in NVNLME_InitNV();NLME_SetDefaultNV();#endifif ( networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE )/如果是要启动新的

16、网络ZDAppDetermineDeviceType();/根据选项设置设备的网络类型,默认路由类型/ Only delay if joining network - not restoring network stateextendedDelay = (uint16)(NWK_START_DELAY + startDelay)+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK);/ Initialize the security for type of deviceZDApp_SecInit( networkStateNV );/ 触发启动网络/ Tr

17、igger the network startZDApp_NetworkInit( extendedDelay );/ set broadcast address mask to support broadcast filtering 用于处理合法的广播地址NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );return ( networkStateNV );这个函数注意功能:初始化设备配置,ZDAppDetermineDeviceType()设置网络类型(协调、路由、终端),ZDApp_NetworkIn

18、it( extendedDelay )初始化网络并开启或加入网络。1.5 定时开启网络ZDApp.c进入ZDApp_NetworkInit()函数,等待一段时间在执行ZDO_NETWORK_INIT,跳入事件处理ZDApp层ZDAPP_EVENT_LOOP()函数开启网络。C+ Codevoid ZDApp_NetworkInit( uint16 delay )if ( delay )/ Wait awhile before starting the deviceosal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );/发送ZDO_

19、NETWORK_INIT(网络初始化)消息到 ZDApp层,转到ZDApp层,ZDApp_event_loop()函数。elseosal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );1.6 启动设备ZDApp.cZDApp_event_loop()函数是回调函数,循环处理主事件。设备逻辑类型,启动模式,信标时间,超帧长度C+ CodeUINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )uint8 *msg_ptr;if ( events & SYS_EVENT_MSG )while ( (msg

20、_ptr = osal_msg_receive( ZDAppTaskID ) )ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );/ Release the memoryosal_msg_deallocate( msg_ptr );/ Return unprocessed eventsreturn (events SYS_EVENT_MSG);if ( events & ZDO_NETWORK_INIT )/ Initialize apps and start the networkdevState = DEV_INIT;/设备逻辑类型,启动模式,信标时间,超帧长度,接着转到去启动设备,转到ZDO_StartDevice()ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1