В качестве примера: Построение Bare-Metal ARM систем с GNU
Многие встроенные системы не имеют достаточно ресурсов для полноценной ОС, некоторые могут использовать ядро планировщика или ОСРВ, другие кодируются как «голое железо». Точка входа main () C вводится после сброса. Для инициализации микропроцессора, для выполнения кода на C требуется лишь небольшое количество ассемблерного кода. Все, что требуется для запуска C, - это, как правило, стек - обычно просто инициализация указателя стека на определенный адрес. Также может потребоваться некоторая специфичная для процессора инициализация векторов прерываний / исключений, системных часов, контроллеров памяти и т. Д.
На настольном ПК, как правило, у вас есть BIOS, который выполняет базовую аппаратную инициализацию, такую как настройка и синхронизация контроллера SDRAM, а затем загрузку с загрузочного сектора диска, который затем, в свою очередь, загружает ОС. Любой из этого кода может быть написан на C (и, возможно, что-то из этого есть), и он может делать что-то кроме загрузки ОС - он может делать что угодно - это просто код.
ОС полезны для невыделенных вычислительных устройств, где конечный пользователь выбирает одну из множества программ для выполнения и, возможно, несколько одновременно. Большинство встроенных систем делают только одно: программное обеспечение часто загружается из ПЗУ или выполняется непосредственно из ПЗУ, никогда не изменяется и выполняется бесконечно (обычно останавливается только при отключении питания).
Конечно, вы все еще можете реализовывать драйверы устройств и тому подобное, но часто они являются неотъемлемой частью приложения, а не отдельной сущностью. Даже если вы используете ОСРВ во встроенной системе, она все равно является неотъемлемой частью вашего приложения, а не ОС в том смысле, в котором вы можете понять. В этих случаях ОСРВ является просто библиотекой, как и любая другая, и часто инициализируется и запускается из main (), а не наоборот, как вы могли ожидать.