Перейти к содержанию

Программирование встраиваемых систем

Раздел о том, как писать прошивки: особенности языка C на 8- и 32-битных микроконтроллерах, работа с регистрами и битами, целочисленная арифметика и фиксированная точка, прерывания и общие данные. Статьи опираются на стандарт C11, документацию компиляторов и ABI платформ AVR и ARM.

Прошивка микроконтроллера — программа без операционной системы, которая сама настраивает тактирование и периферию, работает с регистрами по фиксированным адресам и обслуживает прерывания. Язык почти всегда C, но условия заметно отличаются от программирования для компьютера: 16-битный int на AVR, отсутствие блока плавающей точки у многих ядер, несколько килобайт ОЗУ, данные, которые меняются в обработчиках прерываний.

Статьи раздела

  1. Язык C для микроконтроллеров — размеры типов на AVR и ARM и типы stdint.h, volatile и атомарность, доступ к регистрам в avr-libc и CMSIS, константы во Flash, плавающая точка.
  2. Битовые операции — маски, установка, сброс и проверка битов, поля регистров, ловушки продвижения типов и сдвигов, атомарность на AVR и STM32.
  3. Арифметика с фиксированной точкой — формат Q, сложение и умножение с округлением и насыщением, деление, типы q15 CMSIS-DSP и _Fract в avr-gcc.

Где ещё искать

Особенности конкретных ядер и периферии — в разделе «Микроконтроллеры»: системы команд AVR, 8051 и Thumb-2, таймеры, режимы сна, прошивка. Программы для сборки и загрузки прошивки — компиляторы, PlatformIO, avrdude, esptool — в разделе «Программы». Расчёты, которые нужны при написании прошивки, — предделители таймеров, скорости UART, CRC, таблицы функций — в разделе «Инструменты».

Готовятся к публикации

Прерывания и общие данные · Конечные автоматы · Файлы прошивки: HEX, BIN, ELF · Скрипты компоновщика · Код запуска · FreeRTOS

Частые вопросы

С чего начать программирование микроконтроллеров на C?

С отличий от «обычного» C: размеров типов на конкретной платформе, квалификатора volatile, работы с регистрами через маски и сдвиги. Затем — с периферии одного семейства: портов, таймеров, прерываний. Примеры этого раздела написаны для AVR и STM32, а особенности самих микроконтроллеров собраны в разделе «Микроконтроллеры».

Какой язык выбрать для прошивки: C, C++ или что-то ещё?

C остаётся основным: на нём написаны заголовки производителей, CMSIS, avr-libc и большинство примеров. C++ используют там, где компилятор и библиотеки его поддерживают, — например, часть ядра Arduino для AVR, в том числе Tone.cpp, написана на C++. Знание C нужно в любом случае: без него трудно читать документацию и чужой код.

Нужен ли ассемблер, если пишешь на C?

Писать на нём приходится редко, а читать — полезно: по листингу видно, во что компилятор превратил код, сколько тактов занимает обработчик прерывания и атомарна ли операция. Системы команд разобраны на страницах «Система команд AVR», «Система команд 8051» и «Thumb-2».