Почему код совместим между материнскими платами?
Я уже собирал PCB для встроенных систем, используя микроконтроллеры, такие как stm32, stm32l, nRF51822, efm32g, большинство из которых используют arm cortex m3. И чтобы запрограммировать каждый из них, как правило, разные, то есть строка прерывания, используемая в одном микроконтроллере для gpio, не совпадает с используемой в другом, регистры для настройки одного не совпадают с другим, поэтому код, который я сделал для один не совместим с другим, потому что каждый микроконтроллер по-разному связывает свои периферийные устройства с процессором.
Я полагаю, что эквивалент микроконтроллера в архитектуре ПК является материнской платой, верно? Но как код, созданный для материнской платы (например, с использованием x86), совместим с другими материнскими платами? Есть ли стандарт? Все ли линии прерывания (связанные аппаратно) одинаково для всех материнских плат, предназначенных для работы под Windows или Linux? И порты ввода-вывода одинаковы? Интерфейс для изменения часов одинаков?
Обычно, когда я начинаю программировать код "без метала" (без ОС) для микроконтроллера, я получаю его технические данные, чтобы узнать, как я могу взаимодействовать с периферийными устройствами, существует ли единое справочное руководство для всех материнских плат?
Я был бы признателен, если бы кто-то мог указать мне некоторые ссылки на эту тему. Когда я ищу книги по компьютерной архитектуре, или они сосредоточены на дизайне ASIC процессора (набор инструкций, конвейеры, кеши и т. Д., Которые я уже знаю), или это действительно базовые вещи (например: что такое жесткий драйвер).
1 ответ
Я думаю, что короткий ответ - нет, материнские платы не совместимы с материнскими платами, созданными для разных архитектур. Компилятор и ядро ОС абстрагируют архитектурные различия, но само ядро ОС должно было быть закодировано для каждой архитектуры. В частности, часть ОС, которая зависит от конкретного оборудования, называется "драйвером" для этого конкретного оборудования, и ее необходимо было кодировать для каждой архитектуры.
При написании кода для ОС все обращения к оборудованию проходят через ядро ОС, которое знает, как осуществлять доступ к оборудованию для этой конкретной аппаратной архитектуры. Программы сами не делают никаких прерываний, но пусть ядро выполняет реальную работу.
Все, что программа и компилятор должны знать, - это как выполнить системный вызов в данной архитектуре и ОС и какой номер системного вызова идентифицирует API ОС.