Спасибо за подсказку в ответе по Таймеру (использовать Поток). Шаг по времени получается чуть более 1 мсек, но не стабильный, что, собственно, и следовало ожидать. Можете ли попробовать применить API функцию GetProcessTime (говорят, у нее шаг 0,1 мксек), а еще лучше попробуйте добраться (ведь в Паскале есть встроенный Ассемблер) до счетчика машинных тактов. В этом случае можно получить шаг 1/частота процессора, т. е. порядка десятка наносекунд!
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
|
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Ну ассемблер это великая вещь конечно, но есть варианты и по проще с использованием всего одной WinAPI ф-ции, т.к. введу специальную компоненту. Можно вопрос: где вам понадобились такие малые промежутки времени?
|
|||
карма: 27 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
У меня есть спаянная еще в 80-у годы электроника с байтным управляющим входом и выходом в виде широтно-модулированного сигнала частотой 1 кГц. Управлял ей, ныне умерший, контроллер на серии К580 (функциональный аналог, а многие подозревают, что полный аналог, т.е. скопированный IBM-овской серии 8086). Длительность этих импульсов и нужно измерять с точностью 5% (лучше 0.5%), вот и получается необходимый шаг таймера 5-50 мксек.
|
|||
карма: 0 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Леонид, позвольте сделать замечание. То, что Вы описали называется задачей реального времени. А разработчики Виндов и не догадывались (судя по результатам), что такие задачи бывают. Наиболее реальное решение этого конфликта - промежуточный контроллер (как у Вас и было в случае 580-го). По сегодняшней технике с этим может справиться контроллер за ~1.5$ и помещающийся в корпус разъема, например, LPT. Иначе, по-моему, всю жизнь будете мучаться, даже если Dilma пересчитает тики процессора. (Извините, мне проще об этом рассуждать, потому-что делать такую нахлобучку умею).
|
|||
карма: 9 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Galkov-у: Да нет, железяка работает - я подал кварцованные 50 кГц на контает LTP в качестве опорного сигнала, но душа не выносит, когда машина крутится в цикле с какой может скоростью, щупая этот сигнал. Я и сам паял с 12 лет, но сейчас зрение село и, чтобы не размазать припой по плате, приходится смотреть через лупу. Спасибо за подсказку.
|
|||
карма: 0 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ничего себе!
У Вас что, винда никогда не просыпает 20мкс? |
|||
карма: 9 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Galkov-у В этом цикле за 10 мксек ~ 1-2 оборота; все остальное висит:
While ВходLTP(1) = ВходLTP(2) ......ВходLTP(1) = Inp(&H379) Wend Процессор P-IY, 2,4 ГГц (200МГц*12), Windows XP, приложение Excel, язык - VBA, анализ проскоков не делал, работает и слава богу. |
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Кстате, на работе пробовал подключать крейтовую систему через LPT порт под разные Windows, где опрос производился с максимально вохможным быстродействием и оказалось, что если вам нужна максимальная скорость, то лучше использовать ОС 98, там опрос порта в 2-3 раза выше.
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
У меня, по сравнению с Вашими аппаратами, просто "дредноут".
Но, при длительном анализе входных данных (типа сторою временной график), винда может отвлечься так милисекунд на 20 через один-две секунды. Доверять Биллу, даже на супермощных пнях - лучше застрелиться! |
|||
карма: 9 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Согласен на все 100%. Windows и понятие реального времени вещи не совместимые, проверенно на супер мощных пнях с двупроцессорными мамками.
|
|||
карма: 27 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Спасибо за LTP с байтным входом в версии 3.1! Там же увидел элемент Sleep с мксек и тиками - ну надо же! А если бы он обладал и свойствами Таймера, так этому элементу и цены не было (для меня)!
Какая API функция имеет такие возможности (мксек и тики)? |
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
QueryPerformanceCounter(tick);
tick - число тиков процессора с момента старта системы. Вообще если хотите быстро увидеть код компонента, жмите Ctrl+F в среде. А чтобы таймер сделать, ставте на его вход компонент Поток со свойством Delay=0. |
|||
карма: 27 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Мои познания API функций ~0 (а их порядка 10 000 шт), а на свой не продуманный вопрос получил соответствующий ответ. Не могли бы Вы поподробнее показать, что надо посылать и принимать от этой (QueryPerformanceCounter()) функции, что-то вроде:
Private Declare Function GetTickCount& Lib "kernel32.dll" () Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer) Тики в этом компоненте, к моему великому удивлению, оказались равными 1/2.4 ГГц, а не 1/200 МГц (процессор обозначен как 200МГц*12=2.4ГГц). Неужели это правда? |
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Private Declare Function QueryPerformanceCounter Lib "kernel32.dll" (ByVal Tick As Integer) As Integer
так по моему. Вообще в VB есть специальная утилита для вставки объявлений WinAPI в тект программы. Тики в этом компоненте, к моему великому удивлению, оказались равными 1/2.4 ГГц, а не 1/200 МГц (процессор обозначен как 200МГц*12=2.4ГГц). Неужели это правда?
Да. Функция возвращает именно число тиков процессора. А это значит на какой он реальной частоте работает, стока и будет прибавляться в секунду тиков. |
|||
карма: 27 |
|
14