Каков правильный способ доступа к устройствам I2C в многопоточном приложении в Window 10 IoT Core?

У кого-нибудь есть пример использования нескольких устройств I2C в нескольких потоках? У меня есть небольшая проблема с моим, это одна из тех, где, если я делаю один шаг, все работает, а если я запускаю его на полной скорости, все портится - явно состояние гонки. Трафик i2C на самом деле искажается (как видно из моего логического анализатора), что меня немного удивило. Я как бы предполагал, что операции I2C будут атомарными, но похоже, что это не обязательно так.

В моем приложении используется датчик температуры и контроллер двигателя, оба устройства I2C. Датчик температуры измеряется таймером, который, я полагаю, работает в рабочем потоке.

Я вижу повреждение данных трафика I2C, я думаю, что может произойти то, что оба потока пытаются одновременно писать на разные подчиненные адреса.

В документации немного умалчивается о проблемах с многопоточностью, поэтому я не уверен, на каком уровне я должен защищаться от условий гонки. Из проблем, которые я вижу, похоже, что контроллер I2C может выполнять только одну операцию за раз, поэтому мне пришлось бы защищать на уровне контроллера.

У меня есть некоторые идеи о том, как подойти к этому, но документация немного умалчивает о требованиях к многопоточности, поэтому я решил спросить, сделал ли кто-нибудь это уже успешно, прежде чем я зайду в тупик :)


person Tim Long    schedule 11.02.2016    source источник


Ответы (2)


у вас есть таймер для планирования операций на I2C? Вне этого потока создайте ConcurrentQueue как этот

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

и когда вы хотите отправить что-то в clinet, добавьте команду в список. После, в цикле для I2C, проверьте, есть ли у вас что-то ожидающее в списке, и отправьте это. В то же время попробуйте прочитать с устройства. Если это не работает, отправьте пример кода.

person Dario Benevento    schedule 12.02.2016

Я реализовал базовый класс (оболочку) вокруг экземпляра контроллера i2c. Каждое устройство i2c (адрес) происходит от этого базового класса. В базовый класс я добавил семафор (одноэлементное свойство для каждого встроенного контроллера) для синхронизации различных вызовов чтения/записи задач.

Работает довольно хорошо с драйвером по умолчанию. Для модели драйвера dmap (i2c Lightning) я заменил семафор на механизм блокировки. К сожалению, Lightning Access, похоже, не предлагает те же функции, что и модель драйвера по умолчанию, или, возможно, более чувствителен к условиям гонки.

HTH Лоренцо

person LoxLox    schedule 29.05.2018