Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
x64b.pdf
Скачиваний:
72
Добавлен:
10.02.2015
Размер:
4.62 Mб
Скачать

Работа с последовательным интерфейсом UART

1)установка вектора аппаратного прерывания порта

2)установка вектора программного прерывания порта

3)настройка режима работы порта

Основные сведения

Асинхронный последовательный интерфейс (UART — Universal Asynchronous Receiver/Transmitter) реализуется в компьютере на логическом уровне микросхемой 8250 или совместимой с ней, реализующей логику последовательной передачи данных, а на физическом уровне представлен интерфейсом RS-232, отвечающим за конкретное представление сигналов конкретными уровнями напряжений и т. п. В x86 архитектуре предусматривалось наличие до 4-х последовательных портов (COM1..COM4). За этими портами

закреплены:

 

Название

Базовый порт

IRQ

COM1

3F8

 

4

COM2

2F8

3

COM3

3E8

4

COM4

2E8

3

(COM1 и COM3, а также COM2 и COM4 разделяют один запрос IRQ) При этом реализованы COM порты могут быть на микросхеме:

8250

пословная передача данных на скоростях до 9600 бод.

16450 максимальная скорость передачи до 115200 бод.

16550A добавлен встроенный 16-ти байтовый буфер

16750 размер буфера увеличен до 64 байт.

(В современных системах UART является частью общей микросхемы

южного моста, обычно совместимой с 16550А или 16750)

UART представлен 12 регистрами, отображаемыми на 8 портов

ввода-вывода:

 

 

Регистр

Порт

 

Операция

Примечания

THR

база+0

w

DLAB==0; Transmitter Holding Register

RBR

база+0

r

DLAB==0; Receiver Buffer Register

IER

база+1

r/w

DLAB==0; Interrupt Enable Register

DLL

база+0

r/w

DLAB==1; Divisor Latch Low Byte

DLH

база+1

r/w

DLAB==1; Divisor Latch High Byte

IIR

база+2

r

Interrupt Identification Register

FCR

база+2

w

FIFO Control Register

LCR

база+3

r/w

Line Control Register

MCR

база+4

r/w

Modem Control Register

LSR

база+5

r

Line Status Register

MSR

база+6

r

Modem Status Register

SR

база+7

r/w

Scratch Register (reserved)

Порты +0 и +1 отображаются на разные регистры в зависимости от значения бита DLAB регистра LCR; также отображение портов на регистры (+0: THR или RBR и +2: IIR или FCR) зависит от выполняемой операции.

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

Регистры RBR и THR используются в качестве входных и выходных буферов. Байт из THR на передающей стороне помещается во внутренний т.н. «регистр сдвига», откуда последовательно извлекаются отдельные биты и передаются по линии на принимающую сторону, где накапливаются также в регистре сдвига и, после сборки всего «слова» (в данном случае слово равно числу бит, передаваемых за один раз — 5, 6, 7 или 8), помещаются в RBR.

При настройке UART необходимо задать: размер слова (5..8 бит); число т.н. «стоп-битов» (1 или 1.5(2) бита), способ задания бита чётности, скорость передачи данных (от 50 до 115200 бод). Для этого используются регистры LCR и два 8-ми битовых регистра делителя частоты (DLL и

DLH; допустимо рассматривать их как один 16-ти битовый регистр DL).

7 6 5 4 3 2 1 0 Line Control Register (LCR); r/w; Порт: База+3

длина передаваемого слова 00: 5 бит; 01: 6 бит; 10: 7 бит и 11: 8 бит

0:1 стоп-бит; 1: 1.5 или 2 стоп-бита

000:без контроля чётности

001: дополнять до нечётного; 011: дополнять до чётного 100: бит чётности всегда 1; 111: бит чётности всегда 0 1: разрешено прерывать передачу

DLAB бит; 1: порты база+0 и база+1 отображены на DLL и DLH регистры

