Встроенный разработчик, какие навыки важны

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

Я стал достаточно опытным с ассемблером C и ARM, работая со встроенным ядром Linux, и я собираюсь погрузиться в Linux-драйверы. Однако я не могу не думать, что я, возможно, сужу свой навык. Я хочу продолжать работать со встроенными системами в будущем, но вы никогда не знаете рынок труда (параноидально, что я буду передан на внешний подряд в Китай и Индию).

Я чувствую, что я в настоящее время довольно слаб с С++ и Java, я также хотел бы изучить ядро ​​Android в будущем. Я также не знаю никаких языков сценариев.

Может ли кто-нибудь, кто работал со встроенными системами какое-то время, дать некоторое представление о том, какие навыки/языки они считают жизненно важными для встроенного разработчика? Должен ли я продолжать только оттачивать свои навыки С или я должен изучать новые вещи.

Ответ 1

Вот мой список:

  • C essentials
  • OOP/С++ - классы, инкапсуляция, полиморфизм, перегрузка/переопределение, шаблоны
  • Алгоритмы - поиск, сортировка, b-деревья
  • Шаблоны проектирования - factory, наблюдатель, синглтон и т.д.
  • Операционные системы реального времени - примитивы (семафор, мьютексы), методы планирования, пространство пользователя/ядра
  • Основы Linux, запись драйвера, оболочка
  • основы микропроцессора - обработка прерываний, регистры, код сборки и т.д.
  • Основы микроконтроллеров - АЦП, ЦАП, Таймеры, ШИМ, DMA, сторожевой таймер и т.д.
  • Память - NOR, NAND, SRAM, DRAM, уровень износа.
  • Основные протоколы - I2C, SPI, UART, LIN
  • Расширенные протоколы - SATA, PCIE, USB, CAN, MOST
  • Параллельное/параллельное программирование - MPI для SMP и т.д.
  • Диаграмма классов UML, диаграмма компонентов, диаграмма состояний, диаграмма последовательности
  • Perl или Python для сценариев, например. для изменения простых текстовых файлов.
  • Java и Android
  • Основная электроника - считывание схем, использование осциллографа, мультиметра, паяльника
  • Специализированные методы для встроенного программирования, например. debouncing переключателей, резистивных лестничных переключателей, поворотных датчиков и т.д.
  • разработка программного обеспечения - SDLC, CMMI, гибкие методы, например. SCRUM, контроль версий (ClearCase, git, svn), отслеживание ошибок (JIRA?), Проверка статического кода, Lint, модульное тестирование, непрерывная интеграция.
  • строить среды - makefile, cmake
  • Основной дизайн FPGA/ASIC, базовый DSP

Ответ 2

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

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

Очень важно знать о концепциях архитектуры программного обеспечения, RTOS, управляемых событиями системах (встроенные системы реактивны по своей природе) и моделирования (UML). Возможно, разработка с использованием тестов (TDD). Это языковые агностики и помогут вам разработать хорошую прошивку с нуля.

Что касается языков, я считаю, что C используется как в малых, так и в больших системах, поэтому наличие хорошего фона в C является обязательным. Здесь я не говорю о программировании на уровне новичков. Я говорю о том, что процессор и компилятор делают за кулисами. Согласно тому, что вы упомянули, у вас, вероятно, есть эти навыки. Это очень полезно в случае небольших систем, где каждый байт RAM и ROM подсчитывается. Знание о правилах MISRA-C поможет вам разработать более безопасный код C.

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

Возможность проектирования приложений на базе ПК полезна для создания тестовых приборов для тестирования встроенных устройств на производственной линии, а может быть, потому, что встроенное устройство просто нуждается в программном обеспечении для ПК, например карманном USB-осциллографе. В этом случае я использую Qt, поскольку он является кросс-платформенным, но вы можете использовать Visual Studio с С#, если вы хотите работать только в Windows.

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

Вот небольшой список книг, которые мне очень полезны:

  • Практические диаграммы состояний UML в C/С++.
  • UML Distilled.
  • Создание встроенных систем.
  • Компьютеры как компоненты.
  • Embedded Software Primer.
  • Программное обеспечение Better Embedded Systems.

Надеюсь, это поможет.

Фернандо

Ответ 3

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

Не важно, в каком домене вы работаете (linux, vlsi, arm....). Но важно, насколько эффективен ваш код на аппаратном обеспечении.

Если вы действительно хотите работать во встроенном мире, вы найдете свой путь.