Как запустить цикл с определенной скоростью в C (в эмуляции)

Это работает для меня:

SELECT
    h.step_id,
    CAST(j.[name] AS VARCHAR) as JobName,
    h.step_name,
    -- CAST(stuff(stuff(right('0000000' + h.run_time, 6), 5, 0, ':'), 3, 0, ':') as time)
     (h.run_time / 1000000) % 100 as hour,
       (h.run_time / 10000) % 100 as minute,
       (h.run_time / 100) % 100 as second,
       (h.run_time % 100) * 10 as millisecond,
       dateadd(hour, (h.run_time / 1000000) % 100, dateadd(minute, (h.run_time / 10000) % 100, dateadd(second, (h.run_time / 100) % 100, dateadd(millisecond, (h.run_time % 100) * 10, cast('00:00:00' as time(2)))))) 
FROM
    msdb.dbo.sysjobs j 
    INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id 

Btw, CAST приводит к ошибке для меня, а также

Если вы не хотите использовать оператор select:

DECLARE @run_time INT
DECLARE @time_result TIME

SET @run_time = '120609'

SET @time_result = dateadd(hour, (@run_time / 1000000) % 100, dateadd(minute, (@run_time / 10000) % 100, dateadd(second, (@run_time / 100) % 100, dateadd(millisecond, (@run_time % 100) * 10, cast('00:00:00' as time(2)))))) 

select @time_result
1
задан beeselmane 19 January 2019 в 06:04
поделиться

4 ответа

Это будет трудно получить точную, потому что OS X не является системой реального времени. Если абсолютная точность не требуется, я бы использовал интервальный таймер, который истекает каждые 1/n, например, со скоростью «n в секунду», а затем выполните tick в обработчике срока действия.

Отправной точкой будет POSIX setitimer() и вызов tick в обработчике сигналов

0
ответ дан Stefan Becker 19 January 2019 в 06:04
поделиться

Использование clock_gettime() и nanosleep() - путь. Какой-то другой механизм, вызывающий вашу функцию периодически, будет определенно медленнее. Вы можете даже рассмотреть циклы и счетчики циклов вместо использования nanosleep(). Рассмотрим некоторые цифры:

При частоте 1 МГц ваша функция должна работать 1 микросекунду. На частоте 10 МГц ваша функция должна работать 100 наносекунд.

Некоторые экспериментальные данные о времени системных вызовов и переключениях контекста: https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html [ 113]

Так что это выглядит как более 50 наносекунд для системного вызова и более микросекунды для переключения контекста. Некоторые другие вещи, вызывающие вашу функцию, помимо вашего собственного кода в том же процессе, вероятно, займут «слишком много времени».

0
ответ дан Pierce 19 January 2019 в 06:04
поделиться

Боюсь, что очень сложно (или даже невозможно) архивировать в размещенной системе, если операционная система не в реальном времени. OS X не является системой реального времени, и ваши временные параметры будут довольно «случайными», так как ваше приложение будет получать время выполнения системным планировщиком, и оно не будет контролировать выполнение ЦП.

Время переключения контекста и задержка не будут основными проблемами здесь.

Если вы эмулируете поведение целевой системы, вам нужно также связать время выполнения инструкций целевой системы и во время выполнения эмулятора (в соответствии с текущим прошедшим временем) изменить скорость, с которой эмулируются целевые инструкции

0
ответ дан P__J__ 19 January 2019 в 06:04
поделиться

Времена на не-RTOS довольно нестабильны, из-за других задач, входящих в системный планировщик и так далее. Представьте, что если во время эмуляции вы откроете окно веб-браузера, все ваши настройки исчезнут.

Так что, может быть, вы могли бы использовать другой подход: не полагайтесь на время вашей системы, но используйте также эмулированное время.

Так как вы эмулируете также ядро, обрабатывая все инструкции, вы знаете, сколько инструкций вы выполнили, поэтому вы можете сосчитать фактические такты, которые выполнила ваша эмулированная система. Затем вы можете использовать эти метки для расчета времени в вашей системе, обновления любого прерывания аппаратного таймера, которое вы можете эмулировать, и так ...

Будет ли одна конкретная функция быстрее, чем в реальной жизни? Не имеет значения, ваша система будет знать, что XX тиков прошло, и выполнит любые прерывания или что-нибудь на этом основании.

При таком подходе реальная секунда не будет равна симулированной секунде, но ваша эмуляция будет всегда одинаковой, независимо от других приложений или проблем системного планирования.

Кроме того, если вы хотите синхронизироваться с реальным временем, вы можете время от времени (т.е. после выполнения любого возврата из функции или из исключения) синхронизировать свои тики с реальным временем, просто остановив выполнение следующая инструкция.

Наконец, взгляните на этот вопрос , так как они дают много информации об эмуляции, которую стоит прочитать. В частности, мой описанный выше подход будет соответствовать подходу «интерпретации», описанному по этой ссылке.

0
ответ дан LoPiTaL 19 January 2019 в 06:04
поделиться
Другие вопросы по тегам:

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