Программирование встраиваемых систем
Раздел о том, как писать прошивки: особенности языка C на 8- и 32-битных микроконтроллерах, работа с регистрами и битами, целочисленная арифметика и фиксированная точка, прерывания и общие данные. Статьи опираются на стандарт C11, документацию компиляторов и ABI платформ AVR и ARM.
Прошивка микроконтроллера — программа без операционной системы, которая сама настраивает тактирование и периферию, работает с регистрами по фиксированным адресам и обслуживает прерывания. Язык почти всегда C, но условия заметно отличаются от программирования для компьютера: 16-битный int на AVR, отсутствие блока плавающей точки у многих ядер, несколько килобайт ОЗУ, данные, которые меняются в обработчиках прерываний.
Статьи раздела
- Язык C для микроконтроллеров — размеры типов на AVR и ARM и типы
stdint.h,volatileи атомарность, доступ к регистрам в avr-libc и CMSIS, константы во Flash, плавающая точка. - Битовые операции — маски, установка, сброс и проверка битов, поля регистров, ловушки продвижения типов и сдвигов, атомарность на AVR и STM32.
- Арифметика с фиксированной точкой — формат 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».
Смотрите также
- C для микроконтроллеровТипы, stdint, volatile, атомарность, регистры, константы во Flash
- Битовые операции в CМаски, сдвиги, установка и проверка битов, ловушки стандарта C
- Фиксированная точкаФормат Q, умножение со сдвигом, округление, насыщение, q15 и _Fract
- МикроконтроллерыAVR, ARM Cortex-M, ESP32, PIC, MSP430: архитектура и выбор
- ПрограммыСАПР плат, симуляторы схем, среды и утилиты прошивки МК
- Калькулятор CRCCRC-8, CRC-16, CRC-32, Modbus, блок CRC STM32, код на C