在窗口 10 IoT 核心版的多线程应用中访问 I2C 设备的正确方法是什么

本文关键字:I2C 是什么 方法 访问 应用 IoT 窗口 核心 多线程 | 更新日期: 2023-09-27 18:34:11

有没有人有在多个线程中使用多个 I2C 设备的例子?我的问题有点问题,如果我一步走,它就可以正常工作,如果我全速运行,一切都会搞砸 - 显然是竞争条件。i2C流量实际上被损坏了(在我的逻辑分析仪上查看(,这让我有点惊讶。我有点假设I2C操作是原子的,但看起来情况不一定如此。

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

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

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

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

在窗口 10 IoT 核心版的多线程应用中访问 I2C 设备的正确方法是什么

您是否有用于在 I2C 上调度操作的计时器?在此线程之外创建一个并发队列,如下所示

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

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

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

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

呵洛伦佐