2016-02-11 9 views
1

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

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

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

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

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

ответ

1

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

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

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