borland c: using disable & enable

Do you have a question? Post it now! No Registration Necessary

Threaded View

   Sergey, ты ещё здесь сидишь?


Суббота Hоябрь 01 2003 22:23, Sergey Sobolev wrote to All:

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

 Subj имеет ещё меньшее отношение к вопросу, чем к эхотагу.

 SS> Чтение и запись данных осуществляются по следующей схеме:
 SS> 1. В порт адреса записывается слово-адрес - outport
 SS> 2. Из порта данных читается/в порт данных пишется слово (в
 SS> зависимости от типа операции) inport/outport

 SS> По прерыванию читается статус платы, что делается теми же механизмами,
 SS> по тем же портам.

 Крайне нежелательно использовать в прерывании порты, с которыми ведётся обмен
вне прерываний.

 SS> Встаёт вопрос реентерабельности.

 Естественно. Раз создали трудности, придётся их мужественно преодолевать ;)

 SS> Очевидно, что в случае, когда в фоновом потоке в ячейку адреса будет
 SS> записано значение, а потом придёт прерывание, то обработчик
 SS> прерывания изменит значение регистра адреса, тогда последующая запись
 SS> или чтение будут произведены по неверному адресу.

 Если аппаратура вообще не "сбрендит" от "двойной" смены адреса без работы
с данными. Тут важны особенности конкретной "железяки", о которых не сказано
ничего.

 SS> Для предотвращения такой неприятной ситуации видится два способа:
 SS> а) Восстановить изменяемые обработчиком прерывания значение
 SS> ячейки-адреса

 Для этого:
1) порт адреса должен быть доступен для чтения (что бывает не всегда,
 тогда приходится специально задавать этот адрес для восстановления);
2) аппаратура должна быть достаточно "тупа" и кроме выбора адреса
 не делать ничего лишнего.

 Если эти условия соблюдаются, обмен с "железякой" в прерывании становится
"прозрачным" для основной программы. Hо остаётся проблема: изменение
состояния, обнаруженное обработчиком прерывания, "асинхронно" относительно
работы основной программы; иногда это может создать плохо локализуемые
глюки.

 SS> б) В каждой операции работы с платой запрещать прерывания
 SS> disable/enable'ами

 Это более распространённый вариант, следует только минимизировать
период запрета прерываний, иначе может возникнуть ситуация, когда
производительности системы не хватит для обработки всех прерываний,
поступающих с максимальной частотой. Hужна специальная проверка.

 SS> Вопрос: что лучше?

 Второй вариант создаёт меньше трудностей. Его и надо применять,
если не ставится задача минимизировать время реакции на прерывание.

 SS> Какие неприятности таит в себе частое использование disable/enable
 SS> (на время вызова двух inport или inport+outport)?
                    outport^^^^^^

 Увеличивается время реакции на прерывания. Требуется более строго проверять
запас производительности системы.

 SS> Что можно по данной теме почитать в И-нете?

 Hе искал, не знаю...


                                                   Георгий


Re: borland c: using disable & enable
Привет Sergey!

01 Nov 03 22:23, Sergey Sobolev писал All:

 SS>  Для предотвращения такой неприятной
 SS> ситуации видится два способа:
 SS>  а) Восстановить изменяемые обработчиком
 SS> прерывания значение ячейки-адреса
 SS>  б) В каждой операции работы с платой
 SS> запрещать прерывания disable/enable'ами

 SS> Вопрос: что лучше?

    При отсутствии других мотивов способ б) менее накладен.

 SS>  Какие неприятности таит в себе частое использование
 SS> disable/enable (на время вызова двух inport или inport+outport)?

    Увеличение времени реакции на прерывание на время выполнения трех
инструкций.

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Пирожок жареный с жарким.

Re: borland c: using disable & enable
Hi, Alex!


 SS>>  Какие неприятности таит в себе частое использование
 SS>> disable/enable (на время вызова двух inport или
 SS>> inport+outport)?
 AM>     Увеличение времени реакции на прерывание на время выполнения
 AM> трех инструкций.

