3.6. STA节能模式PSMode示例工程说明
本工程展示了使用STA节能模式PSMode的使用示例:
STA节能模式PSMode使用的方法
一段时间内程序限定WIFI不进入休眠的方法
3.6.1. 工程示例及配置说明
example:
具体示例代码详见
apps/common/example/wifi/low_power/main.c `` ,示例工程实现需在 ``apps/demo/demo_DevKitBoard/include/demo_config.h
中开启宏USE_DEMO_WIFI_TEST
和USE_LOW_POWER_TEST
。在
app_config.h
中打开宏定义#define CONFIG_LOW_POWER_ENABLE
和#define TCFG_LOWPOWER_LOWPOWER_SEL (RF_SLEEP_EN|RF_FORCE_SYS_SLEEP_EN|SYS_SLEEP_EN)
。在
wifi_demo_task.c
中进行如下配置:打开宏定义
#define STA_MODE_TEST
配置WIFI工作在STA模式配置STA模式的
STA_SSID
(名称)和STA_PWD
(密码)
3.6.2. 代码流程
c_main()入口:
A)创建任务sta_low_power_test_task
sta_low_power_test_task():
A)循环定时去允许和不允许WIFI 进行休眠
3.6.3. 休眠策略说明
针对不同的应用场景, 具备如下四种休眠间隔策略:
DTIM 间隔,默认使用该策略,只会在 DTIM 周期计数为0 时唤醒进行 beacon 的监听,休眠间隔由连接的 AP 所设置的 DTIM 周期决定,可主动配置 AP 为 DTIM10 的模式,实现 1s 的休眠间隔
TIM 间隔,即每个 beacon 都会唤醒进行 TIM 监听,当系统需要进行高吞吐的业务时,可以使用该策略。通过函数
wl_enabled_listen_each_tim
和wl_disenabled_listen_each_tim
开启或关闭该策略,退出该策略时模式默认回到 DTIM 监听自定义监听间隔, 该策略允许用户设置自己的休眠时间,但是这个间隔只有 STA 自己知道, AP 只知道关联时的默认监听间隔,因此设置过长的话可能会导致断连或者响应不及时,通过
wl_set_custom_listen_interval
允许设置 1s、2s 甚至更高的休眠间隔,wl_enabled_listen_custom_intervals
和wl_disenabled_listen_custom_intervals
开启或关闭该策略,退出该策略时模式默认回到 DTIM 监听不监听 DTIM 间隔,该策略的休眠间隔是设备关联时配置的默认监听间隔, 通过函数
wl_set_default_listen_interval
设置默认间隔,这个间隔时间需要在连接之前进行配置才能生效,关联后 STA 和 AP 双方都知道这个间隔,但是不建议设置太长,因为休眠间隔太长同样会导致响应不及时。该策略优先级最低,只有关闭 DTIM 监听是才使用该策略, 即可以通过wl_disenabled_listen_dtim
开启该策略
- 举例: 使用默认监听间隔,并配置休眠间隔为 10 个 Beacon Interval (通常情况下一个 Beacon Interval 大概是 102.4ms, 本例的休眠监听间隔大概是 1s 左右,功耗测试情况请参考
doc/stuff/Wi-Fi场景功耗评估
) 步骤如下:
配置
app_config.h
打开宏定义#define CONFIG_LOW_POWER_ENABLE
和#define TCFG_LOWPOWER_LOWPOWER_SEL (RF_SLEEP_EN|RF_FORCE_SYS_SLEEP_EN|SYS_SLEEP_EN)
在
board.c
中,power_init
之后调用power_keep_state(POWER_KEEP_RESET | POWER_KEEP_FLASH | POWER_KEEP_SYSPLL);
保证休眠时不降频和不下电 flash调用
low_power_hw_unsleep_unlock
使能休眠动作在
WIFI_EVENT_STA_CONNECT_SUCC
事件之后调用wifi_rxfilter_cfg(3);
,过滤not_my_bssid,如果需要使用扫描空中SSID就不要过滤调用如下方式启动默认监听间隔策略:
3.6.4. 其他说明:
唤醒响应慢:
A)可以在唤醒之后,通过
low_power_hw_unsleep_lock
和low_power_hw_unsleep_unlock
来开关休眠B)可以通过函数
wl_set_active_wait_interval
配置每次唤醒之后保持活跃的 Beacon Interval ;防止来不及接收数据或者发送数据又再次睡下去,比如配置休眠间隔是 10 个 Beacon Interval ,则可以将唤醒后的活跃间隔配置成 2~4 个 Beacon Interval降频操作会导致对补偿时间变长,同时在保活休眠状态降频会引入额外的 RX idle 等待时间和 RX 执行时间。具体实现需要用户自行权衡;降低系统频率之后需要使用函数
power_set_sys_sleep_compensate_us
和power_set_rf_sleep_compensate_us
对系统休眠和 RF 休眠的补偿值进行微调休眠补偿时间微调说明:
低功耗模式下,统计从休眠唤醒到再次休眠这段时间内的收发包动作的功能可以在
net/wifi_conf.c
下通过将wifi_psmode_transfer_statistics_enable
赋值为 1 打开;理想的低功耗保活状态下只会收到一个 rx 包,这个包是 AP 发来的 beacon 帧,不会出现发包;偶尔的一次 tx 是 AP 和 STA 之间的 NULL DATA 保活包,属于正常保活流程;其他的收发包动作,如 arp、正常收发数据帧等都会延迟系统进入休眠的流程而引入功耗;收发数据动作需要保持清醒一段时间进行监听和发送,这个清醒时间的默认是 12 * 100ms(见
net/wifi_conf.c
的wl_transmit_keep_awake_time
变量);ARP 等传输量很小的动作并不需要 1200ms 那么长的清醒时间,在低功耗流程中,可以通过wl_set_transmit_keep_awake_time
缩短清醒时间将休眠期间的功耗维持在理想保活的状态而不至于引入过多的 rx idle 时间,最小保持清醒时间为 100ms;当不进行休眠时,建议将保持清醒时间延长,例如恢复到默认的 1200 ms;
3.6.5. 常见问题:
测试低功耗时,功耗没变是什么原因?
答:可能是连接的路由器不支持PSmode模式,需要换一个其他路由器重新进行测试。
AC79 WiFi 支持AP模式低功耗吗?
答:目前只支持STA模式下的节能模式。