Java 应用程序没有';如果我删除printf,则无法正常工作
我有一个Contiki应用程序,这让我发疯 我必须计算出特莫特天空的能量消耗。我使用的是energest,这是我在能耗估算函数中使用的一段代码,它会定期调用:Java 应用程序没有';如果我删除printf,则无法正常工作,java,c,contiki,Java,C,Contiki,我有一个Contiki应用程序,这让我发疯 我必须计算出特莫特天空的能量消耗。我使用的是energest,这是我在能耗估算函数中使用的一段代码,它会定期调用: lpm_time = energest_type_time(ENERGEST_TYPE_LPM); cpu_time = energest_type_time(ENERGEST_TYPE_CPU); rx_time = energest_type_time(ENERGEST_TYPE_LISTEN); tx_time = energest
lpm_time = energest_type_time(ENERGEST_TYPE_LPM);
cpu_time = energest_type_time(ENERGEST_TYPE_CPU);
rx_time = energest_type_time(ENERGEST_TYPE_LISTEN);
tx_time = energest_type_time(ENERGEST_TYPE_TRANSMIT);
lpm = lpm_time - prev_times.lpm_time;
cpu = cpu_time - prev_times.cpu_time;
rx = rx_time - prev_times.rx_time;
tx = tx_time - prev_times.tx_time;
consumed_energy = (I_LPM * lpm + I_CPU * cpu + I_RX * rx + I_TX * tx) * VOLTS / RTIMER_ARCH_SECOND; /* mJ = mA * seconds * volts */
/*printf("lpm %lu, cpu %lu, rx %lu, tx %lu, prl %lu, prc %lu, prr %lu, prt %lu\n",
lpm_time, cpu_time, rx_time, tx_time, prev_times.lpm_time, prev_times.cpu_time, prev_times.rx_time, prev_times.tx_time);*/
prev_times.lpm_time = lpm_time;
prev_times.cpu_time = cpu_time;
prev_times.rx_time = rx_time;
prev_times.tx_time = tx_time;
问题在于,只有启用了现在注释的printf
,应用程序才能正常工作。
如果它保持原来的注释状态,我可以接收consumered\u energy
变量的无意义值,或者使用Java非法读取越界
消息停止COOJA模拟
为什么会发生这种情况???原因可能是什么?
这是一件非常奇怪的事情
提前谢谢
此文件的完整代码如下:
volatile static struct energest_times prev_times;
float update_consumption()
{
uint32_t lpm_time;
uint32_t cpu_time;
uint32_t rx_time;
uint32_t tx_time;
uint32_t lpm;
uint32_t cpu;
uint32_t rx;
uint32_t tx;
float consumed_energy;
lpm_time = energest_type_time(ENERGEST_TYPE_LPM);
cpu_time = energest_type_time(ENERGEST_TYPE_CPU);
rx_time = energest_type_time(ENERGEST_TYPE_LISTEN);
tx_time = energest_type_time(ENERGEST_TYPE_TRANSMIT);
lpm = lpm_time - prev_times.lpm_time;
cpu = cpu_time - prev_times.cpu_time;
rx = rx_time - prev_times.rx_time;
tx = tx_time - prev_times.tx_time;
consumed_energy = (I_LPM * lpm + I_CPU * cpu + I_RX * rx + I_TX * tx) * VOLTS / RTIMER_ARCH_SECOND; /* mJ = mA * seconds * volts */
printf("lpm %lu, cpu %lu, rx %lu, tx %lu, prl %lu, prc %lu, prr %lu, prt %lu\n",
lpm_time, cpu_time, rx_time, tx_time, prev_times.lpm_time, prev_times.cpu_time, prev_times.rx_time, prev_times.tx_time);
prev_times.lpm_time = lpm_time;
prev_times.cpu_time = cpu_time;
prev_times.rx_time = rx_time;
prev_times.tx_time = tx_time;
printf("Consumed energy: %ld\n", (int32_t) consumed_energy);
return consumed_energy;
}
另一个函数会定期调用该函数,每分钟调用一次。如果有多个线程使用非线程安全的库,则可以在Java或C中看到这一点。在这种情况下,有时你得到了正确的值,有时你得到了一半的正确值,有时你没有意义 如果您添加一个printf,例如System.out.printf()或任何IO或sleep(),或使用调试逐步完成代码,这会降低应用程序的速度,因此每个线程在库中花费的时间很小,从而间接避免冲突
您使用多线程吗?您正在调用的库/方法是线程安全的吗?是java还是C???@z̄̒ͪ̚我认为java没有
printf()
@aliants显示更多代码,这个片段非常小。症状指向内存损坏。@RobinHellemans肯定,但代码显然没有使用System.out
。啊,是的,我错了。因此,如果printf()没有给出任何编译器错误,这可能是C代码,我想我们可以合理地假设某个地方存在竞争条件。如果在prev_times
声明中使用的volatile
关键字的含义接近Java,我想说printf实际上改变了当前线程可见的prev_times
的值。@Lolovolatile
在C中意味着无法优化它。这并不意味着可见/安全。