Как стать разработчиком встроенного программного обеспечения?

22

Я хотел бы получить несколько советов для тех, кто хочет стать хорошим разработчиком встроенного программного обеспечения или хочет улучшить свою работу в этой области.

Что мне нужно узнать об оборудовании, программном обеспечении?

Какие книги наиболее рекомендуются? Блоги?

В конце концов, как я могу превратиться из начинающего любителя в превосходного профессионала?

Daniel Grillo
источник

Ответы:

39

Пока все ответы были хорошими, но я добавлю два цента.

Вот повторение некоторых советов с изюминкой и некоторых дополнительных:

  • Изучите C: основной язык аппаратного обеспечения, которое все еще переносимо (слишком мало). Не просто изучите его, но станьте экспертом во всех его функциях, таких как volatile и почему это важно для написания драйверов устройств.
  • Начните с хорошего комплекта разработки, такого как Arduino, но, как уже было сказано, изучите другие архитектуры, как только вы это почувствуете. К счастью, есть несколько плат, совместимых с Arduino, построенных с другими процессорами, так что вы можете переписать один и тот же дизайн на другом UC, чтобы не испортить весь ваш дизайн и почувствовать что-то новое.
  • На этапе обучения не стесняйтесь изобретать колесо для драйверов устройств или других фрагментов кода. Не просто добавьте чужой код драйвера туда. Есть смысл заново изобретать колесо, когда вы учитесь.
  • Испытайте себя, чтобы переписать свой код более эффективно с точки зрения скорости и использования памяти.
  • Знакомство с различными стилями архитектуры встроенных систем. Начните с базовой обработки прерываний / фоновой петли, затем перейдите к фоновым планировщикам, а затем к операционным системам реального времени.
  • Получите хороший контроль версий! Я предпочитаю Mercurial сам.
  • Даже подпишитесь на несколько бесплатных сайтов с контролем исходного кода, таких как Sourceforge.net или Bitbucket.org, для размещения вашего проекта, даже если вы работаете над ним только один. Они сохранят ваш код, так что вам не придется беспокоиться о том, что случайный сбой жесткого диска разрушает все! Использование распределенной VCS очень удобно, потому что вы можете проверить изменения на вашем жестком диске, а затем загрузить их на хост-сайт, когда будете готовы.
  • Хорошо изучите свои инструменты для любого чипа, над которым вы работаете! Знание того, как компилятор создает сборку, очень важно. Вам нужно понять, насколько эффективен код, потому что вам может потребоваться переписать в сборке. Знание того, как использовать файл компоновщика и интерпретация вывода карты памяти, также важно! Как еще вы узнаете, является ли та самая рутина, которую вы только что написали, виновной в том, что вы занимаетесь слишком большим количеством ROM / Flash!
  • Изучайте новые методы и экспериментируйте с ними в своих проектах!
  • Ничего не предполагайте при отладке. Проверьте это!
  • Узнайте, как программировать для защиты от ошибок и проверки предположений (например, используя assert)
  • Встраивайте отладочную информацию в свой код, где это возможно, например, для вывода потребления памяти или профилирования кода с помощью таймеров или использования запасных выводов на контроллере пользователя для переключения и измерения задержки прерывания в O-области.

Вот несколько книг:

Вот несколько сайтов:

  • Встроенные гуру
  • Ganssle Group У Джека Гансле есть несколько замечательных исторических историй. Читайте статьи. Хотя он немного проповедует о некоторых вещах.
  • Embedded.com Хорошая информация о новейших методиках и советы от Ganssle, Barr и других экспертов отрасли.
