Насколько я знаю, «функции времени» обычно зависят от платформы. Я использую Raspberry-Pi, поэтому моя ОС — Raspbian или Debian (linux).
Сначала я должен объяснить Зачем очень важно, чтобы я мог как можно точнее отложить выполнение программы до уровня точности десятки наносекунд. Я взаимодействую с АЦП (аналого-цифровой преобразователь). Важно, чтобы АЦП имел время для отправки логических сигналов ВЫСОКОГО или НИЗКОГО после отправки инструкций на устройство.
Например:
Одна строка данных управляет выводом «запрос преобразования». Этот вывод должен идти на низком логическом уровне в течение 20 нс, чтобы начать запрос на преобразование.
Другим примером является вывод «запрос на чтение». Эта строка данных должна иметь низкий логический уровень в течение 10 нс, чтобы активировать данные на выходной шине.
В настоящее время у меня есть программа, которая имеет следующую структуру: (Использование библиотек wiringPi.)
return_type functionName()
{
digitalWrite(CONVERT_RQ, LOW);
delayMicroseconds(1); // Part of the wiringPi.h library
digitalWrite(CONVERT_RQ, HIGH);
}
Я не думаю, что это безопасно удалить delayMicroseconds(1);
звоните, так как АЦП мог пропустить низкий логический импульс. (От digitalWrite
Я думаю, что контакты могут переключаться между высокими и низкими значениями на частоте около 200 кГц, хотя и не уверены в этом. РЕДАКТИРОВАТЬ: я имею в виду МГц
Задержка на 1 микросекунду, очевидно, довольно расточительна. Я хотел бы подождать 1% этого времени, в идеале.
Насколько я знаю, функция delayMicroseconds () фактически приостанавливает работу программы, а ОС переключается на выполнение другой задачи в ожидании. Это также не идеально, так как мы можем ждать 2 микросекунды, возможно, дольше. Переключение обратно на другой процесс будет бессмысленным, конечно, менее чем за 1 микросекунду. Не получилось бы много сделать за это время.
У кого-нибудь есть идеи о том, как это можно сделать?
Спасибо
Если у вас есть компилятор, совместимый с C ++ 11, вы можете проверить <chrono>
high_resolution_clock и занято ожиданием.
Я не знаю, как реализовано delayMicroseconds, но если вы не спите в программе, вы практически не контролируете процесс ее запуска. Также знайте, что ваш процесс может быть приостановлен в любом случае, как только операционная система «включится» для планирования работы.