По разному.
Да в мелкосерийных продуктах, требующих красивый интерфейс, зачастую в целях снижения себестоимости разработки - используют готовые компоненты на базе Андроида.
Например, у меня был заказ на разработку интерфейса для 3D-принтера, где решено было в качестве экрана и панели управления использовать простой планшет Android, который вклеивали внутрь корпуса принтера.
Также разумно использовать планшет как панель управления, скажем, для "умного дома" на небольших тиражах.
Даже автомобилестроители при их больших тиражах зачастую предпочитают решения на базе Android или WinCE для своих мультимедийных систем. Например, Андроид им нужен, чтобы не заморачиваться со стеком Bluetooth и заиметь сразу же готовый GUI.
Если же вопрос не стоит в организации графического интерфейса пользователя но нужен сетевой стек, то может использоваться Linux/BSD/пр.
Впрочем, Linux может использоваться и для GUI. Но для этого должны быть возможности:
Большая серия.
Или особые требования по энергопотреблению невысокому (Андроид, все же, сравнительно много кушает).
Если же полноценный сетевой стек не нужен, вывод на экран не нужен, однако при этом нужна очень большая экономия энергии (есть устройства, что от часовой батарейки работают годами, и даже умудряются передавать данные по радиоканалу) - тут используются специфические операционные системы, сшиваемы намертво с прикладной программой. Или без ОС вообще.
А еще бывают, что у управляемого оборудования есть жесточайшие требования по real-time.
Тогда может быть использована полноценная специализированная real-time ОС, способная подгружать модуля, так и операционная система намертво сшиваемая с прикладной программой (правильнее было бы назвать ОС в данном случае библиотекой для доступа к железу, но исторически повелось, что ее называют ОС). Иногда для жесткого real-time практикуют без ОС вообще.
Гуглите QNX, RTOS.
Или нужно писать программы для железа, чтобы они запускали программы на более высоких языках?
Языки высокого уровня - это все что не ассемблер.
На ассемблере в наше время нет особого резона программировать, кроме небольших кусков кода.
Например, тот же язык высокого уровня Си вполне себе дает уровень доступа к железу на уровне сопоставимом с ассемблером