自动启动模式分析 - -以SampleApp例程协调器为例_0_第1页
自动启动模式分析 - -以SampleApp例程协调器为例_0_第2页
自动启动模式分析 - -以SampleApp例程协调器为例_0_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自动启动模式分析 - -以sampleapp例程协调器为例 自动启动模式分析-以sampleapp例程协调器为例 (2010-12-23 13:38) 分类: zigbee 技术学习 在上一篇文章中,分析了一下定义了hold_auto_start编译选项后,程序的流程,这里分析一下在没有定义这个编译选项后,程序的启动流程,也就是自动启动模式的流程。sampleapp例程为例。 在zdapp.c文件中,可以看到下面的定义: #if defined( hold_auto_start ) devstates_t devstate = dev_hold; / 初始化-不会自动启动 #else devs

2、tates_t devstate = dev_init; /初始化-没有连接到任何东西 #endif 不管什么样的启动方式,都会在zdapp_init()函数中得到体显,下面是这个函数的源代码。因为这个函数是必须要被执行到。也就是在用户的初始化函数之前被初始化。 void zdapp_init( byte task_id ) uint8 capabilities; / save the task id zdapptaskid = task_id; / initialize the zdo global device short address storage zdappnwkaddr.addr

3、mode = addr16bit; zdappnwkaddr.addr.shortaddr = invalid_node_addr; (void)nlme_getextaddr(); / load the saveextaddr pointer. 加载ieee地址 / check for manual /打开电源时,检测到有手工设置sw_1则会设置devstate = dev_hold,从而不进行络初始化 zdappcheckforholdkey(); / initialize zdo items and setup the device - type of device to create.

4、 zdo_init(); /初始化zdo条目,并设置设备的启动方式是协调器,还是别的 / 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 *) #if defined( zdo_userdesc_response ) zdapp_inituserdesc(); #endif / zdo_userdesc_respo

