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_TESTUSE_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_timwl_disenabled_listen_each_tim 开启或关闭该策略,退出该策略时模式默认回到 DTIM 监听

  • 自定义监听间隔, 该策略允许用户设置自己的休眠时间,但是这个间隔只有 STA 自己知道, AP 只知道关联时的默认监听间隔,因此设置过长的话可能会导致断连或者响应不及时,通过 wl_set_custom_listen_interval 允许设置 1s、2s 甚至更高的休眠间隔, wl_enabled_listen_custom_intervalswl_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_locklow_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_uspower_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.cwl_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模式下的节能模式。