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