Zigbee網(wǎng)絡(luò)設(shè)備啟動(dòng)-基本問題說明_第1頁
Zigbee網(wǎng)絡(luò)設(shè)備啟動(dòng)-基本問題說明_第2頁
Zigbee網(wǎng)絡(luò)設(shè)備啟動(dòng)-基本問題說明_第3頁
Zigbee網(wǎng)絡(luò)設(shè)備啟動(dòng)-基本問題說明_第4頁
Zigbee網(wǎng)絡(luò)設(shè)備啟動(dòng)-基本問題說明_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、記錄幾個(gè)問題:1、有關(guān)設(shè)備的啟動(dòng)模式選項(xiàng):(有待完善):非自動(dòng)啟動(dòng)模式HOLD_AUTO_START:HOLD_AUTO_STARTisacompileoptionthatwillsurpressZDAppfromstartingthedeviceandwaitfortheapplicationtostartthedevice.不通過ZDApp(具體講是ZDOInitDevice()而是等待應(yīng)用程序來開啟設(shè)備并初始化建立/加入網(wǎng)絡(luò).軟啟動(dòng)模式SOFT_START:SOFT_STARTisacompileoptionthatallowsthedevicetostartasacoordinator

2、ifoneisntfound.Otherwise,thedevicewillstartasarouter.如果沒有協(xié)調(diào)器則作為協(xié)調(diào)器啟動(dòng),有則作為路由器啟動(dòng).自動(dòng)啟動(dòng)模式:個(gè)人認(rèn)為就是自動(dòng)通過ZDApp(具體講是ZDOInitDevice()來開啟設(shè)備并初始化建立/加入網(wǎng)絡(luò),設(shè)備的邏輯類型由所攜帶的配置文件來決定.2、三種邏輯類型節(jié)點(diǎn)的配置文件協(xié)調(diào)器:f8wCoord.cfg配置文件中同時(shí)編譯了路由功能RTR_NWK和協(xié)調(diào)器功能ZDO_COORDINATOR/*CommonToAllApplications*/-DCPU32MHZ/CC2430sRunat32MHz-DFORCE_MAC_NE

3、AR/MACcodeinNEAR-DROOT=_near_func/MAC/ZMACcodeinNEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/*CoordinatorSettings*/-DZDO_COORDINATOR/CoordinatorFunctions-DRTR_NWK/RouterFunctions/*OptionalSettings*/-DBLINK_LEDS/LEDBlinkFunctions/*Compilerkeywords*/-DCONST=const_code-DGENERIC=_generic/Ptrdeclaration路由器:f8wRo

4、uter.cfg配置文件中編譯了路由功能RTR_NWK/*CommonToAllApplications*/-DCPU32MHZ/CC2430sRunat32MHz-DFORCE_MAC_NEAR/MACcodeinNEAR-DROOT=_near_func/MAC/ZMACcodeinNEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/*RouterSettings*/-DRTR_NWK/RouterFunctions/*OptionalSettings*/-DBLINK_LEDS/LEDBlinkFunctions/*Compilerkeywords*/-DCONST

5、=const_code-DGENERIC=_generic/Ptrdeclaration終端:f8wEdev.cfg配置文件中沒有編譯這兩個(gè)功能./*CommonToAllApplications*/-DCPU32MHZ/CC2430sRunat32MHz-DFORCE_MAC_NEAR/MACcodeinNEAR-DROOT=_near_func/MAC/ZMACcodeinNEAR/*OptionalSettings*/-DMAC_OPT_FFD=0/ZigBeeRFD-DBLINK_LEDS/LEDBlinkFunctions/*Compilerkeywords*/-DCONST=con

6、st_code-DGENERIC=_generic/Ptrdeclaration協(xié)調(diào)器的配置文件只比路由器配置文件多編譯了個(gè)-DZDO_COORDINATOR/CoordinatorFunctions如果同時(shí)編譯非自動(dòng)啟動(dòng)模式HOLD_AUTO_START和軟啟動(dòng)模式SOFT_START,設(shè)備可以通過應(yīng)用程序來選擇成為路由器或協(xié)調(diào)器.當(dāng)然這個(gè)設(shè)備所帶的配置文件應(yīng)為f8wCoord.cfg.對(duì)于設(shè)備攜帶的是何種配置文件,可以打開project-options-c/c+compiler-extraOptions選項(xiàng)查看.比如SampleApp中的DemoEB,同時(shí)編譯了SOFT_START和HOL

7、D_AUTO_START,貌似下載進(jìn)去后通過外部跳線來選擇是當(dāng)協(xié)調(diào)器還是路由器,不過這部分程序已經(jīng)被注銷了.當(dāng)然的,DemoEB所帶的配置文件應(yīng)該是同時(shí)編譯了路由功能和協(xié)調(diào)器功能的f8wCoord.cfg,即編譯了RTR_NWK和ZDO_COORDINATOR.再比女口SimpleApp中兩個(gè)實(shí)驗(yàn)中的燈與開關(guān)實(shí)驗(yàn).開關(guān)設(shè)備SimpleSwitchEB無論按K1還是K2都是作為終端設(shè)備的,其預(yù)編譯選項(xiàng)只有HOLD_AUTO_START而沒有SOFT_START,配置文件為f8wEndev.cfg,沒有協(xié)調(diào)器和路由功能;而燈設(shè)備SimpleControllerEB按鍵K1則作為協(xié)調(diào)器,按K2則作為

8、路由器,其預(yù)編譯選項(xiàng)同時(shí)編譯了SOFT_START和HOLD_AUTO_START,配置文件為f8wCoordcfg,即編譯了RTR_NWK和ZDO_COORDINATOR.SimpleApp中傳感器實(shí)驗(yàn)也一樣,只能作為終端設(shè)備的SimpleSensorEB預(yù)編譯了HOLD_AUTO_START,配置文件為f8wEndev.cfg;而SimpleCollectorEB按K1作為協(xié)調(diào)器按K2作為路由器,預(yù)編譯了SOFT_START和HOLD_AUTO_START,配置文件f8wCoord.cfg.可以通過project-options-c/c+compiler-extraOptions選項(xiàng)查看,

9、也可由workspace看出,如下:作為終端的開關(guān)節(jié)點(diǎn)與作為協(xié)調(diào)器/路由器的燈節(jié)點(diǎn):空白的文件表示沒有包含在這個(gè)workspace中.simpleSwitchEBLE-jApp21fGu.Router.cfg_|Tools掘SimpleSwitch.c&mpleControlleiEB2lfSwEndecfgIiii桁轉(zhuǎn)葡sapi.h葡SimpleApp.h日日回HLJApp孟fSA/Corrfiq.cfgLjfSwaord.cfg2jSimpleCoHector上2|SimpleCoirtroller.JSimpleSensor.cTSHALT3MACS口MT-E!_|NWtHS.QOSAL

10、El口ProfileEi亠JSecuriiyElSenzi匚f3w24MCi兀IDSirripleSerisarjSimpleSwitch.cT3_1HAL-43._iMAC-也._|MTH3L2NWKH3口OSALElCLlProfileS_SecurityE._ServicegPl_jToo(sra勵(lì)汩口一匚j:sapi.h圃SimpleApp.hH出塑羽叫一吁BfQwConfig.cfgSlfSCoord.cfg.fElEndev.cfgf8wRouter.cfg十SimpleCollector.f?TlSimpleCoritraller.cWQ眩匚記CE區(qū)ISimWorkpa匚e國(guó)Si

11、rnplEApp-占im作為終端的傳感器節(jié)點(diǎn)與作為協(xié)調(diào)器、路由器的中心收集節(jié)點(diǎn):空白的文件表示沒有包含在這個(gè)workspace中.jSimpleSen?orEB-L+isapi.cCSimpleSwitch.cerr岫工咕口已匚占-h3.jHALwnanDf8w.Roiiter.cfgJfJfafe430.xclfBw&oniig.Gfg諭fEwtoord.cfg2f6wEndey:cfg13SimpleSenksor.d.QSimpleSwitch.c-Hi一HALMASJf8w30clfSwConfig.GfgjfSwCoard.cfg諭fSEndevccfgJapi-hSimpleApp

12、.h:sapi.h尉SimpleApp.hJSimpleCollectar.cfBRouter.cfgJSirripleController.2SimpleSensor.ffl_iProfilei+i一Sac:ufil#E!_|Services-曰二TcicilgIQSimpleApp-Simpl.*HlDApp-E,_jMAGH3_|MT-Hl_|NWK-SCJOSAL.T3._;ProfileS_jSecurityEi._.;Service?ilTools3、有兩種方式來設(shè)置非自動(dòng)啟動(dòng)模式:HoldAutoStart(1)、手工方式:在ZDApp_Init()函數(shù)中有個(gè)ZDAppCheck

13、ForHoldKey();(Checkformanual(手工的)HoldAutoStart).來看下這個(gè)函數(shù):voidZDAppCheckForHoldKey(void)#if(definedHAL_KEY)&(HAL_KEY=TRUE)/直接通過讀取按鍵來判斷是否需要采用HOLD_AUTO_START模式,如果發(fā)現(xiàn)SW_1處于按下(普通按鍵?)/向上(Joystickup)狀態(tài),則設(shè)置devState為DEV_HOLD;/GetKeypaddirectlytoseeifaHOLD_STARTisneeded./HolddowntheSW_BYPASS_STARTkey(seeOnBoard

14、.h)/whilebootingtoavoidstartingupthedevice.if(HalKeyRead()=SW_BYPASS_START)/HAL_KEY_SW_1/ChangethedevicestatetoHOLDonstartupdevState=DEV_HOLD;#endif/HAL_KEY可以看到如果手工使HAL_KEY_SW_1置位狀態(tài),則會(huì)設(shè)置devState=DEV_HOLD.這里HAL_KEY的初始化見hal_board_cfg.h:#ifndefHAL_KEY#defineHAL_KEYTRUE#endif而對(duì)SW_BYPASS_START的初始化見OnBoar

15、d.h:/TheseKeydefinitionsareuniquetothisdevelopmentsystem./Theyareusedtobypassfunctionswhenstartingupthedevice./這些鍵的定義僅適用于本應(yīng)用例子,可以在設(shè)備啟動(dòng)時(shí)避開一些功能:/避開網(wǎng)絡(luò)層的NV存儲(chǔ)和避開網(wǎng)絡(luò)初始化#defineSW_BYPASS_NVHAL_KEY_SW_5/BypassNetworklayerNVrestore#defineSW_BYPASS_STARTHAL_KEY_SW_1/BypassNetworkinitialization因此避開網(wǎng)絡(luò)層NV存儲(chǔ)也可以通過手工

16、方式來完成.(2)、預(yù)編譯方式:project-options-c/c+compiler-preprocessor-definedsymbols下編譯選項(xiàng):HOLD_AUTO_STARTSimpleApp例子里四種節(jié)點(diǎn)都預(yù)編譯了HOLD_AUTO_START:非自動(dòng)啟動(dòng)模式在ZDApp.c中:#ifdefined(HOLD_AUTO_START)devStates_tdevState=DEV_HOLD;#elsedevStates_tdevState=DEV_INIT;#endif把devState初始化為DEV_HOLD.以上兩種方式最終都會(huì)設(shè)置devState=DEV_HOLD/Initi

17、alized-notstartedautomatically4、devStartMode和devState的初始化,ZDApp.c中:devStartMode:#ifdefined(ZDO_COORDINATOR)&!defined(SOFT_START)/SetthedefaulttocoodinatordevStartModes_tdevStartMode=MODE_HARD;#elsedevStartModes_tdevStartMode=MODE_JOIN;/Assumejoining/devStartModes_tdevStartMode=MODE_RESUME;/ifalready

18、directlyjoined/toparent.SettomakethedevicedoanOrphanscan.#endif編譯了ZDO_COORDINATOR并且沒有編譯SOFT_START,則初始化devStartMode=MODE_HARD;其他情況初始化devStartMode=MODE_RESUME;比如SampleApp三種邏輯類型節(jié)點(diǎn).devState:#ifdefined(HOLD_AUTO_START)devStates_tdevState=DEV_HOLD;/Initialized-notstartedautomatically#elsedevStates_tdevSta

19、te=DEV_INIT;/Initialized-notconnectedtoanything#endif預(yù)編譯了HOLD_AUTO_START,則devState=DEV_HOLD;否則devState=DEV_INIT;5、存儲(chǔ)設(shè)備邏輯類型的NV條目ZCD_NV_LOGICAL_TYPE:在ZGlobals.c下的NV條目表ZGlobalItemTable有這么一個(gè)條目:staticCONSTzgItem_tzgItemTable=#ifdefined(NV_INIT)ZCD_NV_LOGICAL_TYPE,sizeof(zgDeviceLogicalType),&zgDeviceLogi

20、calType,zgItem_t結(jié)構(gòu)體如下:typedefstructzgItemuint16id;uint16len;void*buf;zgItem_t;ZDO全局變量zgDeviceLogicalType被初始化為uint8zgDeviceLogicalType=DEVICE_LOGICAL_TYPE;因此這里全局變量zgDeviceLogicalType的值為NV條目ZCD_NV_LOGICAL_TYPE的值,buf指向zgDeviceLogicalType.如果在應(yīng)用程序中改變了設(shè)備邏輯類型并寫入NV條目ZCD_NV_LOGICAL_TYPE中,這時(shí)即全局變量zgDeviceLogic

21、alType的值改變了(卡在這步上近兩天,因?yàn)檎也恢淖兊倪壿嫚顟B(tài)與設(shè)備開啟時(shí)選擇的邏輯狀態(tài)之間的關(guān)系).(2)NV條目ZCD_NV_LOGICAL_TYPE的值有哪些?/DeviceLogicalType/NV條目ZCD_NV_LOGICAL_TYPE的值包括:(即zgDeviceLogicalType的值)/ValuesforZCD_NV_LOGICAL_TYPE(zgDeviceLogicalType)#defineZG_DEVICETYPE_COORDINATOR0 x00#defineZG_DEVICETYPE_ROUTER0 x01#defineZG_DEVICETYPE_ENDD

22、EVICE0 x02#defineZG_DEVICETYPE_SOFT0 x03對(duì)于DEVICE_LOGICAL_TYPE的值各邏輯類型設(shè)備初始化如下:/DeviceLogicalType/zgDeviceLogicalType=DEVICE_LOGICAL_TYPE#ifdefined(SOFT_START)#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_SOFT/可選擇類型#elifdefined(ZDO_COORDINATOR)#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_COORDINATOR/協(xié)調(diào)器#elifdefin

23、ed(RTR_NWK)#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ROUTER/路由器#else#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ENDDEVICE/終端#endif如果編譯了SOFT_START,則初始化DEVICE_LOGICAL_TYPE=ZG_DEVICETYPE_SOFT,即zgDeviceLogicalType=ZG_DEVICETYPE_SOFT;如果沒有編譯SOFT_START但編譯了ZDO_COORDINATOR,則初始DEVICE_LOGICAL_TYPE=ZG_DEVICETYPE_COOR

24、DINATOR,即zgDeviceLogicalType=ZG_DEVICETYPE_COORDINATOR;路由器和終端類似.6、啟動(dòng)設(shè)備都要通過ZDApp_event_loop()函數(shù)調(diào)用ZDO_StartDevice()對(duì)ZDO_NETWORK_INIT事件的處理:ZDO_StartDevice(uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);這里對(duì)于設(shè)備邏輯類型的傳遞參數(shù)ZDO_Config_Node_Descriptor.L

25、ogicalType,ZDConfig.c中初始化是這樣的:NodeDescriptorFormat_tZDO_Config_Node_Descriptor=#ifdefined(ZDO_COORDINATOR)&!defined(SOFT_START)NODETYPE_COORDINATOR,/協(xié)調(diào)器#elifdefined(RTR_NWK)NODETYPE_ROUTER,/路由器#elseNODETYPE_DEVICE,/終端設(shè)備/LogicalType#endif如果編譯了ZDO_COORDINATOR且沒有編譯SOFT_START,則ZDO_Config_Node_Descriptor

26、.LogicalType的值為NODETYPE_COORDINATOR;如果沒有編譯ZDO_COORDINATOR或者編譯了SOFT_START,且編譯了了RTR_NWK,則ZDO_Config_Node_Descriptor.LogicalType的值為NODETYPE_ROUTER(比如simpleApp中燈節(jié)點(diǎn)和中心收集節(jié)點(diǎn)就是這種情況,因此它倆的ZDO_Config_Node_Descriptor.LogicalType被初始化為NODETYPE_ROUTER,當(dāng)然當(dāng)通過外部按鍵選擇設(shè)備邏輯類型為協(xié)調(diào)器時(shí),會(huì)通過內(nèi)部程序把這個(gè)值改為NODETYPE_COORDINATOR,這點(diǎn)后面再作

27、記錄);剩下情況為NODETYPE_DEVICE.7、simpleApp中的按鍵完成兩個(gè)功能:設(shè)置設(shè)備的邏輯類型(ZC/ZR/ED)和設(shè)置設(shè)備的啟動(dòng)方式(ZCD_STARTOPT_AUTO_START),然后寫入相應(yīng)的NV條目ZCD_NV_LOGICAL_TYPE和ZCD_NV_STARTUP_OPTION.ZDApp_Init()是先于應(yīng)用任務(wù)如SampleApp_Init()初始化的.ZCD_NV_STARTUP_OPTION值包括:/Thesearebitweighted-youcanORthesetogether./Settingoneofthesebitswillsettheiras

28、sociatedNVitems/tocodeinitializedvalues.#defineZCD_STARTOPT_DEFAULT_CONFIG_STATE0 x01/默認(rèn)配置#defineZCD_STARTOPT_DEFAULT_NETWORK_STATE0 x02/默認(rèn)網(wǎng)絡(luò)狀態(tài)#defineZCD_STARTOPT_AUTO_START0 x04/自動(dòng)啟動(dòng)#defineZCD_STARTOPT_CLEAR_CONFIGZCD_STARTOPT_DEFAULT_CONFIG_STATE/清除配置=默認(rèn)配置#defineZCD_STARTOPT_CLEAR_STATEZCD_STARTOP

29、T_DEFAULT_NETWORK_STATE/清除狀態(tài)=默認(rèn)網(wǎng)絡(luò)狀態(tài)ZCD_NV_LOGICAL_TYPE值參見4.8、網(wǎng)絡(luò)狀態(tài)的類型:/設(shè)備的網(wǎng)絡(luò)狀態(tài)為恢復(fù)的網(wǎng)絡(luò)狀態(tài)#defineZDO_INITDEV_RESTORED_NETWORK_STATE0 x00網(wǎng)絡(luò)狀態(tài)初始化,即設(shè)備的網(wǎng)絡(luò)狀態(tài)為新的網(wǎng)絡(luò)狀態(tài).可能意味著ZCD_NV_STARTUP_OPTION不能恢復(fù),或沒有任何網(wǎng)絡(luò)狀態(tài)恢復(fù)#defineZDO_INITDEV_NEW_NETWORK_STATE0 x01復(fù)位前,網(wǎng)絡(luò)重返選項(xiàng)為TRUE,因此該設(shè)備在網(wǎng)絡(luò)中沒有啟動(dòng)(僅一次),下次調(diào)用該函數(shù)將啟動(dòng).#defineZDO_INITD

30、EV_LEAVE_NOT_STARTED0 x029、NV條目ZCD_NV_STARTUP_OPTION初始化分析一:(錯(cuò)誤,見分析二;暫不刪除)NV條目的初始化在zgint()中.main()函數(shù)中:/InitializebasicNVitems/*初始化NV條目*/zgInit();fnzgInit*brief*InitializetheZ-StackGlobals.IfanitemdoesntexistinNVmemory,writethesystemdefaultintoNVmemory.Butifitexists,settheitemtothevaluestoredinNVmemor

31、y.*NOTE:TheStartupOptions(ZCD_NV_STARTUP_OPTION)indicatethattheConfigstateitems(zgItemTable)needtobesettodefaults(ZCD_STARTOPT_DEFAULT_CONFIG_STATE).The*paramnone*returnZSUCCESSifsuccessful,NV_ITEM_UNINITifitemdidnotexistinNV,NV_OPER_FAILEDiffailure.*/uint8zgInit(void)uint8i=0;uint8setDefault=FALSE;

32、/DowewanttodefaulttheConfigstatevaluesif(zgReadStartupOptions()&ZCD_STARTOPT_DEFAULT_CONFIG_STATE)/0 x01setDefault=TRUE;#if0正常情況下被禁止來節(jié)省NV空間/Enablethissectionifyouneedtotrackthenumberofresets/ThissectionisnormallydisabledtominimizewearonNVmemory#endif/InitializetheExtendedPANIDasmyownextendedaddress/

33、擴(kuò)展地址ZMacGetReq(ZMacExtAddr,zgExtendedPANID);#ifndefNONWK/InitializethePre-ConfiguredKeytothedefaultkeyosal_memcpy(zgPreConfigKey,defaultKey,SEC_KEY_LEN);/DoNOTChange!#endif/NONWK-初始化各NV配置狀態(tài)條目值/初始化NV條目表zgItemTable.如果setDefault=TRUE,則設(shè)置為默認(rèn)/值;否則讀取原先存儲(chǔ)在里面的值.while(zgItemTablei.id!=0 x00)/Initializetheite

34、mzgItemInit(zgItemTablei.id,zgItemTablei.len,zgItemTablei.buf,setDefault);/Moveontothenextitemi+;/CleartheConfigStatedefault/如果NV條目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)致位為1if(setDefault)/把ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)致位清0zgWriteStartupOptions(ZG_STARTUP_CLEAR,ZCD_STARTOPT_DEF

35、AULT_CONFIG_STATE);return(ZSUCCESS);NOTE:TheStartupOptions(ZCD_NV_STARTUP_OPTION)indicatethattheConfigstateitems(zgItemTable)needtobesettodefaults(ZCD_STARTOPT_DEFAULT_CONFIG_STATE).開啟選項(xiàng)表明了各NV配置狀態(tài)條目(zgItemTable表中的即為NV配置狀態(tài)條目)需要被設(shè)置為默認(rèn)值.setDefault的值取決于zgReadStartupOptions(),而這個(gè)函數(shù)記取的正是ZCD_NV_STARTUP_OPT

