Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Вниз

Аналог паскалевской port.   Найти похожие ветки 

 
Lamerr   (2003-05-28 11:50) [0]

Собственно, сабж...
Подскажите, пожалуйста. Смотрел в хелпе - не нашел.
Нужно обратиться к порту устройства. Ассемблер не знаю.


 
Palladin   (2003-05-28 11:52) [1]

Как же тебе подсказать того чего нет...


 
Smithson   (2003-05-28 11:53) [2]

в win32 прямого доступа к порту ты не получишь (не положено). Сделать это можно только из Ring0, сиреч из ОС или драйвера. Иди на msdn и ыщщы


 
Digitman   (2003-05-28 11:57) [3]

Зачем тебе это ?


 
Lamerr   (2003-05-28 12:03) [4]

to Digitman:
Ну надо мне, надо... С АЦП я работаю. А у нее драйвер дурацкий.

to All:
В общем понятно, а если я ассемблерные вставки сделаю?


 
MBo   (2003-05-28 13:14) [5]

в Win9x - можно (in, out)


 
Digitman   (2003-05-28 13:29) [6]


> Ассемблер не знаю.


и тут же


> я ассемблерные вставки сделаю


как сие понимать ?


> драйвер дурацкий


поясни


 
Lamerr   (2003-05-29 09:18) [7]

Извеняюсь за отсутствие. У меня лимит по времени...
Digitman:
Не знаю я, так позову того, кто знает :о)
А драйвер? Не могу с таймером карточки научиться работать.
Нужен точный отсчет времени в пределах микросекунд.


 
Anatoly Podgoretsky   (2003-05-29 09:22) [8]

Ассемблер не знаем, а пытаемся писать драйвер.
Но самое главное разочарование тебя ожитает в "точный отсчет времени в пределах микросекунд" - это Виндоус, поэтому забудь.


 
Lamerr   (2003-05-29 09:27) [9]

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


 
Anatoly Podgoretsky   (2003-05-29 09:39) [10]

Получение точного времени обеспечивает стандартная фукция Time, а отсчет (то есть измерение интервала) это совсем другое дело, тут не тебе будет Виндоус мешать.
Особо точные метки времени (но не отсчет) обеспечивает RDTSC в пикосекундах.


 
Lamerr   (2003-05-29 09:41) [11]

Анатолий, а можно поподробнее про RDTSC. Что это такое? Где про него можно почитать?


 
Anatoly Podgoretsky   (2003-05-29 09:52) [12]

Это ассемблерная комманда, почитать можно в описание процессоров Интел. Читает внутренний аппаратный счетчик, абсолютно точный, не зависящий ни от каких програм, даже если весь виндус висит, он все равно тикает Н тактов в секунду, (где Н равно частоте процессора), например для тактовой частоты 1 ггц будет 1 000 наносекунд на такт или 1 000 000 000 елиничек в секунду. Подчеркиваю точность абсолютная.
Но ты все равно ассемблер не уважаешь.


 
Lamerr   (2003-05-29 09:54) [13]

Так, нашел я про RDTSC.
Но для его использования надо знать точную частоту процессора и грузить его полностью. То есть при различной загруженности проца показания будут также различными. Или я не так понимаю? Подскажите, пожалуйста:о)


 
Lamerr   (2003-05-29 09:57) [14]


Последняя реплика послана до того как прочел ваш ответ...
Спасибо за информацию. То есть я просто могу прочитать содержимое этого счетчика и все. Одной командой. На ассемблере, разумеется. (я не говорил, что я его не уважаю, я говорил, что его не знаю. И это отнюдь не означает, что я не собираюсь его изучать. :о))


 
Digitman   (2003-05-29 10:06) [15]


> грузить его полностью


процессор всегда "полностью загружен", он никогда не стоит на месте.


> знать точную частоту процессора


достаточно точную частоту для твоих задач калибровки можно получить следующей ф-цией :

function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi : DWORD;
TimerLo : DWORD;
PriorityClass : Integer;
Priority : Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
DW 310Fh // rdtsc
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
Sleep(DelayTime);
asm
DW 310Fh // маш.код инструкции RDTSC
SUB EAX, TimerLo
SBB EDX, TimerHi
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
end;


 
Lamerr   (2003-05-29 10:09) [16]

