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