36、ION的值./ReadstheZCD_NV_STARTUP_OPTIONNVItem.uint8zgReadStartupOptions(void)/DefaulttoUseConfigStateandUseNetworkStateuint8startupOption=0;/ThisshouldhavebeendoneinZMain.c,butjustincase.if(osal_nv_item_init(ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption)=ZSUCCESS)/Readsavedstartupcontrol/N

37、V條目ZCD_NV_STARTUP_OPTION值讀到startupOptionosal_nv_read(ZCD_NV_STARTUP_OPTION,0,sizeof(startupOption),&startupOption);return(startupOption);fnzgItemInit()*Initializeaglobalitem.IftheitemdoesntexistinNVmemory,writethesystemdefault(valuepassedin)intoNVmemory.Butifitexists,settheitemtothevaluestoredinNVme

38、mory.*Also,ifsetDefaultisTRUEandtheitemexists,wewillwritethedefaultvaluetoNVspace.*paramid-itemidparamlen-itemlenparambuf-pointertotheitemparamsetDefault-TRUEtosetdefault,notreadTRUE則設(shè)置為默認(rèn)值而不讀取原先的值returnZSUCCESSifsuccessful,NV_ITEM_UNINITifitemdidnotexistinNV,NV_OPER_FAILEDiffailure.*/staticuint8zgI

