• 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 );
            }
        }
    }
  • 相关阅读:
    缓存使用的最佳实践
    如何科学的设置线程池
    双检查锁失效
    Minor GC、Major GC和Full GC之间的区别
    full gc频繁的分析及解决案例
    MySQL的并发控制与加锁分析
    全面理解Java内存模型
    JAVA中MAP转LIST
    java 编码转换
    自定义VIew基础
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/6527633.html
Copyright © 2020-2023  润新知