Дело в том, что мне нужна МИКРОСЕКУНДНАЯ точность.
А как часто обновляется состояние этого регистра?


 
Lamerr   (2003-05-29 10:12) [17]

Ну или счетчика.
И почему тогда пределом точности времени, возвращаемым процедурой Time является 55 мсек?
Ведь можно читать RDTSC и определять ТОЧНОЕ время?


 
Digitman   (2003-05-29 10:32) [18]

ты ж вроде нашел описание инструкции ? ну так и читай ! Вникай !

цитирую фрагменты мануала в части ответов на твои вопросы
:

RDTSC—Read Time-Stamp Counter
Description
This instruction loads the current value of the processor’s time-stamp counter into the
EDX:EAX registers. The time-stamp counter is contained in a 64-bit MSR. The high-order 32
bits of the MSR are loaded into the EDX register, and the low-order 32 bits are loaded into the
EAX register. The processor increments the time-stamp counter MSR every clock cycle and
resets it to 0 whenever the processor is reset.
The time stamp disable (TSD) flag in register CR4 restricts the use of the RDTSC instruction.
When the TSD flag is clear, the RDTSC instruction can be executed at any privilege level; when
the flag is set, the instruction can only be executed at privilege level 0. The time-stamp counter
can also be read with the RDMSR instruction, when executing at privilege level 0.
The RDTSC instruction is not a serializing instruction. Thus, it does not necessarily wait until
all previous instructions have been executed before reading the counter. Similarly, subsequent
instructions may begin execution before the read operation is performed.
This instruction was introduced into the Intel Architecture in the Pentium ® processor.
Opcode Instruction Description
0F 31 RDTSC Read time-stamp counter into EDX:EAX


> как часто обновляется состояние этого регистра?


The processor increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset.


> почему тогда пределом точности времени, возвращаемым процедурой
> Time является 55 мсек?
> Ведь можно читать RDTSC и определять ТОЧНОЕ время?


This instruction was introduced into the Intel Architecture in the Pentium ® processor. (!!!!)


 
Lamerr   (2003-05-29 11:40) [19]

to Digitman:
С Time понятно.
А вот...
The processor increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset

Every clock cycle... Ну и как велик этот Every clock cycle?
55 мс? Или нет?
Кстати, какое отношение имеет GetTickCount к RDTSC? Никакого?

А описания инструкции я не находил. Попались лишь вещицы, проливающие свет на то, что это такое... Увы количества пролитого явно не достаточно. :-)

Вообще-то, мне не очень-то нравиться задавать вопросы, но...


 
Digitman   (2003-05-29 12:20) [20]


> Every clock cycle


это - период тактовой частоты процессора.
при заданной тактовой частоте (определенной с пом. вышеприведенной ф-ции и равной, скажем, 1 ГГц) ты можешь самостоятельно расчитать время между двумя "клоками"


> описания инструкции я не находил


искать подобные мануалы, думаю, следует в первую очередь в ресурсах первоисточника инф-ции, в дан.случае - на сайте Intel (там имеется оригинальный справочник по системе команд процессора в формате PDF)


> какое отношение имеет GetTickCount к RDTSC? Никакого?


напрямую - никакого.

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


p.s.

все же, imho, ты пошел не в том направлении

>Не могу с таймером карточки научиться работать.
>Нужен точный отсчет времени в пределах микросекунд.

Зачем он тебе-то нужен ? Этим занимается сам AЦП.
Обычная задача в таких случаях - периодически инициировать режим преобразования (прецизионность временных характеристик которого обеспечивается аппаратурой самого AЦП).
А тот самый микросекундный таймер, с которым драйвер якобы работает не должным образом, очевидно, доступен через порты ввода-вывода. Одновременно с работой драйвера, думаю, нельзя лезть в порт таймера - следует либо переписать драйвер либо отказаться от него, полностью программируя (от начала до конца) АЦП в своем приложении. Тем более что Маздай это с легкостью позволяет, достаточно лишь (с той же легкостью) получить 0-й уровень привелегий


 
Lamerr   (2003-05-29 12:33) [21]


> Зачем он тебе-то нужен ? Этим занимается сам AЦП.

Бьюсь второй день. Не хочет.

> Обычная задача в таких случаях - периодически инициировать
> режим преобразования (прецизионность временных характеристик
> которого обеспечивается аппаратурой самого AЦП).

Полностью согласен и рад бы не забивать голову себе и остальным.