39、temInit(uint16id,uint16len,void*buf,uint8setDefault)uint8status;/IftheitemdoesntexistinNVmemory,createandinitialize/itwiththevaluepassedin.status=osal_nv_item_init(id,len,buf);/NV條目讀寫前要進(jìn)行條目的初始化if(status=ZSUCCESS)if(setDefault)條目存在,setDefault=TRUE,設(shè)置為默認(rèn)值/WritethedefaultvaluebacktoNVstatus=osal_nv_wri

40、te(id,0,len,buf);else條目存在,setDefault=FALSE,讀取原先存儲(chǔ)的值/TheitemexistsinNVmemory,readitfromNVmemorystatus=osal_nv_read(id,0,len,buf);return(status);zgReadStartupOptionsO中:DefaulttoUseConfigStateandUseNetworkState說明采用默認(rèn)的配置和網(wǎng)絡(luò)狀態(tài),那設(shè)備初始啟動(dòng)時(shí)ZCD_NV_STARTUP_OPTION值應(yīng)該是默認(rèn)配置標(biāo)志位和默認(rèn)網(wǎng)絡(luò)標(biāo)志位都置1,兩者相或0 x03(見7),但還沒能找到究竟哪里進(jìn)行

41、過初始化.回到zgInit():(1)setDefault=FALSE;讀取ZCD_NV_STARTUP_OPTION值如果ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)志位為1,設(shè)置setDefault=TRUE;(3)初始化NV配置狀態(tài)條目表zgItemTable中各條目為默認(rèn)值(4)清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)志位.至于清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)志位,我想如果用戶不改變ZCD_NV_STARTUP_OPTION條目的值,設(shè)備每次重啟都會(huì)將NV條目表中各項(xiàng)初始化為默認(rèn)值:比如Sa

