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

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

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

РЕДАКТИРОВАТЬ: я работаю с собственной настраиваемой RTOS, а не со встроенным Linux.


person Community    schedule 07.07.2009    source источник


Ответы (9)


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

  1. Endianness (это ссылка на старую, но хорошую статью в linuxjournal)
  2. Эффективное использование многопоточных архитектур (сайт Embedded в целом хорош)
  3. Отладка встроенных и многопоточные системы
  4. Понимать, учиться и следовать хорошим методам программирования (ссылка очень старая, а суть очень общее и субъективное, но подумайте об этом)
  5. Другое (эта страница IBM о встраиваемых системах Linux суммирует большинство другие моменты, которые я хочу сделать)
  6. И еще одно — никогда не недооценивайте тестирование! или, планирование тестовых случаев!!

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

person nik    schedule 07.07.2009
comment
Да ТАТФТ. Если вы не знаете, что это значит, поищите и живите этим! - person Brian; 07.07.2009
comment
@ Брайан, еще бы! Я корил себя за то, что пропустил это. - person nik; 07.07.2009
comment
Я только что узнал, что означает TATFT, и громко смеялся в своей кабинке, я полностью согласен, на самом деле мы всегда TATFT в моей команде и неодобрительно относимся к тем группам, которые этого не делают. - person ; 07.07.2009
comment
это предполагает, что пользователь использует RTOS или другую встроенную операционную систему, что я бы не сделал, и уж точно не встроенный Linux, который является оксюмороном. Это хорошие высокоуровневые вещи, о которых стоит беспокоиться, но не низкоуровневые. - person old_timer; 08.07.2009
comment
В вопросе упоминается разработка встроенного программного обеспечения и очевидная важность аппаратной архитектуры и ISA. Я имел это в виду, перечисляя пункты. - person nik; 08.07.2009
comment
@dwelch, я прочитал ваши доводы и согласен с ними. Если вы посмотрите на пункты в моем ответе (и, возможно, немного пробежитесь по статьям), вы, вероятно, согласитесь, что этот высокоуровневый подход к низкоуровневому проектированию подготовит ваш ум к написанию тех пунктов, которые вы перечисляете. - person nik; 08.07.2009

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

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

  • Дизайн для теста. Когда вы работаете над проблемой, меняйте только одну вещь за раз за тест.
  • Вам нужно разбираться в шинах и интерфейсах, spi, i2c, usb, ethernet и т. д. Интерфейс номер один, сегодня, вчера и завтра, uart, последовательный.
  • Шаги, связанные с программированием вспышки.
  • Уловки, чтобы избежать превращения продукта в кирпич.
  • Загрузчики в целом.
  • Разбивка вышеперечисленных интерфейсов на различных семействах деталей (разные поставщики чипов имеют разные представления о выводах ввода-вывода, подтягиваниях, управлении направлением и т. д.).
  • Плата и чип подняты, вы, конечно, никогда не захотите загружать многие десятки тысяч строк кода программы при первом включении (представьте, что светодиод горит, светодиод выключается).
  • Как отладить продукт, не используя слишком много тестового оборудования (логические анализаторы и осциллографы), в то же время вы должны научиться использовать осциллограф для отладки, вы гораздо более ценны, если вам НЕ НУЖНО иметь техника или инженера в лаборатории с тобой.
  • Как бы вы перепрограммировали устройство в полевых условиях? Что бы вы сделали, чтобы свести к минимуму человеческий фактор, позволяя пользователю модернизировать устройство в полевых условиях? Помните также о понижении рейтинга поля.
  • Что бы вы сделали, чтобы воспрепятствовать взлому (двоичные файлы и т. д.).
  • Эффективное использование флэш-памяти/ПЗУ (не изнашивайте один банк или секцию, распределяйте износ вокруг или смотрите, делает ли флэш-память это за вас).
  • Как и когда использовать сторожевой таймер.
  • Конечные автоматы, очень полезные с байтовыми потоками (последовательными и ethernet), разрабатывают структуры пакетов, которые хорошо передаются и адаптированы к конечному автомату, и которые имеют заголовок и контрольную сумму или другую структуру, которая гарантирует, что вы не интерпретируете частичные пакеты или случайные данные как хороший пакет.
