Contiki Cooja对Sky mote进行模拟时,CPU的能量消耗正在减少

时间:2018-12-04 12:37:05

标签: c contiki cooja

我的Energest能量估算在Cooja对Sky尘埃的模拟中没有意义。 我想在加密和将数据从一个节点传输到另一节点之前和之后读取CPU,TX和RX值。总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);
}
}

这里我调用的Energest函数

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_ON / OFF也无济于事。

1 个答案:

答案 0 :(得分:0)

您将all_cpuall_lpmall_transmitall_listen定义为32位无符号整数。一个32位无符号整数只能保存最多2 32 -1的值。如果查看所有CPU滴答声的顺序(118679142430108549124026073088,...),您会发现4026073088非常接近2 32 -1(4294967295),因此下一个打印值(2539323392)小于此值-变量已溢出也就不足为奇了。

要解决此问题,您可以:

  1. 将刻度线存储在uint64_t中,而不是uint32_t中。
  2. 减少每秒的rtimer节拍数-但是在Sky上它是硬件 依赖,因此这样做并非易事。
  3. 检测溢出并在以后进行处理:例如,每次计数器减少时都要注意,并将溢出计数器保留在单独的变量中。您很可能可以在后期处理阶段中分析日志时执行此操作-您只需要确保计数器被足够频繁地打印,以使每次对powertrace_print()的调用之间最多可以有一个溢出。 / li>