42、mpleApp例子,每次設(shè)備重啟配置狀態(tài)都為默認(rèn)值.而如果用戶改變了ZCD_NV_STARTUP_OPTION的值,比如SimpleApp中:zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);startOptions=ZCD_STARTOPT_AUTO_START;zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);zb_SystemReset();每次按鍵后都會(huì)先把設(shè)備邏輯狀態(tài)寫入NV中(準(zhǔn)備下次啟動(dòng)設(shè)備時(shí)

43、以保存在這個(gè)NV條目里的邏輯類型來啟動(dòng)),然后把ZCD_NV_STARTUP_OPTION設(shè)為ZCD_STARTOPT_AUTO_START0 x04,則下面兩個(gè)標(biāo)志位都為0.ZCD_STARTOPT_DEFAULT_CONFIG_STATE0 x01/默認(rèn)配置狀態(tài):存儲(chǔ)配置信息ZCD_STARTOPT_DEFAULT_NETWORK_STATE0 x02/默認(rèn)網(wǎng)絡(luò)狀態(tài):存儲(chǔ)網(wǎng)絡(luò)信息這樣系統(tǒng)重啟進(jìn)入zgInit()后:if(zgReadStartupOptions()&ZCD_STARTOPT_DEFAULT_CONFIG_STATE)/0 x01setDefault=TRUE;ZCD_STA