> А тот самый микросекундный таймер, с которым драйвер якобы
> работает не должным образом, очевидно, доступен через порты
> ввода-вывода. Одновременно с работой драйвера, думаю, нельзя
> лезть в порт таймера

Подобные опасения и у меня есть... Но опыта маловато для того, чтобы быть полностью уверенным.

- следует либо переписать драйвер либо
> отказаться от него, полностью программируя (от начала до
> конца) АЦП в своем приложении. Тем более что Маздай это
> с легкостью позволяет, достаточно лишь (с той же легкостью)
> получить 0-й уровень привелегий

Переписывать драйвер - пупок развяжется. Там из него много чего юзается. И в принципе, все понятно, кроме того, как работать с таймером. :о)

Спасибо за помощь!



 
NightAngel   (2003-05-29 15:02) [22]

Lamerr © (29.05.03 11:40)

В PC-шке была микросхема -- таймер i8253. Он имел три канала: нулевой -- вырабатывал тики для часов, первый -- отвечал за регенерацию памяти, второй -- противно пищал в динамик.
Все три канала таймера были запитаны от единственного
генератора. Кварцевый генератор работал на частоте 14,31818 Мгц.
Затем эту частоту делили на три (= 4.77 МГц) и подавали на тактовый вход микропроцессора (i8088). Потом ее еще раз делили на 4 (= 1.19318 МГц) и подавали на входы всех трех таймеров.
Таймер устроен очень просто. Можно считать, что это три независимых 16-разрядных регистра (порта). В них записывается коэффициент деления. Таким образом, в нулевой канал записывали число 0х0000, в первый --0х0012, во второй -- 0х0528. После инициализации канала он начинал декрементироваться и по достижению нуля на выходе канала появлялся коротенький импульс. После чего канал (уже самостоятельно, без вмешательства программ) вновь инициализировался и т.о. весь процесс шел по кругу. Не трудно догадаться, что нулевой канал вырабатывал
импульсы с частотой равной 1.19318 МГц / 65536 = 19.5 Гц или каждые 55 мс. Отсюда и цифра 55 мс. А вот у первого канала на выходе стоял еще один счетный триггер, который делил частоту на два. Таким образом, получались почти 15 микросекундные импульсы.
Так вот, изюминка состоит в том, что программы могут не только инициализировать эти каналы, но и считывать их текущее состояние. Другими словами, если мы читаем из нулевого канала его состояние, потом произведем некоторые "действия", а затем еще раз считаем состояние канала, то вычислив разницу можно легко посчитать длительность этих "действий" -- частоту декремента канала мы ведь знаем -- 1.19 МГц. Здесь надо оговориться, что длительность измеряемых "действий" не должна превышать 55 мс. Все было бы хорошо, если б не прогресс. На современных компьютерах ставятся совершенно другие таймеры, которые работают с совершенно другими частотами. Я советую Вам, посмотреть функции: QueryPerformanceFrequency QueryPerformanceCounter которые как раз и работают с нулевым каналом таймера.

И ещё: в Win9х нам непосредственно доступна на запись IDT.

делаем следующее:
1.создаем свой обработчик прерываний от таймера.
2.вписываем его дескриптор на место стандартного.

что он должен делать:
I.инициализация:
1.определить с какой скоростью работает сейчас таймер.
2.перепрограмировать его на нужную скорость.
3.определить частоту процессора.

II.непосредственная работа.
1.сделать что нужно.
2.вызывать стандартный обработчик выравнивая задержками через RDTSC.

что следует иметь ввиду:
1.таймер железяка внешняя и ее частота вряд-ли больше 4 МГц.
2.чипсет тоже, он любит кэшировать запросы и работает в асинхронном режиме.

Удачи!


 
Lamerr   (2003-05-29 15:16) [23]

to NightAngel:
Спасибо, кое-что начинает проясняться...



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.008 c
14-33330
trotski
2003-07-22 00:13
2003.08.11
Программистская документация


1-33163
Pauk
2003-07-27 14:14
2003.08.11
Caption


14-33271
vidiv
2003-07-16 14:16
2003.08.11
Вопрос про фреймы в HTML


14-33325
Карелин Артем
2003-07-23 11:53
2003.08.11
Хочу фичу!!


1-33212
ossa
2003-07-29 11:02
2003.08.11
Какая функция нужна,чтоб проверить существует ли именно папка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский