Это сопутствующий код книги CM Kormanyos, C++ в реальном времени: эффективное объектно-ориентированное и шаблонное программирование микроконтроллеров, четвертое издание (Springer, Гейдельберг, 2021 г.) ISBN 9783662629956.
Этот репозиторий состоит из нескольких основных частей.
ref_app
находится в ref_app. Это также включает в себя контрольные показатели. Кросс-компиляторы GNU/GCC и различные дополнительные инструменты, работающие под Win*
, которые необязательно необходимы для определенных сборок, как описано ниже, можно найти в соответствующем репозитории ckormanyos/real-time-cpp-toolchains.
Эталонное приложение загружается с небольшим стартовым кодом, а затем инициализирует тонкий уровень абстракции микроконтроллера (MCAL). Затем управление передается простому многозадачному планировщику, который управляет приложением светодиодов, вызывает циклическую задачу тестирования и обслуживает сторожевой таймер.
Приложение LED переключает пользовательский светодиод с частотой
Эталонное приложение совместимо с C++14, 17, 20, 23 и более поздними версиями.
Прикладное программное обеспечение реализуется один раз и используется единообразно для каждой поддерживаемой цели в ref_app. Различия между отдельными целями возникают только на нижних уровнях программного обеспечения, касающихся деталей запуска/MCAL для конкретного чипа и платы.
Таким образом, проект демонстрирует высокий уровень переносимости.
Эталонное приложение поддерживает следующие цели:
Целевое имя (используемое в команде сборки) | Описание цели | *(макет) |
---|---|---|
avr | MICROCHIP(R) [ранее ATMEL(R)] AVR(R) ATmega328P | Х |
atmega2560 | МИКРОЧИП(R) [бывший ATMEL(R)] AVR(R) ATmega2560 | |
atmega4809 | MICROCHIP(R) [ранее ATMEL(R)] AVR(R) ATmegax4809 | Х |
am335x | BeagleBone с Texas Instruments(R) AM335x ARM(R) A8 | |
bcm2835_raspi_b | RaspberryPi(R) Zero с ARM1176-JZFS(TM) | |
Debug / Release | ПК на Win* через компилятор MSVC x64. Debug / Release | |
host | ПК/рабочая станция на Win* / mingw64 / *nix через хост-компилятор | |
lpc11c24 | Плата NXP(R) OM13093 LPC11C24 ARM(R) Cortex(R)-M0+ | |
nxp_imxrt1062 | Плата Teensy 4.0 / NXP(R) iMXRT1062 ARM(R) Cortex(R)-M7 | Х |
riscvfe310 | SoC SiFive RISC-V FE310 | |
rl78 | Ренесас(R) RL78/G13 | |
rpi_pico_rp2040 | RaspberryPi(R) Pico RP2040 с двойным ARM(R) Cortex(R)-M0+ | Х |
rpi_pico2_rp2350 | RaspberryPi(R) Pico2 RP2350 с двойным ARM(R) Cortex(R)-M33 | Х |
rx63n | Ренесас(Р) RX630/RX631 | |
stm32f100 | STMicroelectronics(R) STM32F100 ARM(R) Cortex(R)-M3 | Х |
stm32f407 | STMicroelectronics(R) STM32F407 ARM(R) Cortex(R)-M4F | |
stm32f429 | STMicroelectronics(R) STM32F429 ARM(R) Cortex(R)-M4F | |
stm32f446 | STMicroelectronics(R) STM32F446 ARM(R) Cortex(R)-M4F | |
stm32h7a3 | STMicroelectronics(R) STM32H7A3 ARM(R) Cortex(R)-M7 | |
stm32l100c | STMicroelectronics(R) STM32L100 ARM(R) Cortex(R)-M3 | Х |
stm32l152 | STMicroelectronics(R) STM32L152 ARM(R) Cortex(R)-M3 | |
stm32l432 | STMicroelectronics(R) STM32L432 ARM(R) Cortex(R)-M4F | Х |
v850es_fx2 | Renesas(R) Electronics V850es/Fx2 upd703231 | |
wch_ch32v307 | Плата WCH CH32v307 RISC-V | |
wch_ch32v307_llvm | Плата WCH CH32v307 RISC-V (но с использованием набора инструментов LLVM) | |
x86_64-w64-mingw32 | ПК на Win* / mingw64 через компилятор GNU/GCC x86_x64 | |
xtensa32 | Эспрессиф (XTENSA) NodeMCU ESP32 | Х |
В этой таблице *(макетная плата) означает, что плату (или некоторые ее версии) можно легко использовать с обычным макетом. Возможно, для этого потребуется очень простая ручная пайка/установка контактов разъема.
Начать работу с эталонным приложением проще всего, используя одну из поддерживаемых плат, например avr
(ARDUINO) или bcm2835_raspi_b
(RaspberryPi ZERO) или am335x
(BeagleBoneBlack) и т. д. Эталонное приложение можно найти в каталоге ref_app и его подкаталогах. .
Эталонное приложение использует системы перекрестной разработки, и поддерживаются следующие системы сборки:
*nix
в сочетании с Bash/GNUmake (скрипт bash) в LINUX/MacOS,*nix
-подобные инструменты make на Win*
в сочетании с пакетным скриптом или Microsoft(R) Visual Studio(R) через внешний Makefile ,Win*
, После успешного завершения сборки полученные артефакты, включая HEX-файлы (например, ref_app.hex
), файлы карт, отчеты о размерах и т. д., будут доступны в каталоге bin
.
Для начала работы с эталонным приложением на *nix
target avr
) вы хотите создать.build.sh
с помощью команды: ./target/build/build.sh avr rebuild
.avr rebuild
, который впоследствии перестраивает все решение для target avr
.*nix
, запустите sudo apt install gcc-avr avr-libc
.*nix
для target avr
Теперь мы покажем, как построить эталонное приложение в командной оболочке *nix
для target avr
. Эта целевая система включает в себя практически любую ARDUINO(R)-совместимую плату. Это также совместимость платы с самодельными платами, описанными в книге.
При необходимости установите gcc-avr
.
sudo apt install gcc-avr avr-libc
Клонируйте или получите репозиторий ckormanyos/real-time-cpp. Затем создайте с помощью:
cd real-time-cpp
cd ref_app
./target/build/build.sh avr rebuild
*nix
для target stm32f446
Теперь мы покажем, как построить эталонное приложение в командной оболочке *nix
для целевой системы ARM(R). Рассмотрим, например, вариант сборки target stm32f446
. Для этого можно удобно использовать плату NUCLEO-F446RE от STMicroelectronics(R).
При необходимости установите gcc-arm-none-eabi
.
sudo apt install gcc-arm-none-eabi
Клонируйте или получите репозиторий ckormanyos/real-time-cpp. Затем создайте с помощью:
cd real-time-cpp
cd ref_app
./target/build/build.sh stm32f446 rebuild
target stm32f446
Теперь мы покажем, как создать эталонное приложение в командной оболочке MacOS для цели ARM(R). Рассмотрим, например, вариант сборки target stm32f446
. Для этого можно удобно использовать плату NUCLEO-F446RE от STMicroelectronics(R).
Клонируйте или получите репозиторий ckormanyos/real-time-cpp.
(Сейчас) можно использовать версию GNUmake по умолчанию 3.81 на MacOS. Файлы make, используемые в этом репозитории, совместимы с ним. Дополнительную информацию см. также в выпуске 273.
Создайте цель с помощью прямого ручного вызова make
.
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
Если набор инструментов необходим, его необходимо установить или получить до создания целевого эталонного приложения.
При необходимости вы можете получить через wget
(или при необходимости установить) набор инструментов gcc-arm-none-eabi
. В этом случае я нашел удобным использовать современный gcc-arm-none-eabi
для MacOS, который можно найти в разделе загрузок Arm GNU Toolchain.
Цепочку инструментов arm-non-eabi
можно получить через wget
и успешно использовать локально в оболочке. Если это необходимо, выполните пошаговую процедуру, описанную ниже.
Шаг 1. Создайте локальный каталог (например, macos-gnu-arm-toolchain
) и cd
в него.
cd real-time-cpp
mkdir -p macos-gnu-arm-toolchain
cd macos-gnu-arm-toolchain
Шаг 2: Получите tar-архив набора инструментов с помощью wget
, распакуйте его и добавьте каталог bin
компилятора в путь к исполняемому файлу оболочки.
wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi.tar.xz
tar -xvf arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi.tar.xz
PATH= $( pwd ) /arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi/bin: $PATH
Шаг 3: При необходимости echo
PATH
для быстрой проверки пути. Также может быть полезно запросить версию arm-non-eabi-g++
. Ожидается, что это позволит убедиться, что цепочка инструментов правильно добавлена в локальный PATH
этой оболочки.
echo $PATH
arm-none-eabi-g++ -v
Теперь просто используйте команды для создания цели с прямым вызовом make
(это то же самое, что показано выше для случая *nix
).
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
Чтобы начать работу с эталонным приложением на Win*
Win*
, как подробно описано несколькими абзацами ниже.ref_app.sln
в каталоге ref_app. Сборка ref_app
в Microsoft(R) VisualStudio(R) активно использует перекрестную разработку с использованием рабочей области проекта типа Внешний Makefile . GNUmake вызывается через пакетный файл в процессе сборки. Впоследствии он запускается в сочетании с несколькими Makefile.
Для создания любой цели ref_app
кроме Debug
или Release
для Win32, требуется кросс-компилятор (кросс-компилятор GNU/GCC). Дополнительную информацию смотрите в тексте ниже.
Кросс-компиляторы GNU/GCC, работающие на Win*
предназначенные для эталонного приложения в VisualStudio(R), можно найти в репозитории цепочек инструментов ckormanyos/real-time-cpp-toolchains. Репозиторий Toolchains содержит подробные инструкции по установке, перемещению и использованию этих портированных компиляторов GNU/GCC.
Примечание о GNUmake для Win*
: GNUmake, который можно использовать в Win*
можно найти в репозитории ckormanyos/make-4.2.1-msvc-build. При желании клонируйте или получите код этого репозитория. Соберите make-4.2.1
в конфигурации Release
x64
с MSVC (т. е. VC 14.2 или новее, Community Edition подойдет).
Межсредовая среда CMake может создать эталонное приложение. Для этой цели также были созданы файлы CMake для каждой поддерживаемой цели.
Рассмотрим, например, создание эталонного приложения для цели avr
с помощью CMake. Схема показана ниже.
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTRIPLE=avr -DTARGET=avr -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
Теперь мы рассмотрим, например, создание эталонного приложения для одной из поддерживаемых целей ARM(R) с помощью CMake. Схема показана ниже. В этом случае нам необходимо определить следующие параметры сборки:
-DTRIPLE=avr -DTARGET=avr
Переключите эти параметры на те, которые предназначены для создаваемой цели на базе stm32f446
ARM(R).
-DTRIPLE=arm-none-eabi -DTARGET=stm32f446
Давайте разъясним команды полностью, чтобы запустить сборку CMake для stm32f446
(т. е. ST Microelectronics(R) STM32F446 ARM(R) с Cortex(R)-M4F).
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTRIPLE=arm-none-eabi -DTARGET=stm32f446 -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
При сборке с помощью CMake для других целей следуйте стандартному шаблону *nix
. Также должна работать сборка с помощью CMake для x86_64-w64-mingw32
или host
из MSYS, Cygwin или любой подобной *nix
-подобной оболочки или консоли.
Следующая последовательность команд будет создана для собственного host
в *nix
-подобной оболочке или консоли.
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTARGET=host -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
Существует также решение рабочей области для ATMEL(R) AtmelStudio(R) 7. Оно называется ref_app.atsln
и также находится в каталоге ref_app. Существуют проекты ATMEL Studio как для эталонного приложения, так и для каждого из примеров. Проекты ATMEL Studio в этом репозитории поддерживают только цель AVR.
Если вы решите использовать ATMEL Studio, вам не нужно использовать или включать какие-либо дополнительные библиотеки для этих проектов (кроме тех, которые обычно устанавливаются во время стандартной установки ATMEL Studio).
Подробные сведения о цели, включая код запуска и файлы определения компоновщика, можно найти в каталоге ref_app/target и его подкаталогах. Для каждой поддерживаемой целевой системы микроконтроллера существуют отдельные подкаталоги.
Конфигурация MICROCHIP(R) [ранее ATMEL(R)] AVR(R), называемая target avr
, работает на классической плате, совместимой с ARDUINO(R). Программа включает желтый светодиод на portb.5
.
Конфигурация MICROCHIP(R) [бывший ATMEL(R)] ATmega4809, называемая target atmega4809
работает на ARDUINO(R) КАЖДОЙ совместимой плате с тактовой частотой внутреннего резонатора porte.2
(т.е. D5
).
Реализация Espressif (XTENSA) NodeMCU ESP32 использует подмножество Espressif SDK для запуска эталонного приложения с одной задачей ОС исключительно на одном из своих ядер.
Конфигурация платы NXP(R) OM13093 LPC11C24 ARM(R) Cortex(R)-M0+ под названием «target lpc11c24» переключает светодиод на port0.8
.
Конфигурация ARM(R) Cortex(R)-M3 (называемая target stm32f100
) работает на плате STM32VL-DISCOVERY, коммерчески доступной от ST Microelectronics(R). Программа включает синий светодиод на portc.8
.
Вторая конфигурация ARM(R) Cortex(R)-M3 (называемая target stm32l100c
) работает на плате STM32L100-DISCOVERY, коммерчески доступной от ST Microelectronics(R). Программа включает синий светодиод на portc.8
.
Третья конфигурация ARM(R) Cortex(R)-M3 (называемая target stm32l152
) работает на плате STM32L152C-DISCOVERY, коммерчески доступной от ST Microelectronics(R). Программа переключает синий светодиод на portb.6
.
Первая конфигурация ARM(R) Cortex(R)-M4F (называемая target stm32f407
) работает на плате STM32F4-DISCOVERY, коммерчески доступной от ST Microelectronics(R). Программа переключает синий светодиод на portd.15
.
Другая конфигурация ARM(R) Cortex(R)-M4F (называемая target stm32f446
) работает на плате STM32F446-NUCLEO-64, коммерчески доступной от ST Microelectronics(R). Программа включает зеленый светодиод на porta.5
. Для интересующихся для этой системы предоставляется файл отладки Ozone.
Первая конфигурация ARM(R) Cortex(R)-M7 (называемая target stm32h7a3
) работает на плате STM32H7A3-NUCLEO-144, коммерчески доступной от ST Microelectronics(R). Программа включает зеленый светодиод на portb.0
.
Конфигурация ARM(R) A8 (называемая target am335x
) работает на плате BeagleBone (черная версия). Для белой версии тактовую частоту процессора необходимо снизить с *nix
на плате. Наша программа предназначена для загрузки BeagleBone из необработанного двоичного файла под названием MLO, хранящегося на микрокарте FAT32 SDHC. Бинарный файл включает в себя специальный загрузочный заголовок, состоящий из двух 32-битных целых чисел. Программа загружается с SD-карты в оперативную память и затем выполняется. При включении BeagleBone black необходимо нажать кнопку загрузки (S2) во время включения платы. Программа переключает первый пользовательский светодиод (LED1 на port1.21
).
Конфигурация ARM(R) 1176-JZF-S (называемая target bcm2835_raspi_b
) работает на одноядерном контроллере RaspberryPi(R) Zero (PiZero). Этот проект создает чистую программу для PiZero. Эта программа работает независимо от любого дистрибутива *nix
на плате. Наша программа предназначена для загрузки PiZero из необработанного двоичного файла. Необработанный двоичный файл называется kernel.img и хранится на микрокарте FAT32 SDHC. Программу objcopy можно использовать для извлечения необработанного двоичного файла из ELF-файла с использованием выходных флагов -O binary
. Файл kernel.img хранится на SD-карте вместе с тремя другими файлами: bootcode.bin, start.elf и (необязательно) config.txt, все они описаны в Интернете. В этот репозиторий включен полный набор загрузочного содержимого PiZero для SD-карты, на которой работает эталонное приложение. Программа переключает светодиод состояния GPIO по индексу GPIO 0x47
.
Целевая конфигурация rpi_pico_rp2040
использует RaspberryPi(R) Pico RP2040 с двухъядерным процессором ARM(R) Cortex(R)-M0+ с тактовой частотой Blinky_Pico_dual_core_nosdk
.
Целевая конфигурация rpi_pico2_rp2350
использует RaspberryPi(R) Pico2 RP2350 с двухъядерным процессором ARM(R) Cortex(R)-M33 с тактовой частотой 2040
. Аналогичным образом, двухъядерный стартап был впервые реализован благодаря усилиям, описанным в модернизированном репозитории Blinky_Pico2_dual_core_nosdk
.
Target v850es_fx2
использует классическое ядро Renesas(R) V850es/Fx2. Используется производная микроконтроллера upd703231 из стартового комплекта F-Line Drive It .
Цель riscvfe310
использует SoC SiFive RISC-V FE310 на коммерчески доступной плате Red Thing Plus от Spark Fun. Синий светодиод на порте GPIO0.5
переключается.
Адаптация для wch_ch32v307
работает на плате WCH CH32v307. Он использует микроконтроллер RISC-V CH32v307 от Nanjing Qinheng Microelectronics Co., Ltd. Синий светодиод1, вручную подключенный к порту GPIOC.0
посредством проводного соединения, обеспечивает мигание. Аналогичная адаптация wch_ch32v307_llvm
по сути такая же, за исключением того, что она использует набор инструментов LLVM RISC-V вместо GCC RISC-V.
Target nxp_imxrt1062
работает на плате Teensy 4.0 от Spark Fun. Оранжевый светодиод пользователя переключается.
По поводу других совместимых плат свяжитесь со мной напрямую или отправьте запрос на поддержку желаемой целевой системы.
Тесты производительности предоставляют масштабируемые портативные средства для определения производительности и класса производительности микроконтроллера. Для получения дополнительной информации см. подробную информацию на страницах тестов.
Проекты в этом репозитории программируются без ОС в режиме «голого железа» с использованием самописного кода запуска. Никакие внешние библиотеки, кроме собственного C++ и собственных стандартных библиотек, не используются.
Рассмотрим, например, BeagleBone Black Edition (BBB, также известную как target am335x
), которая является одной из нескольких популярных целевых систем, поддерживаемых в этом репозитории. Проекты на этой плате загружаются из файла двоичного образа MLO на SD-карте. Как и все другие проекты в этом репозитории, проекты BBB выполняют собственную статическую инициализацию и инициализацию чипа (т. е. в данном конкретном случае инициализацию чипа процессора ARM(R) 8 AM335x). Проекты BBB после инициализации переходят к main()
, которая инициализирует MCAL am335x
и запускает наш самописный планировщик многозадачности.
На изображении ниже изображен голый металл BeagleBone Black Edition в действии. В этом режиме работы с «голым железом» на BBB не работает ни ОС *nix
, ни клавиатура, ни мышь, ни монитор, ни интерфейс отладки, ни эмулятор.
Микроконтроллер на плате циклически выполняет один из упомянутых выше тестов. Первый пользовательский светодиод включается на port1.21
в многозадачном режиме, и осциллограф фиксирует в реальном времени измерение временного сигнала эталонного теста на цифровом port1.15
ввода-вывода 1.15, контакт P8.15
разъема BBB.
Значки состояния сборки отражают состояние ночных сборок и тестов CI.
avr-gcc
В репозитории ckormanyos/avr-gcc-build собраны актуальные цепочки инструментов avr-gcc
для x86_64-linux-gnu
и x86_64-w64-mingw32
. Скрипты Shell и YAML собирают avr-gcc
непосредственно из исходного кода на бегунах GHA. Кроме того, периодические выпуски GitHub предоставляют готовые наборы инструментов avr-gcc
для x86_64-linux-gnu
и x86_64-w64-mingw32
.
Этот репозиторий — отличное место, чтобы узнать, как создать собственную цепочку инструментов avr-gcc
из исходного кода. Простые, хорошо описанные сценарии оболочки и YAML просты для понимания, использования и адаптации.
Как упоминалось выше, гораздо более подробный и широкий спектр встроенных цепочек инструментов описан в ckormanyos/real-time-cpp-toolchains. К ним относятся вышеупомянутый набор инструментов avr-gcc
а также другие (некоторые из которых трудно найти где-либо еще).
Эталонное приложение и примеры (а также фрагменты кода) могут быть собраны с помощью компиляторов GNU/GCC и GNUmake на *nix
. Предполагается, что кросс-компиляторы GNU/GCC и GNUmake на *nix
доступны по стандартному пути к исполняемому файлу, например, после стандартных методов установки.
Некоторые портированные кросс-компиляторы GNU/GCC для Win*
доступны в репозитории цепочек инструментов Real-time-cpp-toolchains. Их можно использовать с конфигурациями решения микроконтроллера в эталонном приложении при разработке/сборке в Microsoft(R) VisualStudio(R). Различные другие инструменты GNU, такие как GNUmake, SED и т. д., были портированы, и их можно найти там. Они используются в файлах Makefile при создании перекрестных внедренных проектов, таких как ref_app
в Win*
.
В эталонном приложении для Win*
файлы Makefile используют самоопределяемое местоположение по умолчанию для соответствующих инструментов и цепочек инструментов GNU/GCC. Местоположение цепочки инструментов по умолчанию в Win*
— ./ref_app/tools/Util/msys64/usr/local
. Это конкретное расположение набора инструментов вдохновлено системой msys2
/ mingw64
.
Тулчейны, предназначенные для перекрестных сборок MSVC/GCC на Win*
должны располагаться там. Эти наборы инструментов не являются частью этого репозитория, и их необходимо получить отдельно при использовании поддерживаемых сборок Win*
и при дополнительном использовании проектов VisualStudio(R) с CMD Batch.
Подробные инструкции по получению и использованию цепочек инструментов для перекрестных сборок MSVC/GCC на Win*
доступны в репозитории real-time-cpp-toolchains. Эти инструкции содержат рекомендации по использованию этих наборов инструментов при выборе проекта Microsoft(R) VisualStudio(R) (с помощью обычного, описанного выше способа MSVC/ Win*
) для создания эталонного приложения.
Для создания ссылки требуется порт GNU/GCC (или другой компилятор) с высоким уровнем понимания и соответствия C++ 14 (или выше), например GCC 5–13 (более высокий уровень обычно более выгоден) или MSVC 14.2 или выше. приложение (а также примеры и фрагменты кода).
Некоторые фрагменты кода демонстрируют элементы языка не только из C++14, но также из C++17, 20, 23 и более поздних версий. Поэтому компилятор с поддержкой C++17 или даже C++20, 23 (например, GCC 13, clang 15, MSVC 14.3 или выше) может быть полезен для успешной обработки всех фрагментов кода.
<chrono>
, <ratio>
и некоторые внутренние заголовки свойств, лицензируются по лицензии GNU General Public License версии 3 или выше.