44、RTOPT_DEFAULT_CONFIG_STATE標(biāo)志位不為1,setDefaUt保持FALSE,因而進(jìn)入NV配置狀態(tài)條目初始化zgItemint()時(shí),執(zhí)行的是:else條目存在,setDefault=FALSE,讀取原先存儲(chǔ)的值/TheitemexistsinNVmemory,readitfromNVmemorystatus=osal_nv_read(id,0,len,buf);這樣把上次存儲(chǔ)在NV條目ZCD_NV_LOGICAL_TYPE中的設(shè)備邏輯類型值讀出作為此次NV條目ZCD_NV_LOGICAL_TYPE的值.問題是,還未確定開啟選項(xiàng)ZCD_NV_STARTUP_OPTION的

45、值初始化的地方.糾結(jié)中,待解決分析二:ZCD_NV_STARTUP_OPTION最開始在osal_nv_item_int()中初始化,初始化為0fnzgInit*brief*InitializetheZ-StackGlobals.IfanitemdoesntexistinNVmemory,writethesystemdefaultintoNVmemory.Butifitexists,settheitemtothevaluestoredinNVmemory.*NOTE:TheStartupOptions(ZCD_NV_STARTUP_OPTION)indicatethattheConfigsta

46、teitems(zgItemTable)needtobesettodefaults(ZCD_STARTOPT_DEFAULT_CONFIG_STATE).The*paramnone*returnZSUCCESSifsuccessful,NV_ITEM_UNINITifitemdidnotexistinNV,NV_OPER_FAILEDiffailure.*/uint8zgInit(void)uint8i=0;uint8setDefault=FALSE;/DowewanttodefaulttheConfigstatevaluesif(zgReadStartupOptions()&ZCD_STAR

47、TOPT_DEFAULT_CONFIG_STATE)/0 x01setDefault=TRUE;#if0正常情況下被禁止來節(jié)省NV空間/Enablethissectionifyouneedtotrackthenumberofresets/ThissectionisnormallydisabledtominimizewearonNVmemory#endif/InitializetheExtendedPANIDasmyownextendedaddress/擴(kuò)展地址ZMacGetReq(ZMacExtAddr,zgExtendedPANID);#ifndefNONWK/InitializethePr

