[an error occurred while processing this directive] [an error occurred while processing this directive]
Ёщё одно западло от Микрософта
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Вовка 27 февраля 2002 г. 07:22

Напомню: обсуждалась проблема зависания ОС (у меня стоит Вынь98) при восстановлении регистров COM-порта. Вот чё тут обнаружил:
1. По регистрам читаются все единицы, когда читаешь не по тому адресу. Типа задан COM1, а COM2 несуществует, дык вот по COM2 одни единички и читаются.
2. Кроме регистров COM-порта писать приходится и в контроллер прерываний, чтобы их (прерывания) разрешить. И вот тут-то гноем и полито! Далее события расписаны по шагам:

<запуск программы>

a) общий запрет прерываний.
b) сохраняю старые регистры COM-порта (все его прерывания запрещены).
c) устанавливаю свои.
d) в контроллере прерываний разрешаю прерывания заданного IRQ.
e) общее разрешение прерываний.

далее крутится терминальная прога, и вот чё на этапе выхода:

a) общий запрет прерываний.
b) восстанавливаю старые регистры COM-порта (все его прерывания запрещены).
d) в контроллер прерываний пишу его старое значение маски, где прерывание заданного IRQ ЗАПРЕЩЕНЫ.
СРАЗУ ПОСЛЕ ЭТОЙ ЗАПИСИ В РЕГИСТРЕ +1 COM-порта ВСТАЁТ БИТИК "РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПРИЁМНИКУ"!!!
Какая сука это делает - можно только догадываться. Под ДОСей ЭТОГО не происходит.

Fix: надо СНАЧАЛА писать старую маску в контроллер прерываний, а ПОТОМ восстанавливать старые значения регистров COM-порта.

P.S. Господи! Какое у#бище это Intel и система команд его! Уму непостижимо! Зато 2 Гигагерца.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru