3

有没有人有在多个线程中使用多个 I2C 设备的示例?我的有点问题,这是其中之一,如果我单步运行,一切正常,如果我全速运行,一切都搞砸了——显然是比赛条件。i2C 流量实际上已经损坏(在我的逻辑分析仪上查看),这让我有点吃惊。我有点假设 I2C 操作将是原子的,但看起来情况并非如此。

我的应用程序使用温度传感器和电机控制器,它们都是 I2C 设备。温度探头正在计时器中进行采样,我认为它正在工作线程上运行。

我看到 I2C 流量的数据损坏,我认为可能发生的情况是两个线程都试图同时写入不同的从地址。

该文档对线程问题有点沉默,所以我不确定我应该在什么级别防止竞争条件。从我看到的问题来看,I2C 控制器一次只能执行一项操作,所以我必须在控制器级别进行保护。

我对如何解决这个问题有一些想法,但文档对线程要求有点沉默,所以我想在我走下一些死胡同之前,我想问问是否有人已经成功完成了它:)

4

2 回答 2

1

你有用于调度 I2C 操作的计时器吗?在这个线程之外创建一个 ConcurrentQueue 作为这个

ConcurrentQueue<string> commandsList = new ConcurrentQueue<string>();

当您想向 clinet 发送内容时,将命令添加到列表中。之后,在 I2C 的循环中,检查列表中是否有待处理的内容并发送。同时尝试从设备读取。如果它不起作用,请发送一些示例代码。

于 2016-02-12T09:17:09.190 回答
1

我围绕 i2c 控制器实例实现了一个基类(包装器)。每个 i2c 设备(地址)都派生自这个基类。在基类中,我添加了一个信号量(每个板载控制器的单例属性)来同步各种任务读/写调用。

与默认驱动程序配合得很好。对于 dmap 驱动程序模型(i2c 闪电),我使用锁定机制更改了信号量。不幸的是,闪电访问似乎没有提供与默认驱动程序模型相同的功能,或者可能对竞争条件更敏感。

HTH 洛伦佐

于 2018-05-29T21:40:34.810 回答