48、e-ConfiguredKeytothedefaultkeyosal_memcpy(zgPreConfigKey,defaultKey,SEC_KEY_LEN);/DoNOTChange!#endif/NONWK-初始化各NV配置狀態(tài)條目值初始化NV條目表zgItemTable.如果setDefaUt=TRUE,則設(shè)置為系統(tǒng)默認(rèn)/值;否則設(shè)置為原先存儲(chǔ)在里面的值.while(zgItemTablei.id!=0 x00)/InitializetheitemzgItemInit(zgItemTablei.id,zgItemTablei.len,zgItemTablei.buf,setDefaul

49、t);/Moveontothenextitemi+;/CleartheConfigStatedefault/如果NV條目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)致位為1if(setDefault)/把ZCD_STARTOPT_DEFAULT_CONFIG_STATE標(biāo)致位清0zgWriteStartupOptions(ZG_STARTUP_CLEAR,ZCD_STARTOPT_DEFAULT_CONFIG_STATE);return(ZSUCCESS);首先來看下zgReadStartupOptions():/Readst

50、heZCD_NV_STARTUP_OPTIONNVItem.uint8zgReadStartupOptions(void)/DefaulttoUseConfigStateandUseNetworkStateuint8startupOption=0;/ThisshouldhavebeendoneinZMain.c,butjustincase.能返回ZSUCCESS,說明條目已經(jīng)存在;當(dāng)然,如果不存在,還是在osal_nv_item_init/中創(chuàng)建條目并設(shè)置為startupOption的值.if(osal_nv_item_init(ZCD_NV_STARTUP_OPTION,sizeof(sta

51、rtupOption),&startupOption)=ZSUCCESS)/Readsavedstartupcontrol/NV條目ZCD_NV_STARTUP_OPTION值讀到startupOptionosal_nv_read(ZCD_NV_STARTUP_OPTION,0,sizeof(startupOption),&startupOption);return(startupOption);這里讀取ZCD_NV_STARTUP_OPTIONNV值,再來看下osal_nv_item_init():fnosal_nv_item_init*briefIftheNVitemdoesnotalre

