Какой набор навыков должен иметь программист на низком уровне?

Я встроенный инженер SW, с опытом менее 3 лет. Я стараюсь "точить пилу" непрерывно. Мне было интересно, есть ли что-то конкретное для программирования на низком уровне, которым должны обладать кодеки C/С++.

Что мне приходит в голову, это знакомство с аппаратной архитектурой и набором команд. Знать, как играть с битами, также важно, управление ресурсами и производительность были частью моей работы, есть ли что-нибудь еще?

EDIT: я работаю с собственными настройками RTOS, а не с встроенным Linux.

Ответ 1

Конкретные понятия, такие как

Используйте ссылочные ссылки, которые я даю как понятия,
пожалуйста, следуйте за более глубокими знаниями.

Ответ 2

Здесь я вижу много ответов на операционную систему высокого уровня, но вы конкретно сказали, что уровень низкого уровня.

Некоторые рассеянные мысли:

  • Дизайн для тестирования. По мере того, как вы работаете с проблемой, меняйте только одну вещь за раз за тест.
  • Вам нужно понимать шины и интерфейсы, spi, i2c, usb, ethernet и т.д. Интерфейс номер один, сегодня, вчера и завтра, uart, serial.
  • Шаги, связанные с программированием вспышки.
  • Трюки, чтобы не сделать продукт легко кирпичным.
  • Загрузочные файлы в целом.
  • Бит-стук над указанными интерфейсами в разных семействах частей (разные чипы у продавцов разные идеи о io-контактах, подтягиваниях, направлении элементы управления и т.д.).
  • Совет и чип поднимаются, вы, конечно, никогда не захотите загрузите несколько десятков тысяч строк кодовой программы на первый включите питание (думайте, что привело, выключено).
  • Как отлаживать продукт, не используя слишком много тестового оборудования (логические анализаторы и области применения), в то же время вам нужно научиться использовать область для отладки, вы далеко более ценным, если вы не хотите иметь технику или инженера в лаборатории с тобой.
  • Как бы вы перепрограммировали устройство в поле? Что бы вы делаете, чтобы свести к минимуму человеческую ошибку, позволяя пользователю поле обновить устройство? Помните также о понижении рейтинга.
  • Что бы вы сделали, чтобы препятствовать взлому (двоичные файлы и т.д.).
  • Эффективное использование flash/rom (не изнашивайте один банк или раздел, не распространяйте износ или не смотрите, делает ли вспышка для вас).
  • Как и когда использовать сторожевой таймер.
  • Государственные машины, очень полезные с потоковыми потоками (последовательный и ethernet), создают структуры пакетов, которые хорошо переносятся и адаптируются к машине состояний, и имеют заголовок и контрольную сумму или другую структуру, которая гарантирует, что вы не интерпретируете частичные пакеты или случайные данные как хороший пакет.

Ответ 3

Я бы изучил электронику реальных чипов. Узнайте, как они работают внутри (например, архитектура), интерфейс с периферийными устройствами, электрические и временные характеристики и т.д.

В принципе, прочитайте лист данных, чтобы начать несколько раз, и копайте все, что вы еще не видели/не использовали раньше.

Кстати, с какими чипами вы работаете?

Ответ 4

Подобно тому, что сказал Брайан, узнайте, как создавать блок-тесты и автоматические сборки.

Эти навыки хороши для всех уровней инженеров-программистов. Они помогут улучшить качество вашего кода, а также упростить рефакторинг и улучшить базу кода.

Ответ 5

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

Ответ 6

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

Узнайте, как материал представлен внутри, специально готовые структуры данных (предположим, что вы не создадите свой собственный).

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

Ответ 7

  • Операции
  • бит
  • архитектуры процессора (кэши и т.д.)
  • анализ wcet
  • планирование

Изменить: Я забыл упомянуть о разработке модели. Сегодня алгоритмы управления часто реализуются как некоторый автомат, из которого впоследствии генерируется C-код. Коммерческие доступные инструменты, например, MATLAB/Simulink, ASCET или SCADE.

Ответ 8

Получите копию MISRA-C. Он был первоначально написан членами автомобильной промышленности и пытается сделать программное обеспечение, написанное на C более надежным, путем применения ряда (довольно большого числа!) Правил и рекомендаций.

Затем, купите PC-Lint (или другой инструмент статического анализа), чтобы проверить свой код для MISRA и других правил.

Это особенно актуально для низкоуровневых и встроенных C, поскольку между ними они касаются причин большого количества ошибок в таком программном обеспечении, таких как проблемы, связанные с указателями, утечками памяти, целым продвижением (есть целая глава по это в книге MISRA), endianness и поведение undefined.

Ответ 9

Хороший вопрос. Некоторые из них не были упомянуты...

Узнайте свои различные варианты для достижения многозадачности низкого уровня. От базовых планетарных (не превентивных) планировщиков с таймингами времени от аппаратного таймера до упреждающей RTOS. Узнайте, почему вам может понадобиться RTOS, и почему вы не можете. Если вы используете RTOS, узнайте, что новички с фоном для ПК, вероятно, склонны создавать слишком много задач.

Получение видимости внутренних компонентов для отладки может быть проблемой. Обычно нет экрана, поэтому вы не отправляете "printf", где хотите. Интерфейс эмулятора или JTAG идеален - вы можете установить точки останова и выполнить свою программу (пока остановка микрофона не заставит аппаратное устройство сходить с ума, например, размахивать рукой робота на полной скорости!). Если эмулятор /JTAG недоступен, узнайте, как использовать запасной последовательный порт (или, возможно, даже бит- bash для вывода последовательного порта) для канала отладки, с некоторыми простыми командами peek/poke памяти.