Я соглашаюсь, что необходимо узнать о компиляции M-x (свяжите ту и следующую ошибку M-x с коротким сочетанием клавиш).
Узнают о привязке для управления версиями (например, vc-diff, vc-next-action, и т.д.)
Изучают регистры. Не только можно помнить местоположения в буферах, но и целых конфигурациях окна (C-x r w - window-configuration-to-register).
Невозможно. Самый быстрый таймер, доступный в Windows, составляет 1 мс (1 кГц). Вам понадобится операционная система реального времени или выделенный контроллер. Даже в ОС реального времени ваш максимум обычно составляет около 20 кГц.
Я бы сказал, что это невозможно без написания собственного драйвера.
Однако, если вы написали свой собственный драйвер, вы могли бы использовать таймеры HPET (доступны не на всех машинах, но поставляются с большинством новых ) и, возможно, таймер APIC (не уверен, что это может дать вам 100 кГц) и получить оттуда 100 кГц .. Это довольно сложно, поэтому вам придется провести гораздо больше исследований.
Кроме того, настройте свое приложение в режиме реального времени должно помочь, даже если это приведет к чрезмерной загрузке процессора.
В последнее время я сам работал с маршрутизатором с ЧПУ, используя ядро Linux в реальном времени, проблема, которую вы видите, заключается в отсутствии вытеснения в реальном времени в Windows XP. Я не могу просматривать материалы Mach3 отсюда, но единственный способ, которым он должен работать, - это использовать драйвер "уровня ядра" в Windows. (извините, я не особо разбираюсь в Windows, поэтому не знаю подробностей). Написание какого-то драйвера для обхода модели вытеснения Windows по умолчанию - это ваш ответ, хотя я бы начал с того, что немного узнал о драйверах Windows и, возможно, посмотрел на исправления реального времени для ядра Linux для справки.
http: //www.kernel .org / pub / linux / kernel / projects / rt /
Основная проблема при использовании ПК для управления движением без специального оборудования - это скорость передачи данных различных выходов, встроенных в большинство ПК. Если у ваших клиентов нет бюджета на упомянутый вами высокопроизводительный контроллер движения, они просто не будут иметь доступа к сигналам 100 кГц.
Контроллеры ввода / вывода для каждого порта обеспечивают некоторую буферизацию, так что вы получите плавный результат. Это в значительной степени служит цели избавления программного обеспечения от необходимости «побитового взрыва» этих сигналов, а также делает частоту ввода-вывода более стабильной.
Обратной стороной является то, что буферизация, вероятно, приведет к некоторой задержке в системе, что может повлиять на работу схемы управления с обратной связью с управлением в программном обеспечении. Еще один недостаток - это ограничивает ваши варианты частоты. Одним из самых быстрых вариантов ввода-вывода на ПК, который не обеспечивает высокопроизводительное управление потоком, такое как USB или SATA, на самом деле является аудиопорт, но он ограничен 64 кГц или 44 кГц в большинстве систем.
Если вам подходит аудиопорт, то вам вообще не нужно беспокоиться о синхронизации. Просто убедитесь, что вы правильно установили частоту и генерируете сигнал, как и в противном случае.
Если вам нужно использовать цифровой сигнал, параллельный и последовательный порты работают аналогичным образом , но с меньшей максимальной скоростью.
РЕДАКТИРОВАТЬ Хм ... Кажется, параллельны порты работают немного быстрее, чем раньше. Машина с расширенным параллельным портом (EPP) может предоставить вам до 2 Мбит двоичной пропускной способности, что должно быть в пределах досягаемости вашей цели. Однако, из-за того, как работает параллельный интерфейс, скорость передачи данных зависит от периферийного устройства, а не от некоторой предопределенной скорости буфера. По сути, периферийное устройство подтверждает, что оно получило данные или что оно готово отправить данные для каждого переданного байта.
Это не так уж и плохо, потому что простое периферийное устройство с синхронизацией легко настроить.
Кроме того, данные не могут передаваться в обоих направлениях одновременно, данные, поступающие с периферийного устройства, вызовут блокировку потока данных от главного ПК. Возможный способ обойти это - просто организовать наличие двух параллельных портов или настроить периферийное устройство, чтобы ограничить свои собственные передачи данных каждым другим циклом.
Ввод-вывод на таком порту обычно управляется прерыванием. Помимо нескольких состояний ошибок, наиболее полезные прерывания генерируются, когда входной или выходной FIFO ' достигают определенного уровня. Вы можете использовать это прерывание для записи (или чтения) новых данных в порт. Порог может быть от 1 до 16 байт. Вам следует тщательно проверить (с помощью логического анализатора / осциллографа), что данные действительно передаются с ожидаемой скоростью с ожидаемой скоростью. Вы можете сделать это почти так же хорошо в программном обеспечении, используя QueryPerformanceCounter .
Хотя я подозреваю, что решение meomaxy - лучшее ...
Если вам нужна дифференциальная синхронизация с высоким разрешением, у Intel есть код здесь , который утверждает точность до наносекунды. . (Также есть хорошее обсуждение общих возможностей дифференциальной синхронизации).
Windows XP не является системой реального времени, и я не думаю, что есть способ гарантировать таймеры в диапазоне 10 микросекунд. Вы можете поискать в библиотеке Microsoft.Ccr.Core , я думаю, она самая близкая к вам.
Edit: Я нашел дополнительную информацию от Microsoft. Согласно статье базы знаний Как использовать QueryPerformanceCounter to Time Code ,
Function Units Resolution
---------------------------------------------------------------------------
Now, Time, Timer seconds 1 second
GetTickCount milliseconds approx. 10 ms
TimeGetTime milliseconds approx. 10 ms
QueryPerformanceCounter QueryPerformanceFrequency same
и это в контексте статьи, которая начинается с утверждения:
Когда код времени для идентификации узкие места производительности, вы хотите используйте таймер с самым высоким разрешением
Роберт Харви прав, QueryPerformanceFrequency находится в диапазоне десятков микросекунд, но я не думаю, что есть способ использовать его для точного запуска событий. Я думаю, что это полный перебор для программного решения. Вы смотрели на какие-нибудь чипы вроде Arduino, которые довольно дешевы? Судя по форуму Arduino , кажется, что точность в 10 микросекунд возможна.
Возможно, вы могли бы использовать что-нибудь из этого:
http://www.geisswerks.com/ryan/FAQS/timing.html
Ищите QueryPerformanceFrequency, но, возможно, другие решения может быть полезно.
Когда вы говорите «периодический таймер», я полагаю, вы имели в виду генератор импульсов?
Вы предлагаете таймер, который будет генерировать событие каждые 10 микросекунд? Я сомневаюсь, что вам стоит это делать.
Вы можете попробовать запрограммировать аудиовыход ПК и связать его с инструментом. Вам придется отключать / настраивать звуки ПК, пока ваш инструмент работает, чтобы предотвратить частоты, которые могут быть ложными для потока импульсов.
Рассматривали ли вы генератор импульсов USB? Или дешевая « звуковая карта USB », предназначенная для этой операции?
Лучшее, что вы можете сделать для синхронизации в Windows, - это QueryPerformanceFrequency / QueryPerformanceCounter . Самая низкая частота, которую я видел, составляет 1,1 МГц, так что это дает достаточную частоту.
Но даже с этим, как указывали другие ответы, это не сработает. Window не является операционной системой реального времени и не дает никаких гарантий времени. Невозможно убедиться, что ваш код выполняется каждые 1 мкс (для 100 кГц), поскольку Windows будет переключаться на другие процессы или код ядра.
Вам придется использовать какое-то внешнее аппаратное решение для получить такой срок.
С помощью QueryPerformanceCounter в цикле на текущих процессорах можно получить довольно близкий к 100 кГц опрос.
Например:
typedef void ( *CallbackProc )();
void PollAtKhz( int khz, CallbackProc const &Callback )
{
int hz = khz * 1000;
LARGE_INTEGER li;
QueryPerformanceFrequency( &li );
if( li.QuadPart < hz )
return;
__int64 diff = li.QuadPart / hz;
LARGE_INTEGER NextStop;
LARGE_INTEGER CurStop;
QueryPerformanceCounter( &NextStop );
NextStop.QuadPart += diff;
while( true )
{
QueryPerformanceCounter( &CurStop );
if( CurStop.QuadPart >= NextStop.QuadPart )
{
Callback();
QueryPerformanceCounter( &NextStop );
NextStop.QuadPart += diff;
}
}
}
В моем тесте я получил частоту примерно 92-98 кГц, используя этот код для тестирования:
void TestCallBack()
{
static int i = 0;
static time_t LastTime = time( NULL ) + 1;
++i;
if( time( NULL ) >= LastTime )
{
printf( "%d / sec\r\n", i );
LastTime = time( NULL ) + 1;
i = 0;
}
}
Очевидно, что этот код требует максимальной загрузки ЦП, поэтому для получения этих результатов необходима машина SMP . Кроме того, также помогает перенос приоритета процесса / потока в режим реального времени.
Что именно должен делать этот таймер? Если ему просто нужно выводить прямоугольный сигнал от 25 кГц до 100 кГц, вам понадобится дополнительное оборудование, но не возмутительно дорогое оборудование. Например, посмотрите на DT-340 из Data Translation. Он может работать даже быстрее, чем вам нужно, и я считаю, что он может даже вызвать прерывание. Или этот PCI 8255/8254 48 I / O .
Если вы можете позволить себе 500 долларов США или около того в вашем бюджете, должно быть множество вариантов оборудования. Фактическая микросхема программируемого таймера должна быть намного дешевле, поэтому, если вы хотите развернуть свою собственную схему и связать ее с компьютером, вы, вероятно, сможете сделать намного лучше, чем 500 долларов США.
Однажды я построил схему вокруг нее. микросхема программируемого интервального таймера Intel 8253, который использовался внутри оригинального IBM PC для генерации звуковых сигналов из внутреннего динамика. Он был подключен к кристаллу 1,193182 МГц и имеет делитель на 16 бит. Этот чип существует уже несколько десятилетий. Если вам нужно лучшее, я уверен, что с тех пор были внесены улучшения.
Когда я говорю, что чип 8253 (или 8254) внутри ПК используется для управления внутренним динамиком, я не завершаю. В Википедии есть еще много информации о Intel 8253 . Там объясняется, что выход 0 используется для генерации прерывания синхронизации, выход 1 используется для синхронизации обновления DRAM, а выход 2 используется для управления внутренним динамиком.
Первые два выхода синхронизации генерируют прерывания, что вы и хотите , но приведенное выше описание того, что в настоящее время делают эти выходы, должно дать вам некоторую паузу, чтобы отразить, что изменение их поведения, возможно, заставит Windows XP заметить. Третий выход на динамик в основном безвреден, но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.
Вероятно, Mach 3 использует Высокопроизводительный таймер событий (HPET), который, согласно здесь , является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.
«Прерывание таймера 2 ICH HPET может быть но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.
Вероятно, Mach 3 использует High Performance Event Timer (HPET), который согласно здесь является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.
«Прерывание таймера 2 ICH HPET может быть но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.
Вероятно, Mach 3 использует High Performance Event Timer (HPET), который согласно здесь является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.
«Прерывание таймера 2 ICH HPET может быть направлен к любому из следующих IRQ: 11, 20, 21, 22 и 23 через Регистр TIM2_CONF. (Примечание: это регистр называется TIM3_CONF в Intel® ICH5.) "
Для всех респондентов,
Я попытался дать понять, что я был не заинтересован в измерении прошедшего времени, но большинство ответов относились именно к этому.
По-видимому, я неадекватно передал свою точку зрения, поэтому я попробую еще раз. Я хочу создать событие, которое происходит 100, 000 раз за период времени в 1 секунду при стоимости ЦП примерно 12%.
Программа, на которую я ссылался, Mach 3, генерирует частоту 108000, когда пользователь выбрал 100000, но частота очень стабильна. Я упоминаю это, чтобы проиллюстрировать, что точность фактического временного интервала не критична до тех пор, пока ошибка временного интервала постоянна.
Я еще раз упомяну, что Mach 3 работает с затратами ЦП около 12%. Частота 108000 излучается на выводе параллельного порта, где ее можно проверить с помощью осциллографа, что я и сделал.
Другие респонденты в некоторой степени поняли, чего я хотел достичь, но их пример состоял в измерении количества циклов, которые могут возникнуть в период времени в 1 секунду при признании неприемлемости стоимости процессора.
По общему мнению, я м желающих сделать не возможно. Для тех, кто согласен с этим мнением, я бы посоветовал вам поискать в Google Mach 3 CNC , загрузить бесплатную копию программы и затем установить ее. Запустите программу, используйте вкладки, чтобы перейти на страницу диагностики, где вы сможете убедиться, что это действительно возможно. Программа сначала откроется, работая на частоте по умолчанию 25 кГц. Частоту можно изменить, открыв пункт меню «Конфигурация» / «Порты и контакты» /, затем выбрав новую частоту и повторно открыв программу.
На подобных форумах есть большое количество сообщений, относящихся к этой теме и ответы, по большей части, такие же, как и те, что я получил. Я привел пример, который ясно показывает, что это ВОЗМОЖНО, поэтому давайте разберемся, как Mach 3 выполняет эту задачу.
Alright, after reading the Mach 3 documentation (which is well-written, informative, and even funny), I think I see what is going on. First, realize that there is a difference between having a user-space event trigger at a high frequency and having a kernel interrupt routine. The kernel interrupt routine must be fast, and thus not contain very much logic, so normally we say that it's impossible to have a generalized call-back in your program that can respond to events at frequencies > 1 kHz. Furthermore, operating systems use the local timers for the schedule, which decides when user programs can run, and typically the scheduler speed is not more than 1 kHz, therefore it's impossible to write a user-space program that responds faster than this.
However, in this case, you don't need to have complex user-space logic responding at that speed, since the goal is only to modulate an output pin at a high frequency in order to produce a PWM signal. It might be feasible to create a kernel interrupt handler for the APIC which has high priority and is triggered at high frequency, if it only does very simple things such as toggling an output pin on the parallel port.
So, if you wish to do this, I suggest you read up on kernel programming and using the APIC, and you might be achieve something useful to you. However, some words of advice:
Finally, here are some documents you might find useful:
Не могли бы вы попробовать использовать что-то вроде IntervalZero's RTX. Это не бесплатно, это коммерческий продукт, он написан для введения в реальном времени в Windows (XP и т.д.) У него есть несколько очень быстрых таймеров. Согласно этой статье RTX имеет таймеры со значением 1 микросекунды (в то время как Windows это 1000 микросекунд)
Не уверен, что pricing\licensing похож на pricing\licensing. Я поболтал с оценочной версией.
Звучит так, как будто вам нужен 555 таймер (или кристалл), И ворота и параллельный порт (или цифровое устройство ввода/вывода USB). Вы можете подделать звуковую карту DSP, чтобы сделать что-то подобное, но я бы не стал ставить на это.
Любой таймер, который вы можете построить на окнах, которые будут работать на требуемой скорости, будет привязан к процессору. Дело не в том, что вычислительный процессор не может справиться с этим, но вы должны подумать об остальных движущихся частях вашего компьютера. Получить надежный сигнал 100 кГц от программной эмуляции до аппаратной сигнализации ввода/вывода на стандартном аппаратном обеспечении - задача достаточно сложная. Вы будете связывать ядро только для того, чтобы получить правильный шаблон сигнала.
Несколько вариантов могут заключаться в создании шлейфа обратной связи для последовательного порта, а затем воспроизведении битовых шаблонов и типов сигнализации для получения достаточно стабильного сигнала. Но вы будете гораздо лучше обслуживать либо построить или купить цифровую плату управления, которая сделана для управления станком с ЧПУ. Если вы посмотрите, большинство передач, связанных с этим станком 3 CNC относится к платам управления, которые берут USB, RS-232 или LPT портов.
(О, и говорить людям, что они ошибаются, вместо конструктивного комментария... тоже не выигрывает для вас ни один фанат)