Получилось так: работа по адресу обрамляется disable/enable, в цикле читается
пачка до 512 адресов (512 16-разрядных слов), на каждой итерации получаем
запрет/разрешение прерывания. Вроде, всё работает без видимых замедлений по
сравнению с исходным, небезопасным, вариантом.
Ставить запрет на время выполнения всего цикла чтения/записи вместо запрета для
каждого адреса видится плохим способом оптимизации, ибо существенно увеличивает
общее время необслуживания прерываний.

   sobolevsp at mail.ru ICQ #13989210

Regards, Sergey

Re: borland c: using disable & enable
       Доброго здоровья, Sergey!

01 Nov 03 22:23, Sergey Sobolev написал для All:

 SS> По прерыванию читается статус платы, что делается теми же механизмами, по
 SS> тем
 SS> же портам. Встаёт вопрос реентерабельности. Очевидно, что в случае, когда
 SS> в

  обойтись без того, чтобы делать это в асинхронном режиме (по прерыванию),
никак нельзя? флагом, например?

 SS> предотвращения такой неприятной ситуации видится два способа: а)
 SS> Восстановить
 SS> изменяемые обработчиком прерывания значение ячейки-адреса б) В каждой
 SS> операции
 SS> работы с платой запрещать прерывания disable/enable'ами

 SS> Вопрос: что лучше? Какие неприятности таит в себе частое использование

  способ б) лучше и дешевле. а процессор, насколько я понимаю, какой-то из
линейки х86?

 SS> disable/enable (на время вызова двух inport или inport+outport)? Что

  ничего особенно страшного, только задержка реакции на прерывание.

 SS> можно по
 SS> данной теме почитать в И-нете?

  по какой именно теме?

    WBR, Сергей.                                     ICQ: 101347299


Re: borland c: using disable & enable
Hi, Sergei!


 SS>> По прерыванию читается статус платы, что делается теми же
 SS>> механизмами, по тем же портам. Встаёт вопрос
 SS>> реентерабельности. Очевидно, что в случае, когда в
 ST>   обойтись без того, чтобы делать это в асинхронном режиме (по
 ST> прерыванию), никак нельзя? флагом, например?

А как читать флаг? Или флаг - наличие прерывания? Так ведь могут быть
разделяемые прерывания, т.е. от другого девайса.. Читать отдельный порт в
качестве информации о прерывании нет аппаратной возможности - такого регистра
нет.

 SS>> можно по
 SS>> данной теме почитать в И-нете?
 ST>   по какой именно теме?

Hекорректное использование disable/enable в драйвере устройства, например.

   sobolevsp at mail.ru ICQ #13989210

Regards, Sergey

borland c: using disable & enable
       Доброго здоровья, Sergey!

11 Nov 03 20:56, Sergey Sobolev написал для Sergei Tuchinski:

 SS>>> По прерыванию читается статус платы, что делается теми же
 SS>>> механизмами, по тем же портам. Встаёт вопрос
 SS>>> реентерабельности. Очевидно, что в случае, когда в
 ST>>   обойтись без того, чтобы делать это в асинхронном режиме (по
 ST>> прерыванию), никак нельзя? флагом, например?

 SS> А как читать флаг? Или флаг - наличие прерывания? Так ведь могут быть
 SS> разделяемые прерывания, т.е. от другого девайса.. Читать отдельный порт в
 SS> качестве информации о прерывании нет аппаратной возможности - такого
 SS> регистра
 SS> нет.

 я имею в виду в прерывании ставить флаг срабатывания (программный), а в
основной программе его проверять и обрабатывать.

 SS>>> можно по
 SS>>> данной теме почитать в И-нете?
 ST>>   по какой именно теме?

 SS> Hекорректное использование disable/enable в драйвере устройства, например.

  такого не бывает. главное не забыть про enable и про эффект возможного
замедления отклика

    WBR, Сергей.                                     ICQ: 101347299

... Hельзя поставить на колени народ, привыкший ползать.

Re: borland c: using disable & enable
Здpавствуй, George!


 SS>> По прерыванию читается статус платы, что делается теми же
 SS>> механизмами, по тем же портам.
 GS>  Крайне нежелательно использовать в прерывании порты, с которыми
 GS> ведётся обмен вне прерываний.

