|
Asm/C++/Delphi/Py/PHP/VBA
|
|
Залипание клавиш19.06.2018, 22:38. Показов 3065. Ответов 16
Метки нет (Все метки)
Продолжаю клавиатурную тему
![]() Есть прога, которая показывает нажатые клавиши (т.е. жмём все 4 стрелки – видим, что все 4 нажаты, отпускаем по одной, видим 3, 2, 1, 0). Так вот, если быстро стукнуть по нескольким клавишам (по тем же стрелкам, например), получаем генерацию IRQ 1 с нажатием 4-х клавиш и следом IRQ 1 с отпусканием... не всегда 4-х, а чаще 3-х или 2-х. Соответственно, 1 или 2 клавиши продолжают отображаться как нажатые. Причём, при запуске из-под винды (DOSBox, VMware+FreeDOS) такого нет, только в чистом DOS'е. Но тут есть один интересный момент. При таком же быстром ударе по Ctrl, Alt и Shift происходит то же самое (что неудивительно), при этом если я делаю это в каком-нибудь Volcov Commander, то вижу, что строка с помощью по функциональным клавишам остаётся в состоянии Shift или Alt, к примеру. Но! Если я нажму на букву, то эта буква будет воспроизведена как обычная буква, без Shift или Alt. Значит, BIOS каким-то образом понимает (в момент нажатия на букву, судя по всему), что Shift или Alt всё же отпущен. Как он это понимает?
1
|
|
| 19.06.2018, 22:38 | |
|
Ответы с готовыми решениями:
16
Написать программу включения выключения клавиш NumLock,CapsLock,ScrollLock,Ins нажатием клавиш f1,f2,f3,f4.
Залипание клавиш |
|
Эксперт Hardware
|
||
| 20.06.2018, 09:24 | ||
Сообщение было отмечено Mikl___ как решение
РешениеЗначит винда при своём запуске перенастраивает контроллёр клавы. Под чистым досом клава работает с настройками биоса - попробуй поиграться с ними, ..а точнее скоростью автоповтора.
1
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 20.06.2018, 11:40 [ТС] | |
|
R71MT, а причем тут автоповтор?
До автоповтора дело даже не доходит, я просто бью по клавишам, они нажимаются на сотые доли секунды. С какими настройками можно поиграться, кроме автоповтора? Добавлено через 2 минуты Вообще, всё это очень странно: как будто клава не успевает сгенерить сигнал или пропускает один из-за "одновременности" двух событий (нажатия и отпускания или отпускания 2-х клавиш).
1
|
|
|
Эксперт Hardware
|
||
| 20.06.2018, 13:54 | ||
|
1
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 21.06.2018, 13:59 [ТС] | |
|
R71MT, автоповтор же – это интервал между повторной генерацией IRQ 1 при удержании одной клавиши, так?
А здесь же речь о быстром нажатии и отпускании разных клавиш. Добавлено через 13 секунд Или может, я не совсем понимаю твою мысль...
1
|
|
|
Эксперт Hardware
|
|
| 21.06.2018, 14:31 | |
|
Jin X, посмотри int 16h, AX = 0305h.
у этой fn. BH = задержка, BL = частота. т.е. она выставляет именно задержку перед тем, как начинать повторять. если эта задержка стоит маленькая (диапазон у неё от 250 до 1000 мс), то при быстром печатании некоторые клавиши будут заикаться.
2
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
||
| 21.06.2018, 17:15 [ТС] | ||
|
Добавлено через 50 минут Странно, но ax=0305h не пашет почему-то, хотя в DOSBox работает... через порты пока не пробовал.
2
|
||
|
Эксперт Hardware
|
||||||
| 21.06.2018, 22:55 | ||||||
Сообщение было отмечено ФедосеевПавел как решение
Решение
..чтоб не плодить темы, опишу здесь некоторые детали работы подсистемы ввода,
которая состоит из трёх узлов - непосредственно клавиатура, контроллёр и процессор. Клава механически - это двумерная матрица строк и столбцов, точки пресечения которых играют роль кнопок. В "неактивном состоянии" на выводах и строк и столбцов присутствует логическая(1), а поступающий с внутреннего м/контроллёра строб, в непрерывном режиме сканирует каждую из строк логическим(0). При нажатии любой клавиши в момент строба, состояние соответствующего столбца меняется с высокого на низкий уровень, и адреса строки/столбца запоминаются в регистрах-защёлках м/контроллёра клавы. Периодичность опроса строк нулём, можно менять - это и есть параметр(ВН) функции автоповтора АХ=0305h INT16h - задержка перед автоповтором. Дальше, м/контроллёр клавы по последовательному транспорту DATA передаёт защёлкнутые строку/столбец нажатой клавиши на мат.плату контроллёру клавиатуры, принципиальная схема которого выглядит так: Получив байт по шине 'Keyboard', контроллёр клавиатуры генерит на линии(KeybINT) запрос на прерывание IRQ1, а сам в это время достатёт из своего ПЗУ/ROM соответствующий 'Scan-Code' нажатой клавиши и запоминает его в выходном DATA-буфере. После того-как APIC оповестит ЦП о прерывании, процессор считывает с шины '8-bit DATA-Bus' подготовленный скан-код и передаёт его по вектору INT-9h, обработчик которого отправляет скан в клавиатурный буфер - кому нужно, берут потом коды из этого буфера. Первые контроллёры(ХТ) собирались на м/схемах 8042, но начиная с процессоров i80282 эти чипы стали выпускать все-кому-не-лень. Сейчас КВС работают в двух режимах - устаревшем(АТ) и современном PS/2, который поддерживает как клаву, так и мышь (см.рис.выше). Помимо основных/своих обязанностей, они имеет 2-порта(А,В) и 3-регистра с базой(60h) в системной памяти. Порты служат для приёма/передачи данных, а регистры выстроены в порядке ниже: При работе с портами клавиатуры, открывается доступ к состоянию контроллёра и некоторым его настройкам. Так, при чтении с порта(60h) мы читаем байт непосредственно из 8-битного буфера самого контроллёра, а не то-что записал обработчик INT-9 в клавиатурный буфер в системной памяти. На данный момент м/схему КВС как отдельную сущность уже полностью выпилили из архитектуры мат.платы, и поместили её сперва внутрь ICH, а потом и системного хаба PCH в виде модуля SIO на шину LPC. Вот как его описывают в доках:
4
|
||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 26.06.2018, 14:00 | ||
|
1
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 26.06.2018, 14:24 [ТС] | |
|
Ethereal, в каком "главном цикле"?
И как можно определить, нажата ли конкретная клавиша, кроме как через "события" (int 9)? Элементарное нажатие стрелки генерит 2 или 4 вызова IRQ1 подряд, ты просто не успеешь прочитать их через какой бы то ни было цикл (хотя, повторюсь, не понимаю, о каком цикле, который может выполнять BIOS, ты говоришь) и соответственно определить – левая стрелка нажата или правая.
2
|
|
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||
| 26.06.2018, 14:51 | |||
Сообщение было отмечено Mikl___ как решение
Решение
Думаю дело происходит так : Волков перехватывает int 9 и внутри этого обработчика перерисовывает нижнюю строку с подсказками, если нажаты Ctrl или Shift. Поскольку это делается медленно, то внутри своего обработчика 9-го прерывания Волков прерывания разрешает, то есть разрешает вложенные прерывания, но чтобы одно и то-же не делалось дважды, свой обработчик прерывания засемафоривает. Думаю когда ты стучишь по клаве происходит именно вложенное прерывание - следующее прерывание int 9 происходит в тот момент, когда Волков обрабатывает предыдущее и перерисовывает нижнюю строку. Так-что прерывается обработчик прерывания у Волкова. В итоге для BIOS никакого пропуска нажатий нет (прерываний обработано два), а вот для Волкова как раз есть (обработано одно, а второе семафор не позволил, точнее оно обработано, только по этому поводу ничего в обработчике не делалось, т.е. оно было проигнорировано из-за того, что в содержательную часть обработчика семафор не пускает). В итоге Волков отжатие Shift или Ctrl проигнорировал, хотя BIOS об отжатии знает. Что и наблюдаем.
Добавлено через 2 минуты Добавлено через 1 минуту Добавлено через 10 минут З.Ы. Если бы я писал Волокава, то именно так бы и сделал. Как начал обрабатывать прерывание, так выставил бы семафор и разрешил прерывания и только по окончании обработки семафор сбросил. Если произошло вложенное прерывание, то проигнорировал бы его раз семафор выставлен. А такая организация просто предполагает игнорирование части прерываний от клавиатуры если в обработчике совершать длительные действия, а по клаве быстро-быстро стучать. А если делать без семафора, то будет еще хуже - двойное выполнение каких-то операций при вложенном прерывании и крах Волкова, если обработчик прерывания нереентерабелен. А писать реентерабельно ... да ну его, куда проще семафор поставить. Добавлено через 11 минут Короче, мысль такая - я предположил, что Волков не опрашивает клаву по int 16h, а обрабатывает int 9. И в итоге происходит такая петрушка, что я выше описал. По крайней мере предположение наблюдаемую картинку объясняет.
1
|
|||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 26.06.2018, 17:38 [ТС] | |
|
Я проверил сейчас.
В прогу, которая выводит постоянно скан-код (из порта 60h) я добавил постоянный вывод содержимого памяти 40h:17h (состояние shift-клавиш). Так вот, бью по Ctrl+Alt+Shift, там показывает залипание, т.е. будто какие-то клавиши нажаты. Нажимаю на любую другую клавишу (скажем, пробел), там появляется ноль. Так что это не глюк VC. Но как это работает, не понятно. Интересно, хоть BIOS трассируй ![]() А зачем Волкову вообще перехватывать int 9, когда можно просто читать в холостом цикле состояние shift-клавиш из BIOS Data Area (40h:17h) и всё?
2
|
|
|
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 852
|
||
| 27.06.2018, 17:43 | ||
|
1
|
||
|
Эксперт Hardware
|
||
| 27.06.2018, 18:54 | ||
|
Например AVPUtil имеет спец.функцию трассировки прерываний, но на скрине видно, что IRQ1 он сам-же и перехватил. Поэтому только дизассемблировать биос, а там ничего путного не увидишь, т.к. это просто статика - регистры не меняются:
1
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 27.06.2018, 18:55 [ТС] | |
|
Argogo, в те мохнатые годы (1994) мало кто заботился на эти темы (да и ноутбуков было мало).
Там всё равно холостой цикл крутится. Можно между опросами вставить hlt и всё, проблема решена.К тому же, это DOS, в которой энергосбережение как таковое отсутствует. Не буду утверждать (не трассировал), но наверняка даже функции ah=0/int 16h (BIOS) и ah=1/int 21h (DOS) тупо крутит цикл (безо всяких hlt) в ожидании нажатия на клавишу...
1
|
|
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 29.06.2018, 22:15 | ||
|
Ну а в итоге, я выше предложил рабочую гипотезу, она оказалась неверной. Пока у меня подозрение, что у JinX BIOS со странностями, но ... JinX, а интересно, а этот эффект под совершенно голым MS-DOS (без волчары) у тебя все равно наблюдается ?
2
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 30.06.2018, 10:46 [ТС] | |
|
1
|
|
| 30.06.2018, 10:46 | |
|
Помогаю со студенческими работами здесь
17
Залипание клавиш Залипание клавиш Залипание некоторых клавиш
Как откючить залипание клавиш? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|