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



@SergeySerge11

Задача, есть генератор Сигнала, в идеале с частотой в МГц, то есть должен запускать 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 мс.
Как это можно реализовать?
Типа вечные циклы, или есть какие-то хитрости.
Какие есть идеи?


Решения вопроса 0


Ответы на вопрос 4



@mayton2019

Такие задачи обычно делают на языке Си и на микро-контроллерах или на хитрых операционках типа RTOS.

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



@oleg_ods

Операционные системы на которых работает C# не поддерживают Real Time взаимодействие.

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

Как написали выше Вам нужно смотреть в сторону RTOS и более низкоуровневых языков программирования. На настольных ОС такие задачи не решаются.



@Griboks Куратор тега C#

Вы неправильно понимаете суть генераторов сигнала. Он всего лишь периодически активирует схему. Вы не може изменять частоту генератора, потому что это физический прибор, а не программа. Тут есть два подхода:
1) если необходима работа в реальном времени, то используйте while(true) и проверяйте время шага (как в играх game loop/update time/delta time).
2) лучше всего дискретно моделировать процесс, а затем просто умножить количество шагов на шаг времени модели.



@firedragon

микроконтроллер?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *