Java 应用程序没有';如果我删除printf,则无法正常工作

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

我有一个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_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
的值。@Lolo
volatile
在C中意味着无法优化它。这并不意味着可见/安全。