Как процессор общается с последовательным устройством? - PullRequest
0 голосов
/ 22 марта 2020

Размещает ли внешняя схема информацию от последовательного устройства в известном месте в оперативной памяти для чтения процессором? Если так, то как? Какие микросхемы и микросхемы задействованы?

Могут ли данные, поступающие с последовательного устройства, вызвать прерывание процессора? Если так, то как? Опять же, какие микросхемы и микросхемы задействованы?

Например, я посмотрел на микросхемы, такие как ICL3221CAZ-T, которые, по-видимому, дают мне два контакта для подключения к моему последовательному устройству и два для внутреннего разговора. Похоже, они называются «TTL / CMOS-совместимыми входами передатчика». Используя простой процессор Intel 8086, как мне заставить эти вещи говорить?

Как все это связано со стандартным c входным потоком библиотеки?

1 Ответ

3 голосов
/ 22 марта 2020

Использование простого процессора Intel 8086 ...

Сначала некоторая справочная информация:

В принципе, это простой 8-разрядный процессор (например, 6502 или 6800) записывает значение 0x12 на адрес 0x3456, устанавливая 8 проводов «шины данных» в комбинацию, которая представляет число 0x12, и 16 проводов «адресной шины» в комбинацию, которая представляет номер 0x3456. Затем процессор выводит импульс напряжения на провод «записи». Когда ОЗУ получает этот импульс, оно записывает значение 0x12 на адрес 0x3456.

Чтение из ОЗУ работает аналогично: ЦП устанавливает только провода «адресной шины» и генерирует импульс на «чтение» провод. Затем ОЗУ устанавливает 8 проводов «шины данных» в комбинацию, которая представляет значение, хранящееся в адресе 0x3456.

Конечно, вы также можете подключить разные микросхемы к ЦП, поэтому, возможно, адреса от 0 до 0x3FFF являются ОЗУ и адреса от 0x4000 до 0x40FF являются последовательным устройством.

Процессоры ARM (как вы их найдете во многих мобильных телефонах или на Raspberry Pi) по-прежнему работают таким образом.

Обратите внимание, что 8086 не так прост, как вы думаете: он гораздо сложнее, чем процессоры 6800 или 6502!

x86 со специальным диапазоном адресов, который называется «порты ввода / вывода». С точки зрения программного обеспечения доступ к этому диапазону адресов осуществляется иначе, чем доступ к адресам в ОЗУ. Однако с точки зрения аппаратного обеспечения это не что иное, как другой диапазон адресов, и доступ к этим адресам работает так же, как доступ к адресам в оперативной памяти.

Какие схемы и микросхемы задействованы?

Прежде всего, у вас есть логика "чип выбора" c. Эта логика c состоит из простых логических элементов (таких как вентили AND или NOR), а также из более сложных логических схем c IC (таких как 74LS138). Задача этой логики c состоит в том, чтобы генерировать сигналы, которые "выбирают" определенную микросхему на основе адреса.

Пример: если адрес находится в диапазоне от 0 до 0x3FFF, логи c устанавливает провод, управляющий оперативной памятью до «низкого уровня»; в противном случае он устанавливает этот провод на «высокий». Если провод «высокий», ОЗУ знает, что передача данных предназначена для другого чипа.

Для последовательной передачи данных используется UART I C (например, 8250). Такой I C обычно охватывает диапазон адресов с несколькими адресами. Записывая значения в некоторые адреса, вы контролируете I C (например, скорость передачи). Записывая значения на определенный адрес, вы отправляете данные.

Эти микросхемы уже генерируют и получают последовательный сигнал.

К сожалению, эти микросхемы используют 0 В как «0» и 5 В как «1», но Стандарт RS-232 использует -9 В в качестве «1» и + 9 В в качестве «0».

«Приемопередатчик» (например, ICL3221CAZ-T) используется для преобразования последовательного сигнала 0 В / 5 В в + Последовательный сигнал 9В / -9В.

В современных компьютерах имеются более крупные микросхемы (например, «южный мост»), которые содержат функциональные возможности множества микросхем в ранних компьютерах.

Могут ли данные, поступающие с последовательного устройства, вызвать прерывание процессора? Если да, то как?

Это зависит от типа микросхемы UART и от того, как он подключен к ЦП.

В 8086 P C микросхема UART будет устанавливать выход «прерывания» до определенного напряжения. Это распознается «программируемым контроллером прерываний» (например, 8259). Затем этот чип отправит некоторые сигналы на процессор 8086; эти сигналы содержат информацию о том, какое прерывание (одно из последовательных I C) было инициировано.

Как все это связано со стандартным c входным потоком библиотеки?

Это зависит от того, как собран ваш компьютер. Если у вас есть компьютер, который не использует диапазон адресов «I / O port», вы можете получить доступ к микросхеме UART, напрямую записав какой-либо адрес. Пример:

*(unsigned short *)0x4003 = 0x13;

Это касается многих современных микроконтроллеров. Это было также стандартно для старых, не x86-совместимых компьютеров.

Если у вас есть P C, доступ к UART осуществляется с использованием диапазона адресов «I / O port», который требует специальных инструкций. Библиотека C для многих компиляторов MS-DOS, а также библиотека для ядра Linux имеют такие инструкции. Они не являются "стандартными C" функциями, но являются спецификациями ОС c.

Компиляторы для Windows не имеют этих инструкций, потому что Windows использует механизм защиты, который не позволяет программам обращаться к диапазон адресов «Порт ввода / вывода».

Если вы хотите написать операционную систему и хотите получить доступ к UART, вам, возможно, придется использовать ассемблер.

...