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 );
        }
    }
}
原文地址:https://www.cnblogs.com/mrsandstorm/p/6527633.html