5、nse / set broadcast address mask to support broadcast filtering nlme_getrequest(nwkcapabilityinfo, 0, nlme_setbroadcastfilter( capabilities ); / start the device? 是否启动设备?如果devstate不是dev_hold时,则启动设备,在上面的代码分析中,也可以看到,如果定义了hold_auto_start宏,则devstate等于dev_hold,不会启动设备。如果按下了sw_1键devstate也 等于dev_hold,也不会启动络

6、。也就是说有两种方式可以设置非自动启动模式,一种是通过按键,一种通过宏定义 if ( devstate != dev_hold ) zdoinitdevice( 0 ); /在本例程中没有定义hold_auto_start所以这个会成功执行 else /如果定义了hold_auto_start,则等待延时或外部事件启动络,并且led4灯,也就是蓝色的灯闪烁 / blink led to indicate hold_start halledblink ( hal_led_4, 0, 50, 500 ); zdapp_registercbs(); /* zdo_init() */ 其中zdoini

7、tdevice()函数是最重要的,也是设备的初始化。下面是zdoinitdevice()函数的源代码。 uint8 zdoinitdevice( uint16 startdelay ) /初始化设备络状态为zdo_initdev_new_network_state:新的络状态.可能意味着zcd_nv_startup_option不能恢复,或没有任何络状态恢复 uint8 networkstatenv = zdo_initdev_new_network_state; uint16 extendeddelay = 0; devstate = dev_init; / remove the hold

8、state 重新设置设备状态 / initialize leave control logic /函数读取nv项目zcd_nv_leave_ctrl的值,zdapp_leavectrl指向这个值 zdapp_leavectrlinit(); / check leave control reset settings /设备的断开会造成dev_hold状态,这里面设置的. zdapp_leavectrlstartup( / leave may make the hold state come back /以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则 /把设备状态设为dev_hol

9、d /zdo_initdev_leave_not_started:该设备没有在络中,下次调用才启用. if ( devstate = dev_hold ) return ( zdo_initdev_leave_not_started ); / dont join - (one time). #if defined ( nv_restore ) / get keypad directly to see if a reset nv is needed. / hold down the sw_bypass_nv key (defined in onboard.h) / while booting t

10、o skip past nv restore. if ( halkeyread() = sw_bypass_nv ) /sw_bypass_nv按键处于按下状态时,则避开络层的nv存储 networkstatenv = zdo_initdev_new_network_state; /设备络状态为新的络状态 else / determine if nv should be restored /函数返回的设备络状态要么是新的络状态;要么是恢复的络状态;以此 /来确定要不要读取nv里相应条目来恢复络先前状态 networkstatenv = zdapp_readnetworkrestorestate

11、(); /如果设备的络状态为恢复的络状态 if ( networkstatenv = zdo_initdev_restored_network_state ) networkstatenv = zdapp_restorenetworkstate(); else / wipe out the network state in nv /恢复设备先前的络状态参数 /设置devstartmode = mode_resume nlme_initnv(); nlme_setdefaultnv(); #endif /如果设备的络状态为新的络状态, if ( networkstatenv = zdo_init

12、dev_new_network_state ) /根据预编译来设置设备新的络状态参数 zdappdeterminedevicetype(); / only delay if joining network - not restoring network state extendeddelay = (uint16)(nwk_start_delay + startdelay) + (osal_rand() / initialize device security zdapp_secinit( networkstatenv ); / trigger the network start zdapp_n

13、etworkinit( extendeddelay ); return ( networkstatenv ); 在这里又分了两种情况,一种是定义了编译选项nv_restore,另一种就是没有定义该编译选项。 下面首先看一下没有定义该选项的情况: (1) nv_restore编译选项定义 首先,判断按键hal_key_sw_5是否按下,如果hal_key_sw_5按键按下,则设置networkstatenv = zdo_initdev_new_network_state; 如果没有 按下,通过调用zdapp_readnetworkrestorestate()函数设置networkstatenv的

14、值,通过读取zcd_nv_startup_option项的值,来决定networkstatenv选项的值。如果这个函数的返回值为 zdo_initdev_restored_network_state。则调用zdapp_restorenetworkstate();函数,该函数的源代码如下: uint8 zdapp_restorenetworkstate( void ) byte nvstat; #if ( secure != 0 ) nwkactivekeyitems keyitems; #endif / initialize nwk nv items nvstat = nlme_initnv(

15、); /如果设备的状态为恢复的络状态,即 zdo_initdev_restored_network_state状态,则进行这个函数进行恢复。如果短地址为0x0000则为协调器结点,然后设备逻辑设备的类型为 nodetype_coordinator,并设置devstartmode = mode_resume;说明设备为恢复状态。 if ( nvstat != nv_oper_failed ) if ( nlme_restorefromnv() ) / are we a coordinator zdappnwkaddr.addr.shortaddr = nlme_getshortaddr(); i

16、f ( zdappnwkaddr.addr.shortaddr = 0 ) zdo_config_node_descriptor.logicaltype = nodetype_coordinator; devstartmode = mode_resume; else nvstat = nv_item_uninit; #if ( secure != 0 ) nwkframecounterchanges = 0; osal_memset( osal_nv_item_init( zcd_nv_nwkkey, sizeof(nwkactivekeyitems), (void *) #if define

17、d ( zdo_coordinator ) zdapp_restorenwkkey(); #endif / zdo_coordinator #endif / secure / the default for rxonwhenidle is true for rtr_nwk and false for end devices / setup in the nlme_restorefromnv(). change it here if you want something / other than default. if ( nvstat = zsuccess ) return ( zdo_ini

18、tdev_restored_network_state ); else return ( zdo_initdev_new_network_state ); /如果networkstatenv=zdo_initdev_new_network_state,则会调用下面的函数 void zdappdeterminedevicetype( void ) if ( zgdevicelogicaltype = zg_devicetype_enddevice ) return; #if defined ( soft_start ) if ( zgdevicelogicaltype = zg_devicetype_coordinator ) devstartmode = mode_hard; / start as a coordinator zdo_config_node_descriptor.logicalt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论