person old_timer    schedule 07.07.2009
comment
Хороший пост. Я бы добавил, что при создании встроенных приложений у вас меньше возможностей для отладки, и продуманность дизайна становится абсолютно необходимой гораздо больше, чем в дружественной среде, когда вы находитесь в песочнице и не собираетесь испортить код в другом месте. Кроме того, переключение на неправильный бит или разыменование оборванного указателя имеет здесь реальные последствия, в отличие от настольного программирования, где худшее, что вы можете получить, это сбой программы. Программируйте оборонительно, даже если вы не видите в этом сильной необходимости. - person San Jacinto; 08.07.2009
comment
да, программировать оборонительно, мне нравится этот термин. также знайте, когда идти против нормы, например, больше глобальных переменных и меньше локальных. Не всегда предполагайте, что .bss и .data были настроены (потому что вы этого не сделали), и выберите альтернативу. Управление питанием, все больше и больше вещей работают от батареек. Для хранения 1 в ПЗУ требуется меньше энергии, чем 0. Сохранение в nv ram при отключении питания. Пробуждение, обработка события, возврат в режим пониженного энергопотребления. - person old_timer; 08.07.2009
comment
Если вы не умеете читать схемы, научитесь. То же самое касается таблиц данных и чтения Verilog и VHDL. В зависимости от проекта вы в основном не получите хорошего или точного справочного руководства для программистов, схема плюс область действия покажут, где находятся сигналы, а verilog/vhdl расскажет вам, что делают ваши коллеги-инженеры. - person old_timer; 08.07.2009
comment
Это хороший список. Я думаю, что проголосовать было бы легче, если бы вы переформатировали его, чтобы сделать его более читабельным. Для начала было бы неплохо начать с пули — в конце концов, это (неупорядоченный) список. - person Steve S; 10.07.2009

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

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

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

person samoz    schedule 07.07.2009
comment
Согласовано. Узнайте об электрических/электронных технических аспектах компьютеров! - person Noldorin; 07.07.2009
comment
Я работаю с ARM9 для контроллера и C55 для DSP, а также помогал писать драйверы для различных типов микросхем RF, AD/DA и Power Amp. - person ; 07.07.2009

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

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

person Vinnie    schedule 07.07.2009

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

person Brian    schedule 07.07.2009
comment
У меня есть эти книги, я их читал. Я думаю, что они оба великолепны. - person ; 07.07.2009
comment
Практика гибкого разработчика — это своего рода продолжение книги Программист-прагматик, а также очень хорошая книга. - person Imagist; 07.07.2009

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

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

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

person Samuel Carrijo    schedule 07.07.2009

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

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

person swegi    schedule 07.07.2009
comment
Я не знал, что означает wcet, я погуглил и нашел ‹a href=mrtc.mdh.se/projects/wcet/›эта страница.‹/a› Я только что узнал кое-что новое, спасибо!. - person ; 07.07.2009

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

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

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

person Steve Melnikoff    schedule 07.07.2009

Хороший вопрос. Кое-что не упомянуто...

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

Получение информации о внутренних компонентах для отладки может оказаться непростой задачей. Обычно там нет экрана, поэтому не нужно вбрасывать вызовы «printf» куда угодно. Эмулятор или интерфейс JTAG идеально подходят — вы можете устанавливать точки останова и выполнять свою программу пошагово (при условии, что остановка микропроцессора не сводит аппаратное обеспечение с ума, как если бы рука робота вращалась на полной скорости!). Если эмулятор/JTAG недоступен, узнайте, как использовать запасной последовательный порт (или, возможно, даже разбить контакт, чтобы сделать последовательный порт) для канала отладки с помощью некоторых простых команд памяти.

person Craig McQueen    schedule 08.07.2009