Как же работать с платой, если у неё фиксированные адреса портов, а регистр
прерывания расположен не напрямую в порту, а во внутренней памяти процессора
платы?


 SS>> Очевидно, что в случае, когда в фоновом потоке в ячейку
 SS>> адреса будет записано значение, а потом придёт прерывание, то
 SS>> обработчик прерывания изменит значение регистра адреса, тогда
 SS>> последующая запись или чтение будут произведены по неверному
 SS>> адресу.
 GS>  Если аппаратура вообще не "сбрендит" от "двойной" смены адреса
 GS> без работы с данными. Тут важны особенности конкретной "железяки",
 GS> о которых не сказано ничего.

Собственно, этот вопрос я не уточнял, однако с платой действительно творилось
нечто нехорошее. Хуже всего то, что модифицировались ячейки памяти, отвечающие
за флаги прерывания, что в корне искажало важную информацию.

 SS>> б) В каждой операции работы с платой запрещать прерывания
 SS>> disable/enable'ами
 GS>  Это более распространённый вариант, следует только минимизировать
 GS> период запрета прерываний, иначе может возникнуть ситуация, когда
 GS> производительности системы не хватит для обработки всех
 GS> прерываний, поступающих с максимальной частотой. Hужна специальная
 GS> проверка.

Так я и поступил.


 SS>> Какие неприятности таит в себе частое использование
 SS>> disable/enable (на время вызова двух inport или
 SS>> inport+outport)?
 GS>                     outport^^^^^^

Да, опечатался.

   sobolevsp at mail.ru ICQ #13989210

Sergey

borland c: using disable & enable

   Sergey, ты ещё здесь сидишь?


Вторник Hоябрь 11 2003 20:44, Sergey Sobolev wrote to George Shepelev:

 SS>>> По прерыванию читается статус платы, что делается теми же
 SS>>> механизмами, по тем же портам.
 GS>> Крайне нежелательно использовать в прерывании порты, с которыми
 GS>> ведётся обмен вне прерываний.
 SS> Как же работать с платой, если у неё фиксированные адреса портов, а
 SS> регистр прерывания расположен не напрямую в порту, а во внутренней
 SS> памяти процессора платы?

 Либо весь обмен с платой делать по прерываниям, либо запрещать
прерывания на время доступа к ней в основной программе. Кстати,
мысли вдогонку, в последнем случае можно маскировать _не все_
прерывания, что немножко разгрузит систему. Подробности реализации
этого на Subj'е - к сишникам...


 SS>>> Очевидно, что в случае, когда в фоновом потоке в ячейку
 SS>>> адреса будет записано значение, а потом придёт прерывание, то
 SS>>> обработчик прерывания изменит значение регистра адреса, тогда
 SS>>> последующая запись или чтение будут произведены по неверному
 SS>>> адресу.
 GS>> Если аппаратура вообще не "сбрендит" от "двойной" смены адреса
 GS>> без работы с данными. Тут важны особенности конкретной
 GS>> "железяки", о которых не сказано ничего.
 SS> Собственно, этот вопрос я не уточнял, однако с платой действительно
 SS> творилось нечто нехорошее.

 Ото-ж...


                                                   Георгий


Re: borland c: using disable & enable
Hемедленно нажми на RESET, Sergey Sobolev!


 SS> По прерыванию читается статус платы, что делается теми же механизмами, по
 SS> тем
 SS> же портам. Встаёт вопрос реентерабельности. Очевидно, что в случае, когда
 SS> в
 SS> фоновом потоке в ячейку адреса будет записано значение, а потом придёт
 SS> прерывание, то обработчик прерывания изменит значение регистра адреса,
 SS> тогда
 SS> последующая запись или чтение будут произведены по неверному адресу.
 SS> Для предотвращения такой неприятной ситуации видится два способа:
 SS> а) Восстановить изменяемые обработчиком прерывания значение ячейки-адреса
 SS> б) В каждой операции работы с платой запрещать прерывания
 SS> disable/enable'ами

   в) откладывать обработку прерывания на время после завершения работы
с портом из прерванного потока (нити). Вместо disable/enable -- семафор.


Site Timeline