LINUX.ORG.RU

port I/O


0

0

Чем inb/outb в linux отличаются от аналогичных в dos? Проблема в том, что надо реализовать цикл ввода/вывода в lpt порт (т.е. непрерывную последовательность чтений). Под dos все читается за 1,5ms, в linux -3,5ms, многозадачность не причем поскольку код - часть RTAI kernel task (в составе модуля ядра естественно).

anonymous

Хм, это ты выполняешь ассемблерной командой или функцией? Потом процессор в PM и, может быть, поэтому возникает задержка.

krum
()

Я думаю, там какая-то проблема с замером времени - крайне маловероятно, чтобы инструкция В/В исполнялась 1.5 МИЛЛИсекунды.

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

tailgunner ★★★★★
()

>Чем inb/outb в linux отличаются от аналогичных в dos?

Порядком аргументов :)

Davidov ★★★★
()
Ответ на: комментарий от tailgunner

замер времени по осциллоскопу - там просто около тысячи чтений подряд (1.5us*1000).
Objdump выдает две строчки на месте outb как и положено...
Так что каким-то образом тормозит linux. хотелось бы понять каким

anonymous
()
Ответ на: комментарий от anonymous

> замер времени по осциллоскопу - там просто около тысячи чтений подряд (1.5us*1000).

т.е. одно чтение - 1.5 мкс, это же другое дело :) Может, дело в цикле? Вообще трудно понять, не видя цикла. Вопрос навскидку - какое значение CONFIG_HZ в Линуксе? Если 1000, то за время цикла проскакивает минимум одно прерываение.

Можно попробовать запретить прерывания перед циклом и замерить еще раз.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Я думаю, там какая-то проблема с замером времени - крайне маловероятно, чтобы инструкция В/В исполнялась 1.5 МИЛЛИсекунды.

Миллисекунды -- да, это нереально. А вот единицы микросекунд, против наносекунд для остальных команд -- реально.

Можно попробовать через RDTSC (когда в этом убогом ламуксе появится поддержка нормальных часов?) оценить время выполнения циклов чтения/записи и найти где порылась проблема.

fk0
()
Ответ на: комментарий от anonymous

> замер времени по осциллоскопу - там просто около тысячи чтений подряд (1.5us*1000).

Я даже не знаю и куда послать, но поверь наслово, инструкции ввода-вывода БЛОКИРУЮТСЯ (на уровне исполнения КОП в ЦПУ) до их завершения, а их длительность задаётся, я уж не знаю как в современной архитектуре ПЦ, но думаю как и прежде просто сигналом IORDY, вроде. Так вот 1.5 МИКРОСЕКУНДЫ это достатоочно мало для того, например, чтоб устаканились сигналы в принтерном кабеле. Без согласования сопротивления кабеля, источника и приёмника на обоих концах, без применения соответствующих выходных буферов в LPT НЕРЕАЛЬНО гонять данные с большей скоростью. И 1.5 миллисекунды -- вполне нормальная величина. Возможно, переключение порта из SPP в EPP/ECP режимы её несколько уменьшит... (в BIOS).

fk0
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.