Zstack 協議棧小知識


 

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 );
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM