Разработка для встраиваемых систем на базе ARM-микроконтроллеров с использованием Free Pascal (FPC) и Lazarus — мощное сочетание, но процесс настройки может вызвать затруднения даже у опытных разработчиков. В этой статье разберем типичные проблемы при настройке проекта для STM32F103X8 и предложим рабочие решения.
Основные проблемы и их причины
Из обсуждения на форуме выделяем ключевые сложности:
1. Ошибки конфигурации fpcupdeluxe: неполная настройка путей
2. Отсутствие system.ppu: неправильные параметры компиляции
3. Путаница с параметрами: -Cp, -Ca, -Wp
4. Интеграция с Lazarus: расхождения между IDE и командной строкой
Шаг 1: Проверка базовой установки
После использования fpcupdeluxe убедитесь в наличии критически важных каталогов:
# Для Linux-хоста (адаптируйте для Windows)
~/fpcupdeluxe/
├── cross/
│ ├── bin/arm-embedded/
│ └── lib/arm-embedded/
├── fpc/
│ ├── units/arm-embedded/
│ └── bin/x86_64-linux/ppcrossarm
└── lazarus/ # IDE
Проверьте версию компилятора:
~/fpcupdeluxe/fpc/bin/x86_64-linux/ppcrossarm -i
Ожидаемый вывод должен включать поддержку arm-embedded.
Шаг 2: Настройка fpc.cfg и параметров компиляции
Главный конфигурационный файл fpc.cfg содержит условные секции для разных целей. Вот фрагмент для ARM Embedded:
# begin fpcup do not remove arm-embedded
#IFDEF EMBEDDED
#IFDEF CPUARM
-FD$(FPCDIR)/cross/bin/arm-embedded
-XParm-none-eabi-
-Fl$(FPCDIR)/cross/lib/arm-embedded/$fpcsubarch/$fpcabi
-Fu$(FPCDIR)/fpc/units/arm-embedded/$fpcsubarch/$fpcabi/rtl
#ENDIF CPUARM
#ENDIF EMBEDDED
# end fpcup do not remove
Ключевые параметры для STM32F103X8:
-Parm # Архитектура процессора
-Tembedded # Целевая ОС
-Cparmv7m # Поддержка Cortex-M3
-CaEABI # ABI интерфейс
-WpSTM32F103X8 # Конкретный чип
Config and Target: Target OS (-T): embedded Target CPU family (-P): arm Subtarget (-Cp): armv7m ABI (-Ca): EABI
Дополнительные параметры: Custom Options: -WpSTM32F103X8
Проверка путей: Paths > Other Unit Files (-Fu) должно включать: $(FPCDIR)/units/arm-embedded/armv7m/eabi/rtl $(FPCDIR)/units/arm-embedded/armv7m/eabi/packages
Альтернативное решение: Ручная настройка без fpcupdeluxe
Если автоматическая установка не работает:
Скачайте исходники FPC и Lazarus
Скомпилируйте кросс-компилятор:
make clean all OS_TARGET=embedded CPU_TARGET=arm SUBTARGET=armv7m
program blink;
{$LINKLIB gcc} // Важно для встроенных функций
procedure Delay(count: longint); assembler;
asm
.Loop:
subs r0, r0, #1
bne .Loop
end;
begin
// Настройка GPIO для STM32F103X8
PLongWord($40021000)^ := PLongWord($40021000)^ or $04; // RCC_APB2ENR: IOPCEN
PLongWord($40011004)^ := $44344444; // GPIOC_CRH: PC13 as output
// Бесконечный цикл мигания светодиодом
while True do
begin
PLongWord($4001100C)^ := PLongWord($4001100C)^ or $2000; // GPIOC_BSRR: Set PC13
Delay(500000);
PLongWord($4001100C)^ := $20000000; // GPIOC_BSRR: Reset PC13
Delay(500000);
end;
end.
Частые ошибки и решения
"Illegal parameter: -Cparmv7m":
Убедитесь, что используется -Parm перед -Cp
Дублирование путей в Lazarus:
Удалите стандартные пути через Tools > Options > Compiler Options > Inherited
Несовпадение версий RTL и компилятора: bash make -C ~/fpcupdeluxe/fpc rtl_clean rtl OS_TARGET=embedded CPU_TARGET=arm SUBTARGET=armv7m
Проблемы с линковкой:
Добавьте в параметры: bash -Xe--gc-sections -Xl,--no-undefined
Заключение
Настройка среды для разработки под ARM Embedded требует внимания к деталям конфигурации. Используйте предложенные решения как пошаговое руководство, а при возникновении проблем возвращайтесь к проверке базовых параметров компиляции. Сообщество Free Pascal активно развивает поддержку микроконтроллеров, что делает эту экосистему перспективным выбором для embedded-разработки.
Проблемы настройки и компиляции проекта для STM32F103X8 с использованием FPC/Lazarus и их решения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS