@SergeySerge11

Как запустить задачу меньше чем за 1 мс?

Задача, есть генератор Сигнала, в идеале с частотой в МГц, то есть должен запускать Propagation распространение, меньше чем Task.Delay(1); Мало того что, цепь состоит из 10-200 элементов, и каждый из них должен иметь свою частоту, которая должна быть в 1 -200 раз больше .
К примеру Генератор запускает функцию раз в 0.6 миллисекунд. Уже меньше. Далее сигнал идет по цепи. Допустим Критический путь в схеме 6 элементов. Source -> 1 -> 2 -> 3 ->4 ->5 ->6
Частота должна элементов(если я верно теорию понимаю), должна быть в таком случае в 6 раз меньше частоты Генератора, то есть у каждого 0.6/6 = 0.1 мс. (Хотя оно может разное). То есть каждый элемент, запускает ф-ию распространения каждые 0.1 мс (Или как-то там раз в 0.6 но с офсетом 0.1)
Минимальное время паузы, задержки 1 мс.
Как это можно реализовать?
Типа вечные циклы, или есть какие-то хитрости.
Какие есть идеи?
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 5
mayton2019
@mayton2019
Bigdata Engineer
Такие задачи обычно делают на языке Си и на микро-контроллерах или на хитрых операционках типа RTOS.

C# с его уборкой мусора может внести в поток большие погрешности. Ну вобщем зависит сильно от задачи. Для игр должно хватать шарпов. Для чего-то серъезного скорее всего нет.
Ответ написан
@oleg_ods
Операционные системы на которых работает C# не поддерживают Real Time взаимодействие.

Методы Thread.Sleep(10)/Task.Delay(10) означают что задержка будет как минимум(!) 10 мс, но не дают никакой гарантии что задержка будет ровно 10 мс. То есть это значит что 10 мс поток будет бездействовать, а потом встанет в очередь за получением процессорного времени.

Как написали выше Вам нужно смотреть в сторону RTOS и более низкоуровневых языков программирования. На настольных ОС такие задачи не решаются.
Ответ написан
Комментировать
Griboks
@Griboks Куратор тега C#
Вы неправильно понимаете суть генераторов сигнала. Он всего лишь периодически активирует схему. Вы не може изменять частоту генератора, потому что это физический прибор, а не программа. Тут есть два подхода:
1) если необходима работа в реальном времени, то используйте while(true) и проверяйте время шага (как в играх game loop/update time/delta time).
2) лучше всего дискретно моделировать процесс, а затем просто умножить количество шагов на шаг времени модели.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
микроконтроллер?
Ответ написан
Комментировать
igolets
@igolets
Программист C#, MSSQL
Если есть задача запуска чего-то на настольном компе, то можно попробовать извернуться следующим образом:
  1. На C# написать прикладное ПО, которое взаимодействует с пользователем/БД/(нужное дописать)
  2. Через (например) USB/Serial port подключить плату с микроконтроллером
  3. На микроконтроллере (у него частота известна) запустить программу, которая, манипулируя NOPами, обеспечивает необходимые задержки. Точность, очевидно, будет очень высокая — половина такта процессора микроконтроллера (с учетом погрешности тактового генератора)
  4. Приложение на C# в нужные моменты посылает сигнал плате с микроконтроллером.


В этом случае будут неизбежные задержки отправки сигнала плате из приложения на C# (по причинам, указанным выше), но сама плата будет выдавать гарантированную частоту. Человек задержки на стороне C# не заметит, а оборудование, которому шлёт сигналы микроконтроллер, будет получать комфортную частоту сигнала.

Плату с микроконтроллером можно заменить на что-то, на чём запущена Realtime OS. Суть не сильно поменяется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы