Printf干扰I2C模块值读取

时间:2017-10-24 14:03:13

标签: c printf embedded-linux i2c

有一个设备有一个i2c温度模块,可以读取处理器的温度。我们从i2c读取温度值,然后将其呈现给用户。函数内部的printf与i2c进程完全无关。这是功能:

endProcessFunction(int dummy){
    printf("App_host: Error Handler Started!!");

    App_sendEvent(APP_CMD_ERROR_COND);

    sleep(1);

    sendIpcMsg(some_signal,2,some_thread);

    appEndState = 1;
    syncRunning = 0;
    distRecRunning = 0;
    sem_post(&distRecSem);

    App_sendEvent(APP_CMD_APPHOST_FAIL);
}

现在,当我们从这个printf的末尾删除一个感叹号时,从i2c读取的值是正常的(大约35摄氏度)但是如果我们编译并运行两个感叹号,i2c将始终读取FFFF(最大16位整数值)。

我不确定发生了什么但是我们已经尝试了,

  • 禁用其他功能的某些printf调用(可疑堆大小问题)
  • "\n"末尾添加string以确保其已关闭
  • 我们认为无法工作的其他内容(例如在函数中移动printf调用,将其放在中间等等。)

要绝对清楚,此函数将停止其他线程所在的无限循环,并在此之后结束主线程。因此,只有在程序遇到无法恢复的问题时才会调用它。如果调用此函数,我们无法看到i2c的值读数。

另外,是的,我们在技术上没有遇到这个问题,但这不是一个修复,它是一个hackjob。所以我正在寻找一个实际的解决方案。

这仍然是堆大小问题(即使我们删除了程序中的其他printf调用)?还有什么我们可以尝试使用更长的字符串大小来工作吗?

1 个答案:

答案 0 :(得分:0)

这可能是时间问题,部分原因是不同平台上的I2C硬件实现不同。除了可能的软件错误之外,您还应该知道I2C主设备和从设备必须及时响应,看起来像printf()引入的一点延迟导致同步问题。当另一端没有足够快的响应时,就会发生这种情况。 printf()导致的延迟可能导致消息中止或数据不正确。当从器件没有响应时,通常会读取值0xFFFF,当从器件不发送任何内容时,总线将浮动到高电平。您应该能够通过检查低水平的实际read()操作的返回状态以及可能的示波器或逻辑分析仪来检测一些问题。