Jay Atkinson
источник
1
@ Адам: я люблю эту книгу! Прагматичный программист! Я не могу поверить, что я забыл это!
Джей Аткинсон
1
+1 за ртутный. Мне это нравится, хотя у меня есть ощущение, что знание git будет более ценным. Знакомство с основами SVN довольно важно, если вы хотите внести свой вклад или извлечь пользу из других проектов, поскольку именно это многие из них используют.
Tyblu
17
  • Помните: «Серебряной пули нет» , не попадайтесь в ловушку, полагая, что есть один инструмент, методология, язык или система, которая может решить все проблемы
  • Стать экспертом в C
    • Учитесь обходиться без malloc () и POSIX
  • Не зацикливайтесь на одной архитектуре, легко стать фанатом PIC, AVR или ARM случайно
  • Сборка, отладка, работа. Практика делает совершенным
  • Изучите хотя бы одну систему контроля версий (SVN / git / etc) и используйте ее
  • Всегда будьте готовы проверить свои предположения. Ошибка обычно в том, что, как вы предполагаете, работает
  • Не становитесь слишком зависимыми от отладчиков, они различны в каждой системе и имеют разную надежность
  • Думай бережно. При решении проблем подумайте об объеме кода, объеме оперативной памяти и стоимости оборудования

Для книг я бы порекомендовал копаться в истории. Большинство современных методов встраиваемого программного обеспечения происходят из самых последних достижений прошлого.

Как и все, практикуйте ежедневно.

Тоби Джаффей
источник
5
Из всего, что я узнал, контроль версий (в настоящее время я использую Subversion) является наиболее ценным для моей производительности. Когда мы начинали, у нас была безопасная исходная база от Microsoft, поэтому я использовал плохое решение, а затем хорошее.
Кортук
Я не могу представить свою жизнь без системы контроля версий. Я использую SVN в настоящее время тоже. Я не знаю, как все работало, прежде чем я знаю SVN.
Даниэль Грилло
1
+1 за «Ошибка, как правило, в том, что вы предполагаете работает»
JustJeff
«Научись обходиться без маллока» - почему? Чтобы минимизировать риск столкновения стека / кучи?
rzetterberg
@rzetterberg Многие встраиваемые системы избегают использования динамического выделения памяти, поскольку это может привести к фрагментации кучи и индетерминизму
Тоби Джаффи
8

Другие ответы хороши, но самое большое различие между любителем и профессионалом должно быть в мышлении о качестве. Так что продвигайте свой проект до конца, не останавливайтесь, когда вы на 80% закончили с проектом. Возьмите его полностью, докажите, что он работает, и документируйте его правильно.

Убедитесь, что ваш код читабелен и удобен в обслуживании.

И не забудьте также повеселиться :)

Johan
источник
7

Помимо очевидного, как изучение C и начните с какой-нибудь доски для разработчиков, вы захотите научиться читать таблицы данных микроконтроллеров .
Производители добавляют все больше и больше функций в микроконтроллеры, которые становятся все более и более сложными. Таблица данных не только предоставляет электрические характеристики (что более интересно для инженера-электронщика, чем разработчика программного обеспечения), но также подробное описание регистров, карт памяти и т. Д.
При первом чтении таблица данных может выглядеть устрашающе, но не понимает их может вызвать более сильную головную боль на этапе отладки.

оборота стевенвх
источник
3

«Встроенный» - это немного загруженный термин.

В некоторых отношениях любая система, предназначенная для запуска одного приложения, может называться встроенной системой, если имеется некоторое оборудование, которым нужно управлять. Можно с уверенностью назвать 400 МГц PPC604 с 2 ГБ ОЗУ, на котором запущено Java-приложение поверх linux, встроенной системой, если она управляет процессом через локальные модули ввода / вывода. С другой стороны, Arduino, просто запускающий какое-то минимальное сетевое приложение, не будет в значительной степени встроенной системой. Но, вероятно, «встроенный» заставляет большинство людей думать о контроллерах на базе флэш-памяти, имеющих всего несколько сотен байтов оперативной памяти, об отсутствующей операционной системе и множестве встроенных периферийных устройств.

При этом, вероятно, две большие проблемы, с которыми не встроенные программисты обычно сталкиваются при изучении встроенных систем, - это регистры ввода-вывода и прерывания.

