Без сомнения, требуется опыт или хотя бы значительное понимание цифровой электроники и компьютерной инженерии низкого уровня. Вам нужно будет уметь читать спецификации устройств и понимать их. Прицелы, мультиметры, логические анализаторы и т. Д. Являются инструментами торговли.
C используется в основном, но языки более высокого уровня постепенно проникают внутрь.
Вы захотите хорошо освоиться с C и хорошо разбираться в ассемблере. В системах / встроенных обычно вы работаете с небольшим объемом памяти и более медленными процессорами, поэтому вам нужно понимать, как разумно использовать ограниченные ресурсы.
Если вы увлекаетесь этим в качестве хобби, возьмите в руки доску gumstix или arduino, эти платы для разработчиков подарят вам сотни часов обучения и веселья.
Если вы пытаетесь сделать карьеру в этом направлении, найдите работу, где проекты кажутся интересными, и вы запачкаете руки. Возьмите каждую задачу, которая встречается на вашем пути, и спросите себя, как вы можете добиться большего и извлечь уроки из этой задачи.
В любом случае, получайте удовольствие и счастливого кодирования!
VHDL, Verilog и FPGA также являются серьезными игроками на этой арене. Имея хороший опыт в CS, много приверженности и, возможно, немного MIT OpenCourseware, вы сможете сделать что-то хорошее. Хорошее знание архитектур ЦП и некоторых ASM тоже пригодится.
Вы должны принять ограничения и уметь работать с ними:
Наградой является глубокое понимание того, что происходит.
Я пришел в эту сферу, не имея ни малейшего представления о том, как это делается, будучи первокурсником, и уволился через 1,5 года. Поэтому то, что я говорю, может быть немного ржавым и определенно не полным.
Язык, который мы использовали, был C. Но в то время дисковое пространство составляло 4 МБ, а память - 8 МБ на устройствах, для которых мы разрабатывали, и я знаю, что C использовался из-за того, что его библиотеки занимали мало места. Очевидно, производительность тоже была критерием".
Что касается основ электроники, то для должности начального уровня практически ничего не нужно. Со временем вы приобретете необходимую информацию и опыт.
Это не обязательное условие, но опыт работы с внутренними компонентами операционной системы и разработки систем - определенно плюс.
Встраиваемые системы обычно программируются на C, хотя есть системы на концах диапазона, которые используют ассемблер, когда пространство кода или время действительно ограничены (или нет достойного компилятора C), а на другом конце - C++ вплоть до .NET compact. Это зависит от того, что вы подразумеваете под встраиваемыми системами, они варьируются от действительно маленьких микроконтроллеров с несколькими сотнями байт оперативной памяти и программного пространства до устройств типа смартфонов, работающих с полной многозадачной операционной системой и пользовательским интерфейсом.
Вы сможете продвинуться дальше в верхнем конце этого диапазона без опыта работы в электронике, потому что он меньше привязан к аппаратному обеспечению и больше похож на разработку настольных систем. По мере уменьшения диапазона приложений знание электроники, аналоговой и цифровой, источников питания, вопросов шума, соответствия, тепла и других вопросов - все это в совокупности создает действительно сложную среду проектирования.
Начните с чтения некоторых ссылок здесь и embedded.com
Языки: C, Ассемблер, Обработка, Базовый и многие другие, все зависит от того, какую платформу вы используете, и что доступно.
Вы можете получить более конкретную информацию, если зададите тот же вопрос на ChipHacker или Electronics Exchange , которые являются сайтами в стиле обмена стеками (например, этот), но ориентированы на электронику и " физические вычисления ".
Изучите C. Научитесь применять C ко всем проблемам. Другие языки могут подождать. В конце концов, сборка поможет, и ни один программист не должен оставаться без языка сценариев.
В зависимости от того, какие встроенные цели вы используете, между ПК и вашей целью может быть очень мало различий. С небольшим опытом работы в области электроники это будет ваш самый простой вход.
Маленькие процессоры дадут вам самый крутой путь обучения, но вы узнаете больше всего о встроенном программировании. Однако без электронного фона это может создать дополнительные проблемы, для решения которых у вас, возможно, еще нет навыков.
В конце концов вам придется изучать электронику, если вы хотите добиться дальнейшего прогресса за пределами основ.
Единственное, о чем я пока не упоминал в ответах, - это то, что до сих пор вы, вероятно, выполняли большую часть своего кодирования в контексте операционной системы. Во многих (возможно, в большинстве?) Случаев с прошивкой, а не с программным обеспечением, у вас не будет удобства и преимуществ кодирования поверх операционной системы. Вот почему так много других ответов указывало на то, что хорошее знание электроники имеет решающее значение.
Как отмечали другие, встроенная система может означать множество вещей. В моем мире (аэрокосмическая и оборонная промышленность) мы работаем с операционными системами реального времени (VxWorks и Integrity - самые крупные игроки) и иногда с Linux. Мы программируем в основном на C, хотя C++ также используется, если проект решил использовать объектно-ориентированное программирование и моделирование.
Итак, что касается предварительных требований, то C - это точно. Вам действительно нужно выучить весь язык C, включая операции с битами, работу с шестнадцатеричными значениями, указатели, все низкоуровневые вещи. Ассемблер тоже, но сейчас я использую его только для отладки самых сложных вещей. Вам нужно знать достаточно, чтобы читать и понимать.
Я думаю, что An Embedded Software Primer - это отличное начало, чтобы изменить ваше представление о встроенном ПО. Обработка прерываний, проблемы реального времени и т.д...
Как упомянул Микки, иногда у вас даже нет ОС. В таких случаях обычно пишут свой собственный диспетчер задач, но это обычно не то, с чего стоит начинать новичку. Удачи.