当前位置: 首页 > 知识库问答 >
问题:

天空微尘Contiki Cooja模拟中的能量测试CPU读数正在减少

景阳平
2023-03-14

我的能量估计在天空尘埃的Cooja模拟中没有意义。我想在加密之前和之后读取CPU、TX和RX值,并将数据从一个mote传输到另一个mote。总CPU的读数开始增加,但几轮之后又突然下降。我的理解是,它们不会重置,但会显示点击总数。因此,我从当前值中减去旧值以显示每个时期的消耗量。

energest_init();


printf("Ticks per second: %u\n", RTIMER_SECOND);

  while(1) {


PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
etimer_reset(&periodic_timer);
etimer_set(&send_timer, SEND_TIME);

PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer));
addr = servreg_hack_lookup(SERVICE_ID);
if(addr != NULL) {

  powertrace_getold(); 
  //here happens what I want to track
  powertrace_print("");
} else {
  printf("Service %d not found\n", SERVICE_ID);
}
}

这里是我调用的最强大的函数

void powertrace_getold(void){

  energest_flush();
  last_cpu = energest_type_time(ENERGEST_TYPE_CPU);
  last_lpm = energest_type_time(ENERGEST_TYPE_LPM);
  last_transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT);
  last_listen = energest_type_time(ENERGEST_TYPE_LISTEN);
}



/*---------------------------------------------------------------------------*/
void
powertrace_print(char *str)

{
  uint32_t cpu, lpm, transmit, listen;
  uint32_t all_cpu, all_lpm, all_transmit, all_listen;

  static uint32_t seqno;

  energest_flush();
  seqno++;  
  all_cpu = energest_type_time(ENERGEST_TYPE_CPU);
  all_lpm = energest_type_time(ENERGEST_TYPE_LPM);
  all_transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT);
  all_listen = energest_type_time(ENERGEST_TYPE_LISTEN);

  cpu = all_cpu - last_cpu;
  lpm = all_lpm - last_lpm;
  transmit = all_transmit - last_transmit;
  listen = all_listen - last_listen;

printf("SQ:%d AllCPU:%lu AllLPM:%lu AllTX:%lu AllLST:%lu\n",seqno, all_cpu,all_lpm,all_transmit,all_listen);
printf("SQ:%d    CPU:%lu LPM:%lu TX:%lu LST:%lu\n",seqno,cpu,lpm,transmit,listen);

}

这里有一些输出:

SQ:1 AllCPU:1186791424 AllLPM:756219905 AllTX:1756561462 AllLST:1931870208
SQ:1    CPU:93716480 LPM:93716480 TX:93650944 LST:93650944
SQ:2 AllCPU:3010854912 AllLPM:3091398657 AllTX:2625110086 AllLST:2710700032
SQ:2    CPU:93716480 LPM:93716480 TX:93782016 LST:93716480
SQ:3 AllCPU:4026073088 AllLPM:2875260929 AllTX:2958426201 AllLST:3292790784
SQ:3    CPU:97386496 LPM:97320960 TX:97320960 LST:1703936
SQ:4 AllCPU:2539323392 AllLPM:2459107330 AllTX:3841982587 AllLST:123666432
SQ:4    CPU:97320960 LPM:97320960 TX:97320960 LST:1703936
SQ:5 AllCPU:194379776 AllLPM:3890544643 AllTX:4187422878 AllLST:1273561088
SQ:5    CPU:93782016 LPM:93782016 TX:93782016 LST:93716480
SQ:6 AllCPU:1199505408 AllLPM:2522808323 AllTX:183107761 AllLST:1925709825
SQ:6    CPU:93978624 LPM:93913088 TX:93913088 LST:93978624

正如您所看到的,这些值并不相加。我错过了什么?ENERGEST\u开/关也无助于更改任何内容。

共有1个答案

萧修永
2023-03-14

将所有cpu、所有lpm、所有传输和所有侦听定义为32位无符号整数。32位无符号整数最多只能保存2个值。如果查看所有CPU标记的顺序(1186791424,301854912,4026073088,…)您可以看到,4026073088非常接近2(4294967295),因此下一个打印值(2539323392)小于该值也就不足为奇了-变量已溢出。

要解决这个问题,您可以:

  1. 将刻度存储在uint64_t而不是uint32_t中。
  2. 减少每秒rtimer滴答的数量-但在Sky上它依赖于硬件,因此这样做将是至关重要的。
  3. 检测溢出并稍后解释它们:例如,每次计数器减少时都要注意,并将溢出计数器保留在一个单独的变量中。您很可能可以在分析日志的后处理阶段这样做-您只需要确保足够频繁地打印计数器,以便在每次调用powertrace_print()之间最多可以有一个溢出。

 类似资料:
  • 当我注意到一些我没想到的事情时,我正在探索Contiki Cooja模拟器(使用Contiki NG)并尝试一个UDP服务器和几个具有不同mote类型的UDP客户端(来自示例/rpl-udp)。 当我将mote设置为z1/sky类型时,几乎所有客户端mote都只向服务器发送DAO。事实上,DODAG以星形拓扑结构结束(由于sky mote中的邻居表很小,所以多个客户端保持隔离)。 然而,在库贾尘粒

  • 我对JUnit测试和Mockito框架非常陌生,我有一个用例,我想测试一个方法,该方法在内部调用我需要测试的同一类的重载方法。我已经为第一个方法编写了单元测试,希望跳过内部的第二个方法调用。下面是代码片段。 需要测试的类- 测试班-

  • 问题内容: 我有一个名为Java的Java类,我想用JUnit进行测试。我要测试的公共方法调用同一类中的私有方法,以确定要遵循的条件路径。我的目标是为中的不同路径编写JUnit测试。另外,调用服务,因此我不希望在运行JUnit测试时实际执行该服务。 模拟和控制其返回值以便我可以测试“ methodA”的不同路径的最佳方法是什么? 我更喜欢在编写模拟时使用JMockit,因此我对适用于JMockit

  • 我在试着采纳协议。我了解消费者方面的等式,它看起来非常好。但我对制作人方面感到困惑。 文档似乎提倡运行提供者应用程序,并根据正在运行的服务器验证合同。 我怎样才能用Pact实现这一点呢?

  • 问题内容: 每当我想测试使用资源注入的类时,我最终都会包含一个仅在测试中使用的构造函数: 还有另一种模拟资源注入的方式,或者这是遵循的正确模式吗? 问题答案: 您可以使用简单的光泽效果,它可以模拟EJB注入系统。 另一种方法是在测试中使用反射来设置字段,我有时使用类似这样的内容:

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient