Contiki Cooja 对 Sky mote 的模拟中的 Energest CPU 读数正在减少
Energest CPU readings in Contiki Cooja simulation of Sky mote are decreasing
我的 Energest 能量估计在 Sky mote 的 Cooja 模拟中没有意义。
我想读出 CPU、加密前后的 TX 和 RX 值以及数据从一个节点到另一个节点的传输。 total 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 也无济于事。
您将 all_cpu
、all_lpm
、all_transmit
和 all_listen
定义为 32 位无符号整数。 32 位无符号整数最多只能容纳 232-1 的值。如果您查看所有 CPU 刻度(1186791424
、3010854912
、4026073088
、...)的序列,您会发现 4026073088
非常接近232-1 (4294967295
),所以下一个打印值 (2539323392
) 小于那个值也就不足为奇了——变量溢出了。
要解决这个问题,您可以:
- 将报价存储在
uint64_t
而不是 uint32_t
。
- 减少每秒 rtimer 滴答数 - 但在 Sky 上它是硬件
依赖,所以这样做很重要。
- 检测溢出并稍后解决:例如,每次计数器减少时都要注意,并将溢出计数器保存在单独的变量中。当您分析日志时,您很可能可以在 post 处理阶段执行此操作 - 您只需要确保足够频繁地打印计数器,以便每次调用 [=22 之间最多有一个溢出=].
我的 Energest 能量估计在 Sky mote 的 Cooja 模拟中没有意义。 我想读出 CPU、加密前后的 TX 和 RX 值以及数据从一个节点到另一个节点的传输。 total 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 也无济于事。
您将 all_cpu
、all_lpm
、all_transmit
和 all_listen
定义为 32 位无符号整数。 32 位无符号整数最多只能容纳 232-1 的值。如果您查看所有 CPU 刻度(1186791424
、3010854912
、4026073088
、...)的序列,您会发现 4026073088
非常接近232-1 (4294967295
),所以下一个打印值 (2539323392
) 小于那个值也就不足为奇了——变量溢出了。
要解决这个问题,您可以:
- 将报价存储在
uint64_t
而不是uint32_t
。 - 减少每秒 rtimer 滴答数 - 但在 Sky 上它是硬件 依赖,所以这样做很重要。
- 检测溢出并稍后解决:例如,每次计数器减少时都要注意,并将溢出计数器保存在单独的变量中。当您分析日志时,您很可能可以在 post 处理阶段执行此操作 - 您只需要确保足够频繁地打印计数器,以便每次调用 [=22 之间最多有一个溢出=].