52、adyexist,itiscreatedandinitializedwiththedatapassedtothefunction,ifany.Thisfunctionmustbecalledbeforecallingosal_nv_read()orosal_nv_write().如果條目不存在,則創(chuàng)建并初始化為傳遞過來的值.如果存在,直接返回ZSUCCESS.這個(gè)必須在read和write之前調(diào)用.*paramid-ValidNVitemId.paramlen-Itemlength.param*buf-Pointertoiteminitalizationdata.SettoNULLifnone

53、.條目初始化時(shí)的值.returnNV_ITEM_UNINIT-Iddidnotexistandwascreatedsuccessfully.ZSUCCESS-Idalreadyexisted,noactiontaken.NV_OPER_FAILED-FailuretofindorcreateId.*/uint8osal_nv_item_init(uint16id,uint16len,void*buf)/*Globalfailflagforfailduetolowbusvoltagehaslessimpactoncode*sizethanpassingbackareturnvalueallthe

54、wayfromthelowestlevel.*/failF=FALSE;/ZCD_NV_EXTADDRismaintainedwithoutanosalNvHdr_t,soitisalwaysalreadyinitialized./條目已經(jīng)存在,則直接返回ZSUCCESSif(id=ZCD_NV_EXTADDR)|(findItem(id)!=OSAL_NV_ITEM_NULL)returnZSUCCESS;/只有條目已經(jīng)存在了,才會(huì)返回ZSUCCESS條目不存在,則通過initItem創(chuàng)建條目并初始化為buf傳遞過來的值elseif(initItem(TRUE,id,len,buf)if(f

55、ailF)(void)initNV();/SeecommentatthedeclarationoffailF.returnNV_OPER_FAILED;elsereturnNV_ITEM_UNINIT;elsereturnNV_OPER_FAILED;在zgReadStartupOptions()中調(diào)用了osal_nv_item_init(ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption);其中startupOption=0;開始并不存在ZCD_NV_STARTUP_OPTION這個(gè)NV條目,因而這里會(huì)創(chuàng)建NV條目ZCD_NV

56、_STARTUP_OPTION并初始化為startupOption傳遞過來的值0.成功則返回NV_ITEM_UNIMT,因而不會(huì)調(diào)用zgReadStartupOptions()的osal_nv_read(ZCD_NV_STARTUP_OPTION,0,sizeof(startupOption),&startupOption),最后返回startupOption=0.回到zgInit(),setDefault=FALSE保持不變,然后進(jìn)入NV配置狀態(tài)條目初始化zgItemInit(zgItemTablei.id,zgItemTablei.len,zgItemTablei.buf,setDefau

57、lt),注意此時(shí)傳遞進(jìn)去的值z(mì)gItemTablei.buf已經(jīng)定義為系統(tǒng)默認(rèn)值(可以査看ZGlobals.c的NWKGLOBALVARIABLES欄).看下zgItemInit():fnzgItemInit()*brief*Initializeaglobalitem.IftheitemdoesntexistinNVmemory,*writethesystemdefault(valuepassedin)intoNVmemory.Butif*itexists,settheitemtothevaluestoredinNVmemory.*條目不存在,創(chuàng)建并設(shè)置為傳遞過來的值;存在則設(shè)置為原存儲(chǔ)的值.

58、*Also,ifsetDefaultisTRUEandtheitemexists,wewillwrite*thedefaultvaluetoNVspace.*paramid-itemid*paramlen-itemlen*parambuf-pointertotheitem*paramsetDefault-TRUEtosetdefault,notread*returnZSUCCESSifsuccessful,NV_ITEM_UNINITifitemdidnot*existinNV,NV_OPER_FAILEDiffailure.*/staticuint8zgItemInit(uint16id,u

59、int16len,void*buf,uint8setDefault)uint8status;/IftheitemdoesntexistinNVmemory,createandinitialize/itwiththevaluepassedin.status=osal_nv_item_init(id,len,buf);/NV條目讀寫前都要進(jìn)行條目的初始化這里是要status=ZSUCCESS才會(huì)執(zhí)行里面的內(nèi)容,說明此NV條目是已經(jīng)存在的,這樣才會(huì)返回ZSUCCESSif(status=ZSUCCESS)if(setDefault)/條目存在,設(shè)置為默認(rèn)值/Writethedefaultvalueb

60、acktoNVstatus=osal_nv_write(id,0,len,buf);else/條目存在,讀取原先存儲(chǔ)的值/TheitemexistsinNVmemory,readitfromNVmemorystatus=osal_nv_read(id,0,len,buf);return(status);可以看到同樣調(diào)用了osal_nv_item_init(id,len,buf),如果條目不存在則創(chuàng)建并設(shè)置為buf傳遞過來的值,如果存在則直接返回ZSUCCESS.一開始各NV配置狀態(tài)條目不存在,因而這里創(chuàng)建各條目并設(shè)置為buf傳遞過來的值(系統(tǒng)定義的默認(rèn)值).回到zgInit(),各NV配置狀態(tài)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論