`OpenOCD` - сервер отладки ```bash $ sudo wget -qO /etc/apt/trusted.gpg.d/kitware-key.asc https://apt.kitware.com/keys/kitware-archive-latest.asc $ echo "deb https://apt.kitware.com/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/kitware.list $ sudo add-apt-repository -y ppa:git-core/ppasudo apt update $ sudo apt upgradesudo apt install -y build-essential make libtool pkg-config cmake curl automake autoconf gcc git texinfo python3-dev libpython3-dev liblzma5 libncurses5 libncurses5-dev libusb-1.0-0-dev libgtk-3-dev libstlink-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev xz-utils tk-dev ```
GCC
`-nostdlib` - не использовать стандартные библиотеки, взять заглушки. Библиотеки GNU ARM используют `newlib` для обеспечения стандартной реализации библиотек C. Конкретнее `newlib-namo` ```bash $ arm-none-eabi-gcc main.c delay.c -o main.elf -nostdlib ``` `mcpu=cortex-m0` или `march=` - архитектура `-mthumb` - набор команд `-mfloat-abi=soft` - если нет модуля fpu `-std=gnu11` - стандарт GNU `--specs=nano.specs` - для использования библиотеки `newlib-nano` `--specs=nosys.specs` - для использования библиотеки `nosys` `-Wall` - включить все warnings `-g` - включить отладку Получить файл после препроцессора: ```bash $ arm-none-eabi-gcc main.c delay.c -nostdlib -E > main.i ``` Получить объектный файл: ```bash $ arm-none-eabi-gcc main.i -o main.o -nostdlib -fpreprocessed-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs -g ``` Получить файл ассемблера: ```bash $ arm-none-eabi-gcc -s main.c -o main.s -S -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs ``` Вывести заголовок elf-файла: ```bash $ arm-none-eabi-readelf -h main.o ``` Получить объектный файл (остановиться перед компоновкой): ```bash $ arm-none-eabi-gcc -c main.c -o main.o -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs $ arm-none-eabi-gcc -c delay.c -o delay.o -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs ``` Вывести dump объектного файла: ```bash $ arm-none-eabi-objdump -h main.o ```
Секции
**.text** - код и константные значения **.data** - инициализированные переменные **.bss** - неинициализированные переменные **.rodata** - данные только для чтения (пример const uint32_t delay_max = 0x0100) **.comment** - информация о версии компилятора **.ARM.attributes** - служебные сведения (не используются в конечной прошивке) Посмотреть содержимое секции в объектном файле: ```bash $ arm-none-eabi-objdump -s -j .text main.o ``` Вывести таблицу символов из объектного файла: ```bash $ arm-none-eabi-objdump --syms main.o ```
Линкер
**Линкер** соединяет секции в нескольких объектных файлах и размещает их в памяти. **Секции в файле линкера:** - ENTRY - сообщает точку входа и указывает первую инструкцию - MEMORY - участи памяти целевой системы - SECTIONS - раскладка содержания секций объектных файлов в памяти **Секции из объектных файлов:** - Секция **.isr_vector** — это служебная секция, которая не создается по умолчанию и ее необходимо создать вручную. По сути, в ней указывается вектор обработчика прерываний ISR, который должен находиться по адресу 0x0000 0000; - Секция **.text** — это исполняемый код, находящийся во Flash; - Секция **.data** — это переменные, размещенные в SRAM; - Секция **.rodata** — это константы, размещенные в Flash; - Секция **.bss** — это объявленные, но не инициализированные переменные, то есть с нулевым значением при старте, которые будут размещены в SRAM. **Служебные символы:** - `_etext` — конец секции .text - `_sdata` — старт секции .data - `_edata` — конец секции .data; - `_sbss` — старт секции .bss; - `_ebss` — конец секции .bss.