Большинство параметров задаётся записью требуемого значения в LCR, а делитель частоты DL (Divisor Latch) вычисляется как 115200/скорость_боды; для его задания надо сначала взвести в LCR бит DLAB (7), затем записать в регистры DLL и DLH младший и старший байты делителя,

потом DLAB бит следует очистить. Делается это примерно по такой схеме:

uint8_t fcr = inb( 0x3F8+3 );/* функция inb соответствует инструкции inb */

outb( 0x3F8+3,

fcr

| 0x80 );

/* функция outb - инструкции outb */

outw( 0x3F8, 115200/baud_rate );

/* функция outw - инструкции outw */

outb( 0x3F8+3,

fcr

);

 

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

7 6 5 4 3 2 1 0 Line Status Register (LSR); r/o; Порт: База+5

1: ошибка FIFO: был обрыв связи, ошибка чётности или фрейма 1: регистры передатчика (THR) и сдвига пусты

1: регистр передатчика (THR) уже пуст, но регистр сдвига ещё нет 1: ошибка, обрыв связи 1: ошибка, некорректный фрейм

1:ошибка, проверка чётности

1:ошибка, переполнение буфера

1: буфер приёмника (RBR) содержит данные

При передаче данных очередной байт можно записывать в THR, если в LSR а) взведён бит 2 (бит 1 взводится чуть позже, когда опустошается регистр сдвига) и б) не взведено ни одного

бита, сигнализирующего об ошибке:

 

 

while (0 == (0x7D & inb(0x3F8+5))) {}

/* ждём готовности*/

if (0 ==

(0x79 & inb(0x3F8+5))) outb(0x3F8, data);

/* передаём */

else ...

/* взведён бит, сигнализирующий об ошибке */

Чтение данных из RBR возможно тогда, когда в регистре LSR

В случае буферизованной (FIFO) передачи:

взведён бит 7:

- обработчик прерывания по поступлении данных в RBR или опустошения THR (т. е. значения

while (0 == (0xF9 & inb(0x3F8+5))) {} /* ждём данные*/

битов 3..1 регистра IIR 001 и 010) означает, что можно прочитать или записать не одно слово, а

if (0 == (0x79 & inb(0x3F8+5))) data=inb(0x3F8);

целую серию — надо ориентироваться на биты состояния LSR;

else ... /* взведён бит, сигнализирующий об ошибке */

- также посылается прерывание, если буфер FIFO за отведённое время был заполнен не

Операции ввода-вывода через UART можно, конечно, выполнять под

полностью (значение битов 3..1 равно 110), но он не пуст и возможно чтение. Возможность

полным управлением процессором, как рассмотрено выше, но

считывания из RBR очередного слова также определяется по битам регистра LSR (по сути

гораздо эффективнее использовать механизм прерываний, особенно обработка прерывания при значениях 010 и 110 совпадает, различается лишь реальное число

совместно с буферизацией потока данных, что позволит

 

 

 

прочитанных слов из RBR).

 

обмениваться между устройствами целыми «пачками» данных и

7 6 5 4 3 2 1 0

 

Interrupt Enable Register (IER); r/w; Порт: База+1 при DLAB=0

лишь затем кратковременно привлекать процессор для перемещения

 

 

 

 

 

 

 

 

 

 

 

1: разрешить прерывания при поступлении данных в буфер приёмника (RBR)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

накопленных данных между оперативной памятью и UART.

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить прерывания при опустошении буфера передатчика (THR)

 

 

 

 

 

 

 

 

 

 

 

Для включения прерываний используются регистры IER и IIR; С

 

 

 

 

 

 

 

 

 

 

 

1: разрешить прерывания при изменении состоянии линии (LSR)

 

 

 

 

 

 

 

 

 

 

 

помощью IER разрешается генерация прерываний UART'ом в

 

 

 

 

 

 

 

 

 

 

 