Прерывания могут быть на самом деле более простой из двух концепций для не встроенных программистов, поскольку основные проблемы с ними, параллелизм и программирование на основе событий, часто встречаются в основных приложениях. Боль в прерываниях связана с чрезвычайной чувствительностью системы к качеству обработки прерываний и сложностями работы с аппаратными средствами для устранения состояния прерывания и его настройки для следующего. С графическим интерфейсом тупик убивает только приложение. С обработчиком прерываний, тупик вызывает блокировку всей вашей системы.

Устройства ввода / вывода кажутся той областью, которая вызывает наибольшую сложность. Для непосвященных, это может быть весьма удивительно обнаружить , что чтение этого регистра здесь оказывает влияние на этот регистр там . Написание 1, чтобы очистить биты. Биты состояния, которые очищаются, когда вы читаете регистр данных и т. Д. С аппаратным обеспечением ввода-вывода существует так много возможностей, что нет общего правила обращения с ним, кроме как научиться находить и интерпретировать листы данных устройства. Написание драйвера устройства для последовательного порта многому научит вас при программировании ввода / вывода низкого уровня.

На самом деле ничто не заменит изучение этих вещей, чем закатать рукава и запрограммировать какой-нибудь прямой язык C и / или ассемблер на голом металле. Даже вышеупомянутой встроенной системе на основе Java в конечном итоге требуется драйвер устройства для ввода / вывода, и это означает, что в конечном итоге нужно иметь дело с C. Опыт - лучший учитель. Выберите микроконтроллер, будь то MSP430, TMS320, AVR, ARM, PIC, 68HC11, что угодно, найдите набор eval и соберите несколько систем.

JustJeff
источник
3

$50to$но для про мини нужно припаять. Я не фанат семейства PIC, но вы, возможно, захотите получить что-то там в качестве урока истории, то же самое касается 8051, оба семейства все еще популярны и используются, но не очень эффективны и были переданы другими архитектурами. Абсолютно изучите ARM и большой палец, возможно MIPS (это рис 32, не путать с более старой оригинальной архитектурой PIC). ARMmite Pro - хорошая доска ARM начального уровня, хотя Stellaris тоже может быть.

Здесь вы хотите узнать ассемблер для различных платформ. C. C и ассемблерное взаимодействие. Различные инструменты GCC и не GCC. Как прочитать справочную таблицу / справку программистов (и понять, что все они имеют некоторые ошибки или могут вводить в заблуждение, никогда не доверять им, аппаратное обеспечение побеждает документы) и как читать или использовать схему. Обычно это не сложные схемы. Некоторые платы хороши для взаимодействия в проектах, то есть на них нет мусора, просто прямой доступ к выводам ввода / вывода. Но это не лучшее для обучения. Что-то вроде StellarisНа плате, которая является болезненной для проектов, есть много забавных вещей для обучения встроенному и обучению брать / использовать драйверы или писать свои собственные из таблиц данных. Бабочка Atmel AVR также является хорошей платой, если она еще доступна, возможно, придется припаять ее на собственном последовательном порту, чтобы запрограммировать ее, или просто заклинить некоторые провода в отверстиях. Это дает вам несколько периферийных устройств, которые вы можете научиться программировать.

Даже если вы в конечном итоге выполняете встроенную работу, которая включает в себя написание приложений с использованием вызовов SDK или API на linux или RTOS (не затрагивая аппаратное обеспечение и не читая таблицы данных), вышеупомянутые знания по-прежнему ставят вас впереди всех остальных.

Daniel Grillo
источник
3

Эта статья (автоматически переведенная с португальского на английский) содержит хороший обзор развития карьеры разработчика встроенного программного обеспечения. Примечание: оригинал здесь .

Он начинается с описания областей знаний, которые вы должны развивать:

  1. Знание: Вы должны знать теорию, связанную со встроенными системами. Это означает аппаратное и программное обеспечение. Невозможно быть компетентным разработчиком встроенного программного обеспечения, не зная аппаратную архитектуру, которая работает.

  2. Умение: вам нужно получить опыт в этой области. Необходимо практиковать. Вы можете украсить всю мнемонику PIC ассемблера, но это бесполезно, если вы не можете управлять светодиодом с этим знанием.

  3. Отношение: Прежде всего, вам нужно отношение, которое заставит вас расти в этой области. Это очень динамично с частыми изменениями и разработками. Вы должны всегда быть мотивированными (а) быть самоучкой, получать удовольствие от обучения, «подстраиваться» и понимать, как все работает. Без таких отношений тебе скоро дадут. Потому что в этой области вам нужно быть очень, очень настойчивым.

