Skip to content

教程:能耗监控

冯基魁 edited this page Jun 13, 2020 · 1 revision

本教程将展示如何使用Contiki-NG中的Energest模块进行能耗监控。 有关更多详细文档,请参阅文档:能耗评估(Energest)

Energest 模块

Energest模块跟踪何时打开和关闭各种组件。 通过了解组件处于不同状态的时间以及组件的功耗,可以估算能耗。

下面的示例显示了一个简单的应用程序,该应用程序每10秒钟打印一次CPU处于活动状态、睡眠状态和深度睡眠状态的时间。 它还以秒为单位显示无线电关闭,收听或发送的时间。

#include "sys/energest.h"

static unsigned long
to_seconds(uint64_t time)
{
  return (unsigned long)(time / ENERGEST_SECOND);
}

PROCESS_THREAD(energest_example_process, ev, data)
{
  static struct etimer periodic_timer;
  PROCESS_BEGIN();

  etimer_set(&periodic_timer, CLOCK_SECOND * 10);
  while(1) {
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
    etimer_reset(&periodic_timer);

    /* Update all energest times. */
    energest_flush();

    printf("\nEnergest:\n");
    printf(" CPU          %4lus LPM      %4lus DEEP LPM %4lus  Total time %lus\n",
           to_seconds(energest_type_time(ENERGEST_TYPE_CPU)),
           to_seconds(energest_type_time(ENERGEST_TYPE_LPM)),
           to_seconds(energest_type_time(ENERGEST_TYPE_DEEP_LPM)),
           to_seconds(ENERGEST_GET_TOTAL_TIME()));
    printf(" Radio LISTEN %4lus TRANSMIT %4lus OFF      %4lus\n",
           to_seconds(energest_type_time(ENERGEST_TYPE_LISTEN)),
           to_seconds(energest_type_time(ENERGEST_TYPE_TRANSMIT)),
           to_seconds(ENERGEST_GET_TOTAL_TIME()
                      - energest_type_time(ENERGEST_TYPE_TRANSMIT)
                      - energest_type_time(ENERGEST_TYPE_LISTEN)));
  }
  PROCESS_END();
}

可以通过将ENERGEST_CONF_ON配置为1来启用Energest模块。最简单的方法是在project-conf.h文件添加下面这行代码:

#define ENERGEST_CONF_ON 1

运行energest的示例

要测试Energest模块,可以转到examples/libs/energest目录并构建示例。 可以为native平台构建,但是由于native平台不休眠,因此在诸如Zolertia Firefly之类的嵌入式设备上运行此示例会更有趣。

$ cd examples/libs/energest
$ make TARGET=zoul example-energest.upload
[...]
$ make TARGET=zoul login
connecting to /dev/tty.SLAB_USBtoUART (115200) [OK]
[INFO: Main      ] Starting Contiki-NG-4.0
[INFO: Main      ]  Net: sicslowpan
[INFO: Main      ]  MAC: CSMA
[INFO: Main      ] Link-layer address 0012.4b00.060d.b200
[INFO: Main      ] Tentative link-local IPv6 address fe80::212:4b00:60d:b200
[INFO: Zoul      ] Zolertia Firefly revision B platform

Energest:
 CPU             0s LPM         9s DEEP LPM    0s  Total time 10s
 Radio LISTEN   10s TRANSMIT    0s OFF         0s

Energest:
 CPU             0s LPM        19s DEEP LPM    0s  Total time 20s
 Radio LISTEN   20s TRANSMIT    0s OFF         0s

上面的输出显示CPU在大多数时间都处于睡眠状态,但是在此示例应用程序中,无线电始终保持打开状态。