Обеспечение успешного взаимодействия между программой C ++ (цифровая обработка изображений) и программой обработки с использованием файла

ЗАДАЧА :- Для достижения последовательной связи между arduino и программа на C ++. Я использую обработку в качестве промежуточной программы, которая выполняет некоторую операцию над данными и затем последовательно передает эти значения в arduino!

У меня есть программа C ++, которая записывает данные в файл с регулярными интервалами, скажем, UFR,90,87 в файл каждые 30 миллисекунд. Записываемый файл выполняется в режиме усечения, т. Е. Файл перезаписывается каждые 30 мс.

Далее, есть код обработки, который должен извлечь это значение из файла, как только он будет записан. Сначала выполняется код C ++, а затем код обработки. Код обработки использует BufferedReader читать содержимое файла.

Как включить синхронизацию между двумя программами так, чтобы значение, только что написанное программой C ++, читалось одновременно (небольшая задержка, допустимо менее 5-10 мс) при обработке кода и была идеальная синхронизация? Там не должно быть никакого неправильного общения. Должен ли я установить какой-нибудь мьютекс-блокировку / семафор / что-то поверх файла между последовательными чтением / записью?

Кроме того, я запускаю программу C ++ из терминала и код обработки из IDE обработки (GUI). Используемая операционная система — Ubuntu 14.04 / CentOS 7 Linux.

ТАКЖЕ ПРЕДЛОЖЕНИЕ ТРЕБУЕТСЯ: — Кто-нибудь, пожалуйста, предложите мне лучший подход для установления прямой связи между Arduino и C ++ программой. Я смог успешно передать данные с прямым переносом, но не получил подтверждение от Arduino должным образом. Мы также должны получить подтверждение от arduino, который не может подтвердить, что данные были получены успешно. Я попытался отправить данные, используя экранный эмулятор GNU, но он не подтвердил полученные данные. Следовательно, мне пришлось использовать этот промежуточный подход с использованием Processing!

1

Решение

Если две программы должны быть запущены на таком этапе блокировки, и если постоянство данных не является обязательным требованием, возможно, следует изучить некоторые другие примитивы InterProcessCommunication (IPC) — такие как каналы, сокеты, сообщения, разделяемая память.

В вашем файловом подходе вы уже ответили на свой вопрос. Использовать семафоры; они достаточно просты. Ваш производитель проверяет, равен ли 0; если не ждать; производить; установить семафор; потребитель проверяет, равен ли он 1; если не ждет; потребляет; сбрасывает семафор.

Если вам нужно производить независимо от того, предыдущий или нет
производство было израсходовано или нет, используйте мьютексы; те, которые работают
перекрестный процесс. Lock — запись в файл — разблокировка; потребитель: блокировка — читать
— разблокировать.

Linux не является системой реального времени, поэтому нет никаких гарантий, что ваш потребитель будет разбужен в течение 5-10 мс после того, как потребитель закончил; НО 5-10 мс достаточно «долго»; А может и нет. Эта ветка предполагает, что временной интервал составляет порядка 100 мс — Как узнать временной интервал планировщика Linux?. Если это так, то вашему потребительскому потоку может потребоваться некоторое время, намного превышающее 5-10 мс, если сначала запланирован какой-либо другой поток. Установка высокого значения приоритета потока потребителя облегчит некоторые из этих проблем. Это гарантировало бы это — производитель производит, спит, ОС ищет следующую задачу, находит ваши потребительские задачи, которые теперь стали работоспособными и стоят на очень высоком уровне. На этом этапе пуристы скажут вам, что такой гарантии нет, и есть другие вещи в игре.

Сетевой поиск «проблема потребителя производителя» также даст вам массу других идей; большинство из них являются вариациями одной и той же основной идеи.

2

Другие решения


По вопросам рекламы [email protected]