a. 現在的協議中中斷節點的data_request為2s一次,路由節點的維護周期為15s。
1. NWK_LINK_STATUS_PERIOD = 15, 默認設置NWK_LINK_STATUS廣播包的發送間隔為15S。
link status數據是作用於鄰居表的,所以關閉的影響就是鄰居表失效后帶來的影響。
| 編譯選項 |
說明 |
| APS_DEFAULT_INTERFRAME_DELAY |
使用分離時Tx包之間的延時 |
| APS_DEFAULT_MAXBINDING_TIME |
最大綁定處理時間(秒),包括匹配描述符,綁定請求,執行綁定 |
| APS_DEFAULT_WINDOW_SIZE |
使用分離是Tx窗口大小 |
| APS_MAX_GROUPS |
在GROUP表中可以有的最大項目數 |
| APSC_ACK_WAIT_DURATION_POLLED |
按照2毫秒傳送周期等待目標節點的確認的終端節點設備的數量 |
| APSC_MAX_FRAME_RETRIES |
傳送失敗后最大重試次數 |
| ASSERT_RESET |
當收到一個斷言后設備將重新啟動,如果沒有設置則LED會閃爍 |
| BEACON_REQUEST_DELAY |
加入過程中每一個信標請求的時間間隔(毫秒) |
| BLINK_LEDS |
LED閃爍使能。 |
| DEFAULT_CHANLIST |
在f8wConfig.cfg修改 |
| EXTENDED_JOINING_RANDOM_MASK |
加入延時的掩碼 |
| HOLD_AUTO_START |
不要自動啟動ZDApp實踐處理循環 |
| LCD_SUPPORTED |
使LCD效仿傳送到串口的數據 |
| MANAGED_SCAN |
通道掃描延時使能 |
| MAX_BINDING_CLUSTER_IDS |
在綁定記錄中的最大CLUSTER ID數量 |
| MAX_POLL_FAILURE_RETRIES |
與父節點的同步延時,更大的值會導致子結點充入網絡延時增加 |
| MAX_RREQ_ENTRIES |
網絡中可允許的最大路由發現請求數 |
| MAX_RTG_ENTRIES |
路由維護中設置路由表中最大可增加項 |
| MAXMEMHEAP |
決定動態內存的最大數量 |
| NONWK |
去除NWK APS ZDO層的功能 |
| NV_INIT |
在設備重啟后載入基本的NV項 |
| NV_RESTORE |
使設備可以(保存/恢復)網絡狀態信息(到/從)NV |
| NWK_AUTO_POLL |
使終端設備能夠自動從父節點獲取。 |
| NWK_INDIRECT_MSG_TIMEOUT |
|
| NWK_MAX_DATA_RETRIES |
尋找下一跳地址的最大重試次數 |
| NWK_MAX_DEVICE_LIST |
關聯設備列表的最大數量 |
| NWK_MAX_DEVICES |
在網絡中的最大設備數量 |
| NWK_START_DELAY |
最小啟動延時 |
| OSAL_TOTAL_MEM |
Track OSAL memory heap usage (display if LCD_SUPPORTED) |
| POLL_RATE |
只對終端設備有效,設置終端節點項父節點獲取數據的周期 |
| POWER_SAVING |
對於電源供電設備打開電源管理函數 |
| QUEUED_POLL_RATE |
|
| REFLECTOR |
綁定使能 |
| REJOIN_POLL_RATE |
只對重入網請求有效 |
| ROUTE_EXPIRY_TIME |
設置路由期滿的時間,0表示路由表不過期 |
| RTR_NWK |
路由網絡功能 |
| SECURE |
啟用或停止ZIGBEE安全功能(true or false) |
| ZAPP_Px |
ZApp 消息使用串口傳送數據(1/2) |
| ZDAPP_CONFIG_PAN_ID |
|
| ZDO_COORDINATOR |
使編譯為協調器 |
| ZIGBEEPRO |
使用ZIGBEE Pro特性 |
| ZTOOL_Px |
是Z-TOOL |
葉子節點
2. 每條數據在網絡中有個生命周期7S,門磁2S會喚醒一次,喚醒的時候就會發送datarequest(葉子節點)。喚醒時也就可以收到數據了。
3. cc2530/41 在PM1、PM2、PM3下看門狗不工作。狗一般都是監控CPU狀態的。PM1、PM2、PM3時CPU都關了,所以所以不用狗來看門了。
4. 在內hal_sleep.c 中加入
void halSleepToDeep(void);
void halSleepToDefault(void);
void halSleepToWakeUp(void);
void halSleepToDeep(void) { //halPwrMgtMode = HAL_SLEEP_DEEP; osal_pwrmgr_device(PWRMGR_BATTERY); } void halSleepToDefault(void) { //halPwrMgtMode = HAL_SLEEP_TIMER; osal_pwrmgr_device(PWRMGR_BATTERY); } void halSleepToWakeUp(void) { halPwrMgtMode = HAL_SLEEP_OFF; osal_pwrmgr_device(PWRMGR_ALWAYS_ON); }
4. osal_pwrmgr_device(PWRMGR_BATTERY);
在OSAL中的OSAL_PwrMgr.c與OSAL_PwrMgr.h兩個文件實現對功耗的控制。
首先是功耗的管理的結構體定義
typedef struct { uint16 pwrmgr_task_state; //是否進入節能模式 #if !defined USE_ICALL && !defined OSAL_PORT2TIRTOS uint16 pwrmgr_next_timeout; //記錄軟件定時器中下次超時的最短一個時間 uint16 accumulated_sleep_time;//記錄累計睡眠多少時間 uint8 pwrmgr_device; //記錄現在設備供電的類型 #endif /* !defined USE_ICALL && !defined OSAL_PORT2TIRTOS */ } pwrmgr_attribute_t;
pwrmgr_task_state的bit0~bit15分別對應着16個任務的功耗狀態,如果某一位為0,則它對應的任務進入節電模式。
pwrmgr_next_timeout記錄着最短的超時時間,從定時器管理列表獲得,在這段時間內,系統處於空閑狀態,所以pwrmgr_next_timeout實際上是記錄當次系統睡眠的時間。
accumulated_sleep_time則記錄這系統累計睡眠時間。
pwrmgr_device則標明系統的供電設備,有兩種:一種是正常供電,另外一種是電池供電。一般正常供電下不需要也沒有必要控制功耗,只有電池供電是,功耗的控制才有意義。
另外定義了一個對應的變量用於存儲功耗管理結構體類型變量
pwrmgr_attribute_t pwrmgr_attribute;
一些宏的定義
3.1、設定任務功耗狀態的宏
#define PWRMGR_CONSERVE 0
#define PWRMGR_HOLD 1
其中PWRMGR_CONSERVE表示進入節電模式,而PWRMGR_HOLD則關閉節電模式。
3.2、設備供電方式的設定宏
#define PWRMGR_ALWAYS_ON 0
#define PWRMGR_BATTERY 1
其中PWRMGR_ALWAYS_ON表示正常供電,PWRMGR_BATTERY表示使用電池供電。
功耗API函數
void osal_pwrmgr_init(void)
函數對芯片的設備供電方式,任務是否能進入節能模式進行設置;默認是正常供電模式,所有的任務都可以進入節能模式。
void osal_pwrmgr_init(void) { pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation. pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve }
void osal_pwrmgr_device(uint8 pwrmgr_device)
函數設置功耗管理系統設備的供電方式
參數: pwrmgr_device 可為下面宏的其中一個
#define PWRMGR_ALWAYS_ON 0
#define PWRMGR_BATTERY 1
其中PWRMGR_ALWAYS_ON表示正常供電,PWRMGR_BATTERY表示使用電池供電。
void osal_pwrmgr_device(uint8 pwrmgr_device) { pwrmgr_attribute.pwrmgr_device = pwrmgr_device; }
uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state )
函數被每個任務調用以設定每個任務的功耗模式
uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ) { if ( task_id >= tasksCnt ) return ( INVALID_TASK ); if ( state == PWRMGR_CONSERVE ) { // Clear the task state flag,清零相應任務位以進入節能模式 pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id );//這里說明只能設置16個任務,每一位設定對應一個任務的功耗模式 } else { // Set the task state flag退出節電模式 pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id); } return ( SUCCESS ); }
void osal_pwrmgr_powerconserve( void )
該函數只能由OSAL主循環調用而不能再其它地方調用,當沒有預定的任務執行的時候,執行該函數使系統進入睡眠模式。
void osal_pwrmgr_powerconserve( void ) { uint32 next; halIntState_t intState; // Should we even look into power conservation設備要處於非正常供電情況下,即處於PWRMGR_BATTERY if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) { // Are all tasks in agreement to conserve所有任務都要允許進入節電模式 if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) { // Hold off interrupts. HAL_ENTER_CRITICAL_SECTION( intState ); // Get next time-out獲得下次超時的時間 next = osal_next_timeout(); // Re-enable interrupts. HAL_EXIT_CRITICAL_SECTION( intState ); // Put the processor into sleep mode進入睡眠模式 OSAL_SET_CPU_INTO_SLEEP( next ); } } }