Затем он дает следующие советы для освоения этих областей (и развивает их с дальнейшим текстом, это только заголовки):

  1. Что нужно для изучения оборудования (как минимум)
  2. Что нужно для изучения программного обеспечения (как минимум)
  3. Кроме того, изучите операционные системы
  4. Вам нужна тренировка
  5. Не останавливайтесь, продолжайте учиться и развивать свою сеть!
Кевин Вермеер
источник
1
Спасибо за ссылку! Перевод Google, кажется, указывает, что он идеально подходит для этого вопроса. Тем не менее, мы бы предпочли, чтобы (1) текст был на английском языке (мы являемся англоязычным сообществом , хотя многие из нас, по крайней мере, говорят на двух языках) - автоматический перевод, только если вам нужно (2) ответ включает краткое изложение статьи на случай, если ссылка не работает. Я отредактировал ваш пост, чтобы придерживаться этих рекомендаций, и дал вам голос за это!
Кевин Вермеер
2

Подумайте дважды, прежде чем стать инженером встроенного программного обеспечения. У меня были этапы в моей карьере. Первые 5 лет я разрабатывал программное обеспечение, затем перешел к продажам / маркетингу, сделал это в течение 15 лет, управлял бизнесом стоимостью более 100 миллионов долларов, и теперь я вернулся к программному обеспечению.

Когда я возвращаюсь к программному обеспечению через 15 лет, я помню, почему я ушел в первую очередь. Это трудно. Это требует концентрации, нескольких сотен строк кода, соприкасающихся друг с другом, и вы все должны держать это в памяти. Встраивать это особенно сложно.

Вы также должны понимать себя. Если вы, как правило, умный парень, дотошный и терпеливый, вы станете отличным инженером. Если вам не хватает одного из них, вы будете в лучшем случае средним. Подумай об этом. Если вы очень умны и не терпеливы, это ничего не стоит, потому что независимо от того, насколько вы умны, хорошая инженерия требует терпения и внимания к деталям.

Вы также должны чувствовать себя комфортно, глядя на часы кода без разговоров. Я наблюдаю, что люди с хорошими социальными навыками считают это невыносимым.

Если все это подтвердится, чем читать все эти великие книги, выполнять упражнения, и вы станете отличным инженером .. Удачи

Фрэнк
источник
1

Все остальные говорят великие вещи. Поэтому я дам вам общий совет: читай читай читай читай читай читай читай читай!

Прочитайте каждую статью на http://embeddedgurus.com. Если вы чего-то не понимаете, изучите это. Если в объяснении этих вещей вы найдете что-то, чего не понимаете, прочитайте еще немного. Я собираюсь занять позицию в области встроенного программного обеспечения, и мой опыт - это несколько профессиональных проектов за последние несколько лет и много чтения. Опыт позволяет вам что-то пробовать, а чтение позволяет узнать, были ли уже пробованные вами вещи, возможно, лучше, чем вы могли. Он знакомит вас с концепциями, с которыми вы можете работать в любых обстоятельствах.

Просто читать!

AngryEE
источник
0

Станьте экспертом в C Понимают Таймеры и Последовательные коммуникации. Вы должны испачкать руки этим. Разберитесь с протоколами RF, настройте их в соответствии с вашими требованиями. Не просто слепо опробуйте комбинации кода во время отладки. Код делает именно то, что вы говорите. Прочтите руководство пользователя и таблицу данных, а затем внесите изменения, если что-то не работает. Все, что сказано и сделано, единственный реальный способ стать экспертом - это практиковаться. Продолжайте создавать приложения. Вскоре это станет второй натурой.

Доминик Притхам
источник