我遇到问题的代码是尝试将一个大的寄存器表写入挂在处理器上的i2c从设备。该表有大约200个寄存器设置。步骤是:
i2c_smbus_write_byte_data
设置页寄存器,然后再次使用i2c_smbus_write_byte_data
将数据写入实际寄存器。在我们的应用程序代码中,我们发现每隔一段时间(5个中有1个?)应用整个表失败。 i2c_smbus_write_byte_data
有时会失败,有时会失败。有时它在设置页面寄存器时失败,有时是在实际寄存器中写入数据。
i2c_smbus_write_byte_data
返回代码是-EIO。从设备上的故障寄存器指示“SMBus超时”。
奇怪的是,我有一个软件工具调用我公开的完全相同的API。在1000个周期内重复使用bash脚本(无延迟)同时运行此工具的两个实例不会产生任何错误。只有应用程序代码才能重现该问题。应用程序代码只运行一次,所以我认为它比压力测试脚本压力小得多。
我认为不同之处在于该工具以root用户权限运行,而应用程序代码的优先级较低?
所以我的问题是:
i2c_smbus_write_byte_data
?这意味着i2c事务已启动,但处理器执行其他操作,使从属设备挂起?谢谢,感谢任何帮助。