1: разрешить прерывания при изменении состояния модема (MSR)

 

 

 

 

 

 

 

 

 

 

 

определённых ситуациях. Одно и то же прерывание может быть

 

 

 

 

 

 

 

 

 

 

 

1: разрешить режим «спячки» (sleep mode, только для 16750)

 

 

 

 

 

 

 

 

 

 

 

послано разными COM-портами (IRQ 4, например, используется

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить режим малого потребления энергии (только для 16750)

 

 

 

 

 

 

 

 

 

 

 

COM1 и COM3), и событиями разного типа; чтобы точно выяснить

 

 

 

 

 

 

 

 

 

 

 

 

резерв

 

 

 

 

 

 

 

 

 

 

 

 

 

каким именно портом послан запрос прерывания и какое именно

 

 

 

 

 

 

 

 

 

 

 

 

 

Interrupt Identification Register (IIR); r/o; Порт: База+2

событие его вызвало надо анализировать регистр IIR.

 

 

 

7 6 5 4 3 2 1 0

Когда COM-порт посылает запрос прерывания, бит 0 его регистра IIR

 

 

 

 

 

 

 

 

 

 

0: ожидающий запрос; 1: нет запроса прерывания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обнуляется — так можно определить, какой именно порт послал

 

 

 

 

 

 

 

 

 

 

 

 

 

000: изменилось состояние модема; сброс выполняется чтением MSR

 

 

 

 

 

 

 

 

 

 

 

 

 

запрос. Далее, анализируя биты 3..1 регистра IIR можно выяснить

 

 

 

 

 

 

 

 

 

 

 

 

 

001: буфер передатчика пуст; сбрасывается записью в THR или чтением IIR

причину, по которой было послано прерывание:

 

 

 

 

 

 

 

 

 

 

 

 

 

010: буфер приёмника содержит данные; сбрасывается чтением RBR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

011: изменилось состоянии линии; сброс выполняется чтением LSR

uint8_tiir;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

uint8_rbase[] = { 0x3F8, 0x2F8, 0x3E8, 0x2E8 };

 

 

 

 

 

 

 

 

 

 

 

 

 

110: таймаут приёмника (FIFO не полон в буферизованном режиме)

 

 

 

 

 

 

 

 

 

 

 

 

 

unsigned

i;

 

 

 

 

 

 

 

 

 

 

 

 

 

резерв

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

