gpt4 book ai didi

c - Printf 干扰 I2C 模块值读取

转载 作者:行者123 更新时间:2023-11-30 16:39:52 25 4
gpt4 key购买 nike

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

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”以确保其闭合
  • 其他我们认为行不通也行不通的东西(例如在函数中移动 printf 调用、将其放在中间等)

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

此外,是的,从技术上讲我们不会遇到这个问题,但这不是修复,而是黑客行为。所以我正在寻找一个实际的解决方案。

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

最佳答案

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

关于c - Printf 干扰 I2C 模块值读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46912573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com