Введение в архитектуру ввода/вывода встроенных систем
Пример встроенной системы X86
Современные компьютерные системы содержат иерархию шин. Каждая шина имеет различный набор компромиссов между шириной полосы пропускания и стоимостью. Шина процессора и памяти является шиной с самой широкой полосой пропускания и эти соединения могут иметь длину только в пару дюймов с некоторыми устройствами памяти. Мост шины используется для соединения сигналов одного типа шины с другим. Большинство систем имеют один или несколько мостов для преобразования сигналов из контактов процессора в шины, которые содержат устройства В/В.
Типичная аппаратная система совместимая с ПК, созданная для встроенных устройств с помощью Vortex86 System-on-a-chip (SoC) показана на рисунке 2.10. Устройство eBox 2300, которое будет использоваться в качестве целевого устройства для лабораторных проектов, использует Vortex86 SoC и содержит подмножество этого оборудования. Отметим, что единственная микросхема Vortex86 SoC содержит процессор X86 вместе с двумя микросхемами моста (северный мост и южный мост), которые имеются в ПК, который имеет как шину PCI, так и шину ISA.
Традиционный северный мост соединяется с контактами процессора и предоставляет шину памяти для соединения с SDRAM и шиной PCI. Микросхемы контроллера сети Ethernet соединяются с шиной PCI. Традиционный южный мост также соединяется с шиной PCI и предоставляет шину Low Pin Count (LPC), интерфейс BIOS ROM, и несколько других интерфейсов ПК для В/В. Шина только для материнских плат Low Pin Count (LPC), сгенерированная южным мостом, требует меньше контактов микросхемы, чем ISA, и использует частоту 33Mhz, но действует аналогично ISA в программном обеспечении. Более медленные унаследованные устройства соединяются с микросхемой южного моста. Микросхема SuperIO предоставляет совместимый с ПК интерфейс флоппи-диска, принтера и последовательного порта. Микросхема моста ISA предоставляет сигналы шины ISA для коннектора PC/104.
Методы передачи В/В
Большинство устройств В/В на порядки величин медленнее процессора. Линии квитирования устройства В/В должны использоваться для синхронизации каждой передачи данных В/В. Каждое устройство В/В задает линию квитирования оборудования (т.е., ввод готов, вывод готов), когда будет готово к передаче данных. Перед каждой новой передачей данных в порт данных устройств В/В, процессор или другое оборудование должно проверить, что устройство В/В готово, считывая и проверяя линию квитирования устройства. Биты линии квитирования обычно соединяются с другим портом В/В, называемым портом статуса. Обычно порт статуса устройства имеет следующий адрес В/В после порта данных В/В (это также экономит оборудование декодера адреса, так как оно может совместно использоваться несколькими последовательными адресами). Имеется три основных подхода, используемых для передачи данных в устройства В/В. Это программируемый В/В (называемый также опросным или программно управляемым В/В), управляемый прерываниями В/В, и прямой доступ к памяти (DMA). Каждый имеет слегка различное множество аппаратных/программных компромиссов и требований.
Передачи программно управляемого В/В
В программируемом В/В процессор должен прочитать и сравнить биты готовности В/В с правильным значением перед любой передачей данных. Это требует чтения порта статуса, маскирования бита готовности с помощью побитовой операции AND ("&" в C), проверки правильного значения бита готовности, и циклического повторения операций, пока устройство будет готово, как показано в примере 2.2.
// цикл пока готовность выхода =1 do { status = read_IO_port(status_port_IO_address); output_ready = status & 0x01; } while (output_ready == 0); // готово, поэтому выводим новое значение данных write_IO_port(data_port_IO_address, data_value);2.2. Псевдокод процедуры вывода программируемого В/В. Код программы должен постоянно циклически считывать порт статуса и ждать бит готовности выхода, прежде чем выводить новое значение данных
Когда устройство готово, процессор затем вводит или выводит значение данных на устройство В/В. Когда процессор считывает или записывает порт данных, линия квитирования обычно сбрасывается в ноль оборудованием.
Такой подход обычно ограничен простыми системами, имеющими только несколько устройств В/В, так как имеется значительная перегрузка процессора, который должен постоянно в программном обеспечении циклически проверять биты готовности всех устройств В/В. Во многих случаях это не позволяет также процессору переходить в режимы экономии энергии, что является важным фактором для работающих от батарей устройств. В мультизадачных ОС для В/В обычно используются другие методы, которые требуют меньшей нагрузки на процессор, и освобождают время процессора для выполнения других процессов.
Передачи В/В управляемого прерываниями
Для управляемого прерываниями В/В сигналы готовности В/В используются для генерации сигнала прерывания оборудования. Сигнал прерывания обычно останавливает процессор на следующий инструкции (при условии, что прерывания активированы), и процессор вызывает процедуру обслуживания прерывания (ISR). Эта процедура затем обрабатывает прерывание и возвращает управление, как показано на рисунке 2.11.
Рис. 2.11. Когда происходит прерывание, после окончания выполнения текущей инструкции, управление передается соответствующей процедуре обслуживания прерывания (ISR). ISR выполняет затем необходимые операции В/В, чтобы снять прерывание и переслать данные. ISR возвращает управление назад следующей инструкции в прерванном процессе, когда завершается. Чтобы сократить задержку прерывания, некоторые ISR могут запускать поток службы прерывания (IST) сразу перед возвратом, чтобы завершить некоторые задачи позже
Использование прерываний исключает циклы ожидания готовности В/В процессором, которые требуются в программном В/В. Процедура службы прерываний пересылает данные, снимает сигнал прерывания и возвращает управление. Процедуры прерываний должны вначале сохранить все регистры в стеке, обработать прерывание, восстановить значения регистров из стека, и затем вернуть управление в код, который был прерван, используя адрес возврата прерывания, хранящийся в стеке.
Таким образом ISR несколько напоминают подпрограммы тем, что сохраняют данные в стеке и используют адрес возврата из стека, но они вызываются сигналом прерывания оборудования, а не вызовом в программном обеспечении.
Специальное оборудование, называемое контроллером прерываний, используется для активации/деактивации и задания приоритетов нескольких сигналов прерываний. Многие процессоры имеют векторную систему прерываний. В случае векторных прерываний каждая отдельная линия сигнала аппаратного прерывания соединяется с различным адресом ISR. Когда происходит прерывание, процессоры X86 выполняют поиск в таблице адресов ISR в нижней области памяти и затем напрямую переходят к ISR. Меньшие номера прерываний обычно имеют более высокий приоритет (они могут даже прервать ISR прерывания с большим номеров). Присваивая более быстрые устройства прерываниям с меньшими номерами, можно задать приоритет более быстрым устройствам В/В. Сигналы прерываний можно использовать для более чем одного устройства, но в этом случае ISR должна будет проверять бит статуса, чтобы определить, какое устройство В/В необходимо обслужить.
Некоторые критически важные разделы кода (называемые нереентерабельными) могут требовать, чтобы прерывания были отключены. Большинство процессоров имеют машинную инструкцию для включения и отключения прерываний. Время задержки прерывания задается самой длинной инструкцией или самым длинным блоком кода, который отключает прерывания. RTOS создано для минимизации этого времени. Длительность времени выполнения ISR также критически важно. Во многих случаях ISR сохраняет данные, сбрасывает в ноль сигнал запроса прерывания, и возвращает управление сразу после запуска потока обслуживания прерывания (IST), который выполняется позже для завершения операции.
Время выполнения ISR определяет максимальное время ответа на прерывание, и является критически важным для минимизации в системах реального времени. Прерывания должны происходить с меньшей частотой (в среднем), чем время обслуживания ISR. Прерывания, которые происходят с большей частотой, могут быть потеряны, или они могут вызывать переполнение стека, если они происходят повторно с очень большой частотой.
Оборудование контроллера прерываний необходимо для задания приоритетов прерываний и включения/отключения каждого сигнала прерывания. Для прерываний нужны также дополнительные сигналы шины. Для сигналов прерываний используют на шине ISA линии IRQx, а на шине PCI линии INTx. По соображениям безопасности ОС должна контролировать все оборудование прерываний, таблицу вектора прерываний, и ISR. Многие драйверы устройств В/В управляются прерываниями.
Большинство компиляторов C/C++ имеют специальные функции для настройки ISR в ОС. Они автоматически сохраняют все регистры и правильно возвращают управление, используя адрес возврата прерывания в конце ISR. Обычно доступна еще одна функция для регистрации ISR в системе и настройки таблицы адресов ISR, необходимой для обслуживания прерывания и перехода к ISR. Процедуры ISR могут обычно использовать только небольшое ограниченное подмножество вызовов API ОС. Обычно предоставляются вызовы функций C для включения и отключения прерываний.