for (i=0; i<4; i++ ) {

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешён 64-х байтовый FIFO (только для 16750)

 

 

 

 

 

 

 

 

 

 

 

 

 

iir = inb( base[i]+2 );

 

 

 

 

 

 

 

 

 

 

 

 

 

00: отключён режим буферизации (FIFO; для 16450 и более поздних)

 

 

 

 

 

 

 

 

 

 

 

 

 

if ( 0 == ( iir & 1 ) ) {

 

 

 

 

 

 

 

 

 

 

 

 

 

10: FIFO разрешён, но не действует (только 16550, не 16550А)

 

switch ( iir & 0xE ) {

 

 

 

 

 

 

 

 

 

 

 

 

 

11: FIFO разрешён и используется

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

case 0x2:

 

 

 

Для включения буферизованной передачи используется регистр FCR, младший бит которого

 

/* записываем очередную порцию */

управляет включением FIFO буфера, а старшие биты задают размер очереди и (для 16750)

 

break;

 

 

 

возможность использования 64-х байтового буфера.

 

case 0x4:

 

 

 

7 6 5 4 3 2 1 0

FIFO Control Register (FCR); w/o; Порт: База+2

 

case 0xC:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: включить FIFO; 0: выключить

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/* читаем */

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: очистить буфер приёмника (применяется при инициализации)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

break;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: очистить буфер передатчика (аналогично)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: выбор DMA (обычно не поддерживается)

break;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

резерв

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить 64-х байтовый буфер

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В случае пословной передачи без FIFO:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

размер FIFO буфера 00: 1 байт; 01: 4 байта; 10: 8 байт и 11: 16 байт

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- при поступлении очередного слова (5..8 бит) в RBR, когда возможно

 

 

 

 

 

 

 

 

 

 

 

 

 

(для FIFO-64 1, 16, 32 и 56 байт соответственно)

чтение этого слова без продолжительного ожидания (биты 3..1

 

 

 

Биты 2 и 1 регистра FCR используются при первоначальной настройке порта, чтобы очистить

регистра IIR имеют значение 010);

 

 

 

 

 

 

содержимое FIFO, если туда что-то уже успело попасть; это вполне может случиться, так как

- после передачи слова из THR в регистр сдвига, когда возможна

 

 

 

 

 

 

включение устройства на другой стороне линии могло выполниться гораздо раньше и оно уже

немедленная передача следующего слова (значение 001).

 

 

 

 

 

 

могло пытаться передать какие-либо данные..

 

 

 

 

 

Программирование контроллера DMA 8257/8237

В аппаратуре IBM PC имеется обычно несколько DMA-контроллеров; традиционно первый контроллер является 8ми разрядным, с максимальным обслуживаемым адресным пространством 1МБ, второй — 16ти разрядным, обслуживающим до 16МБ пространства. Более современные системы поддерживают 32х разрядные каналы, обслуживающие более 4ГБ адресного пространства.

Каждый контроллер поддерживает 4 канала, для каждого из которых выделяются регистры (порты) адреса, страницы и счетчика. Кроме этого каждый контроллер имеет еще несколько управляющих регистров.

8ми разрядный контроллер

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16ти разрядный контроллер

 

 

 

 

 

 

 

 

0x00, 0x01, 0x87 - базовый адрес, счетчик и страница канала 0

 

 

 

 

 

 

 

 

0xC0, 0xC2, ---- - базовый адрес, счетчик и страница канала 4 (0)

0x02, 0x03, 0x83 - базовый адрес, счетчик и страница канала 1

 

 

 

 

 

 

 

 

0xC4, 0xC6, 0x8B - базовый адрес, счетчик и страница канала 5 (1)

0x04, 0x05, 0x81 - базовый адрес, счетчик и страница канала 2

 

 

 

 

 

 

 

 

0xC8, 0xCA, 0x89 - базовый адрес, счетчик и страница канала 6 (2)

0x06, 0x07, 0x82 - базовый адрес, счетчик и страница канала 3

 

 

 

 

 

 

 

 

0xCB, 0xCD, 0x8A - базовый адрес, счетчик и страница канала 7 (3)

0x08 - w: управляющий регистр; r: регистр состояния

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xD0 - w: управляющий регистр; r: регистр состояния

 

 

 

 

 

0x09 - w: регистр запросов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xD2 - w: регистр запросов

 

 

 

 

 

 

 

 

 

 

 

0x0A - w: регистр индивидуальной маски

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xD4 - w: регистр индивидуальной маски

 

 

 

 

 

 

 

0x0B - w: регистр режима работы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xD6 - w: регистр режима работы

 

 

 

 

 

 

 

 

0x0C - w: любая операция записи сбрасывает защелку младшего/старшего байта

0xD8 - w: любая операция записи сбрасывает защелку младшего/старшего байта

0x0D - w: любая операция записи инициализирует контроллер

 

 

 

 

 

 

 

 

0xDA - w: любая операция записи инициализирует контроллер

 

 

0x0E - w: любая операция записи запрещает все каналы

 

 

 

 

 

 

 

 

 

 

 

 

 

0xDC - w: любая операция записи запрещает все каналы

 

 

 

 

 

0x0F - w: регистр групповой маски

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xDE - w: регистр групповой маски

 

 

 

 

 

 

 

 

63

 

 

52

 

32

 

24

 

 

 

20

 

16

 

 

 

 

0

 

 

 

63

 

 

52

 

 

 

32

 

24

20

 

16

 

 

0

 

 

 

 

 

 

 

 

-...-

3210FE...43210

FEDCBA98

 

 

 

76543210FEDCBA9876543210

 

 

 

 

-...-

3210FE...43210

FEDCBA98

 

76543210FEDCBA9876543210

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

 

 

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Управляющий регистр

 

 

 

Страница DMA

 

 

 

 

Адрес DMA

 

Регистр состояния

 

 

 

 

 

 

 

Страница DMA

 

 

 

Адрес DMA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 6 5 4 3 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 6 5 4 3 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить обмен память-память (канал 0 → канал 1); 0: не разрешать

 

 

 

 

 

 

 

 

 

1: канал 0 достиг терминального состояния; 0: не достиг

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить удержание адреса на канале 0; 0: не разрешать

 

 

 

 

 

 

 

 

 

 

1: канал 1 достиг терминального состояния; 0: не достиг

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: запрет контроллера; 0:нормальная работа

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: канал 2 достиг терминального состояния; 0: не достиг

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: ускоренный режим; 0: нормальный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: канал 3 достиг терминального состояния; 0: не достиг

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешить циклический сдвиг приоритетов; 0: не разрешать

 

 

 

 

 

 

 

 

 

 

1: канал 0 имеет ожидающий запрос; 0: не имеет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: нормальный режим записи; 1: расширенный режим

 

 

 

 

 

 

 

 

 

 

1: канал 1 имеет ожидающий запрос; 0: не имеет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чувствительность к уровню DRQ 1:высокий; 0:низкий

 

 

 

 

 

 

 

 

 

 

1: канал 2 имеет ожидающий запрос; 0: не имеет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чувствительность к уровню DACK 1:высокий; 0:низкий

 

 

 

 

 

 

 

 

 

 

1: канал 3 имеет ожидающий запрос; 0: не имеет

 

Регистр запросов

 

 

 

 

 

 

 

 

 

 

x x x x x 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Регистр индивидуальной маски

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

номер канала

 

 

 

 

 

 

 

 

 

 

 

 

 

x x x x x 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: установить запрос; 0: сбросить запрос

 

 

 

 

 

 

 

 

номер канала

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: запретить канал; 0: разрешить канал

 

 

 

 

 

 

 

 

Регистр групповой маски

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Инициализация DMA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x x x x 3 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: канал 0 разрешен; 1: запрещен

 

 

 

 

 

- инициализация контроллеров записью любого значения в порты 0x0D и 0xDA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: канал 1 разрешен; 1: запрещен

 

 

 

 

 

- включить каскадный режим с увеличением адресов и запретом автоинициализации канала 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: канал 2 разрешен; 1: запрещен

 

 

 

 

 

- сбросить маску (разрешить) канал 4 (каскадный)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: канал 3 разрешен; 1: запрещен

 

 

 

 

 

Программирование канала

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Регистр режима работы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- запрет канала

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 6 5 4 3 2 1 0

номер канала

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- сброс защелки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- задание адеса, страницы и счетчика (последовательно младший, затем старший байты)

 

 

 

 

 

 

 

 

 

 

операция: 00:verify; 01:write; 10:read; 11:запрещено- задание режима для канала

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1: разрешена автоматическая инициализация

- разрешение канала (иногда — посылка запроса)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0: увеличение адреса; 1: уменьшение адреса

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

режим: 00: по требованию; 01: единичный; 02: блочный; 11:каскадный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CPU #0

 

Счетчик тактовых импульсов

 

TSC (Time Stamp Counter)

 

mem:...FEE0 0000

#INTA #SMI #NMI #RESET #INTR

Local APIC #0

ex.82489DX

 

Локальный

 

APIC таймер

(ex.#NMI)

#LINT1

#LINT0

(ex.#INT)

CPU #1

 

Счетчик тактовых импульсов

 

TSC (Time Stamp Counter)

 

mem:...FEE0 0000

#INTA #SMI #NMI #RESET #INTR

Local APIC #1

ex.82489DX

 

Локальный

 

APIC таймер

(ex.#NMI)

#LINT1

#LINT0

(ex.#INT)

межпроцессорные прерывания

Шина контроллера прерываний

 

ША

ШД

ШУ

Прерывания в SMP системе; измерение времени

Функции измерения времени

Win32 API (Windows)

получение календарного времени

GetSystemTime

получение счетчика «тиков» таймера (8254)

(~10 мс) GetTickCount

«мультимедийный» таймер

timeBeginPeriod (выбор точности)

(~1..10 мс) timeGetTime timeEndPeriod

таймер высокого разрешения (TSC)

QueryPerformanceFrequency (~100нс) QueryPerformanceCounter

POSIX (Linux, UNIX и т.п.)

получение календарного времени gmtime

localtime

получение счетчика «тиков» таймера (8254) (~10 мс) clock (время работы процесса)

(~10 мс) times (с учетом простоя) таймеры высокого разрешения

(~1 мкс) gettimeofday (~<1 мкс) clock_gettime clock_getres

таймер высокого разрешения (TSC)

(~100 нс) __rdtsc (встроенная функция gcc)

RAM

CMOS

«Будильник» (Alarm Clock)

 

 

i/o mem: ...FEC0 0000

 

 

IO APIC

DMA

 

распределение IRQn

 

по локальным APIC

 

 

0: PIC mode

 

 

1: virtual wire mode (похож на 0)

 

 

2: symmetric I/O mode

 

 

 

(таблица перенаправления

 

 

запросов ввода-вывода)

Контроллер шины 1

IRQ n

Шина 2

Таймер 8254

Запросы прерываний от внешнего оборудования

Запросы

прерываний от внешнего оборудования

Шина 1 (PCI...)

Мост шины 2

1.19318 MHz

 

8031

 

 

 

PS/2

 

 

Other

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Host-to-PCI

PCI Bus #0

 

 

 

 

 

Keyboard

 

 

Mouse

 

 

Legacy

 

 

 

IRQ 3-7,9-11,14,15

 

 

 

PIRQ A-H

 

Bridge

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PIT

 

gate2.en

PS/2

 

 

 

PS/2

 

 

CMOS

 

Devices

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

COM1-4, LPT1-2,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

PCI-to-PCI

 

(8253/8254)

VLSI

 

 

 

 

RTC Alarm

 

 

 

 

 

 

 

 

 

 

 

 

PIRQ Mapping

 

PCI Bus #1

 

 

 

 

 

 

 

 

 

 

 

FDC, IDE,

 

 

 

 

 

 

 

 

 

 

 

 

 

Bridge

 

 

канал 0 #40

#61.0

(8042/8043)

 

 

 

Alarm)

 

SoundBlaster

 

 

 

 

 

 

 

 

 

 

 

 

(PIRQi → IRQj)

 

 

 

 

 

 

 

 

 

 

канал 1 #41

 

порт A #60

 

 

 

(ISA, EISA и др.

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ13 (PCI)

 

 

 

 

 

 

 

 

 

 

канал 2 #42

 

 

 

 

не-PCI устройства)

 

 

 

IRQ13 (EISA DMA changing)

 

IRQ13 (FPU)

 

 

 

AND

 

 

 

 

порт B #61

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

управление #43

 

 

 

 

 

 

 

IRQ12 (от PCI-устройства)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

порт D #63

 

 

 

 

 

 

 

 

 

 

OR

 

 

 

 

 

 

 

IGNNE# FERR# (CR0.NE==0) (для SMP д.б. 1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 1

0

 

 

порт D #64

 

 

 

OR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ12 (PS/2 Mouse или PCI)

 

 

 

BSP Boot Strap Processor

 

 

 

 

 

 

 

 

PS/2 Mouse

IRQ12

 

 

 

 

IRQ13

 

 

 

 

 

 

 

 

 

 

 

IRQ0/2 (PIT)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(CMOSIRQ8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(FPU,

 

AP

Application Processor

 

Резерв

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ1 (Keyboard)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DMA,

 

BSP...AP CPU

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PCI)

 

 

 

регистры

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#61.1 spk.en

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

АЛУ

 

 

 

 

 

 

 

 

3

4

5

6

7

 

 

9 10 11

14 15

 

 

 

 

3

4

 

5

6

7

9

10 11

14

15

 

 

Perf.MON

 

 

 

 

 

 

AND

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Sensor

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A B C D E F G

H

УУ

логические адреса

RESET# SMI# NMI# INTR#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTA#

 

PC Speaker

82C59

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

физические адреса

 

 

0

1

2

3

4

5

6

 

7

8

9

10 11 12 13 14 15

0

1

2

3

4

 

5

6

7

8

9

10 11 12 13 14 15 16 17 18 19 20 21 22 23

 

 

 

Local APIC (LAPIC)

PRST#

 

 

 

 

 

 

 

 

 

 

 

 

PSMI#

 

 

 

8259

 

 

 

порт #20

8259

 

порт #20

 

 

82093AA

 

 

 

 

(селектор) APICBASE

 

 

 

Timer ESR

 

 

PNMI#

 

 

 

PIC 0

 

 

 

порт #21

PIC 1

 

порт #21

 

 

IO APIC

 

 

 

 

 

 

 

ERROR# TIMER# PERF# THERM# LINT0# LINT1#

PINT#

OR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(окно) APICBASE+0x10

 

 

 

 

 

 

 

 

INTR# INTA#

 

 

 

 

INTR#

INTA#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AND

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtINTA#

INTA

 

 

 

 

 

 

 

 

 

 

 

 

 

intr# и IRQ0 IOAPIC

 

SouthBridge (Южный Мост)

 

 

 

 

 

 

 

#01

шестнадцатеричный

 

 

 

 

 

 

 

 

 

 

 

 

NorthBridge

 

 

 

(APICBASE: 0xFEC0xy00)

 

 

 

 

 

 

IMCR*

 

 

номер порта.

 

 

 

 

 

 

 

 

 

RAM

 

 

 

(Северный Мост)

 

 

i/o адрес 0xFEC0xy00

 

 

 

 

Вектор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

APICEN

 

abc#

название сигнала.

 

 

 

 

 

 

 

 

 

 

 

 

 

i/o адрес 0xFEC0xy10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x123 физический адрес

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( x [0..F]; y [0,4,8,C] )

 

 

 

 

 

INIT#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTR#

NMI# ICC

INTA#

 

 

или смещение.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(BUS cycles)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NMI#

 

 

 

FSB

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTR#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INIT#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ICC

 

* - IMCR (Interrupt Mode Control Register) изображён для случая внешнего LAPIC 80489DX (0x70 → #22; 0|1 → #23).

 

 

 

 

 

 

PIC Mode:

 

 

IRQi# → PIC → intr# → BSP CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC

 

 

 

 

 

 

 

 

 

 

 

Virtual Wire Mode A: IRQi# → PIC → intr# → lint0 BSP LAPIC → pint# → BSP CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC

 

 

 

 

 

 

 

 

Virtual Wire Mode B: IRQi# → PIC → IRQ0# IOAPIC → Шина ICC (сообщ. типа ExtINT) → BSP/AP LAPIC → pint# → CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC

 

 

Symmetric Mode:

 

IRQi# → IOAPIC → Шина ICC (сообщ. с вектором) → BSP/AP LAPIC → pint# → CPU → inta# → LAPIC → вектор → CPU → ... → EOI/LAPIC → Шина ICC → EOI/IOAPIC

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]