版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新车订车定金合同范本
- 南海区与粤海集团签署战略合作框架协议
- 维修协议书集合
- 2024版钢筋原材料质量检测合同
- 基于人工智能的视频监控系统开发合同(04版)
- 合同成立的要素2篇
- 挖掘机合伙经营协议书3篇
- 《长广溪水质处理》课件
- 急性阑尾炎课件简单
- 美容化妆品供货商2024年度协议
- 广东省广州外国语、广大附中、铁一中学等三校2024-2025学年高三上学期期中联考试题 物理(含解析)
- 大班数学课件《简单的统计》
- 《中医护理学绪论》课件
- 福建省福州杨桥中学2023-2024学年八年级上学期期中考试语文试题
- 2024年《小学教育学》课件:教学方法与手段
- 中小学德育教育创新模式与实践方案
- 2024年工程制图教案发展趋势预测
- 统编版语文六年级上册-27我的伯父鲁迅先生-教学课件多篇
- 2024年创意市集承办协议
- 英语演讲技巧与实训学习通超星期末考试答案章节答案2024年
- 广东省广州市天河区2024-2025学年八年级上学期语文期中测试卷(含解析)
评论
0/150
提交评论