Я работал с STM32F2 (в частности, STM32F217IGH6 на плате разработки) около двух месяцев. Безусловно, моя самая большая проблема была связана с «установкой», которая включает make-файл, скрипт компоновщика и файл запуска.
В частности, я не смог правильно настроить таблицу векторов прерываний и вызвал обработчики прерываний. ST предоставляет примеры, адаптированные для коммерческих IDE. Вместо этого я использую бесплатную Yagarto перекомпиляцию цепочки инструментов GCC (и OpenOCD для загрузки изображения через JTAG).
Существуют ли примеры проектов для моей доски (или ближайших родственников), которые содержат соответствующий make-файл, сценарий компоновщика и комбинацию файлов запуска для некоммерческих сред IDE, которые настроены для вызова обработчиков прерываний?
Ответы:
http://github.com/dwelch67
stm32f4 и stm32vld в частности, но другие могут быть полезны для вас. mbed и каталог mzero в mbed (cortex-m0).
Мне нравится простой и глупый подход, минимальные сценарии компоновщика, минимальный загрузочный код и т. Д. Работа выполняется кодом, а не каким-либо конкретным набором инструментов.
Большинство форм gcc и binutils (способных работать с большим пальцем) будут работать с этими примерами, так как я использую компилятор не как ресурс для библиотечных вызовов, я не использую скрипты стандартного компоновщика и т. Д. Старые gcc и binutils не будут знать о новые части thumb2, поэтому могут потребоваться некоторые изменения.
Я создаю свои собственные gcc, binutils и llvm / clang, а также использую, например, источник кодов (сейчас наставник графики, но вы все еще можете получить бесплатную / облегченную версию).
Esp, когда вы начинаете собирать проект для новой цели, вам нужно сделать несколько разборок. В частности, чтобы убедиться, что элементы находятся там, где вы хотите, например, векторная таблица.
Посмотрите на stm32f4d / blinker02 например. Он начинается с vectors.s таблица исключений / векторов плюс некоторые подпрограммы поддержки asm:
В этом примере нет прерываний, но другие вещи, которые вам нужны, здесь.
blinker02.c содержит основную часть кода C с точкой входа C, которую я вызываю notmain (), чтобы не называть ее главной (некоторые компиляторы добавляют ненужные файлы в ваш двоичный файл, когда у вас есть main ()).
избавит вас от кроя и пасты. make-файл рассказывает историю компиляции и компоновки. Обратите внимание, что ряд моих примеров компилирует два или более двоичных файла из одного и того же кода. компилятор gcc, clang-компилятор llvm, только thumb и thumb2, различные оптимизации и т. д.
Начните с создания объектных файлов из исходных файлов.
компоновщик, ld, использует скрипт компоновщика, который я называю memmap, он может быть чрезвычайно болезненным, иногда по уважительной причине, иногда нет. Я предпочитаю, чем меньше, тем больше подход к одному и тому же размеру для всех, кроме подхода к мойке.
Я обычно не использую .data (ну, почти никогда), и в этом примере нет необходимости в .bss, так что вот сценарий компоновщика, которого достаточно, чтобы разместить программу (.text) там, где она должна быть для этого процессора. используй это.
У меня есть область памяти, чтобы определить, что нет ничего особенного в имени памяти, которую вы можете назвать foo, bar или bob или ted, не имеет значения, просто связывает элементы памяти с разделами. Разделы определяют такие вещи, как .text, .data, .bss, .rodata и где они находятся на карте памяти.
когда вы создаете это, вы видите, я разбираю все (objdump -D), вы видите это
Ключевым моментом, который стоит отметить, является адрес слева, где мы его и хотели, код vectors.s сначала находится в двоичном файле (поскольку он находится первым в командной строке ld, если вы не сделаете что-то в сценарии компоновщика, элементы будут отображаться в двоичном виде в том порядке, в котором они находятся в командной строке ld). Для правильной загрузки вы должны убедиться, что ваша таблица векторов находится в нужном месте. Первый элемент - мой адрес стека, это нормально. Второй элемент - это адрес _start, и он должен быть нечетным числом. использование .thumb_func перед меткой приводит к тому, что это происходит, поэтому вам не нужно делать другие уродливые вещи.
поэтому 0x08000051 и 0x08000057 являются правильными векторными записями для _start и hang. начать звонки notmain ()
Это выглядит хорошо (они не показывают нечетные адреса в разборке).
Все хорошо.
Перейдите к примеру blinker05, этот поддерживает прерывания. и нуждается в некотором оперативной памяти, поэтому .bss определен.
помните, что ram и rom - произвольные имена, bob and ted, foo и bar - все работает отлично.
Не собираюсь показывать целые векторы. Потому что cortex-m3 имеет миллион записей в таблице векторов, если вы делаете полную (варьируется от ядра к ядру и, возможно, в пределах одного и того же ядра в зависимости от параметров, выбранных производителем чипа) Соответствующие части находятся здесь после разборки:
Требуется некоторое количество проб и ошибок, чтобы поместить этот обработчик точно в нужное место, проверить с вашим чипом, где он должен быть, он не обязательно находится в том же месте, что и этот, и с таким количеством прерываний вы все равно можете искать другое прерывание. процессоры cortex-m, в отличие от обычных рук, делают это таким образом, чтобы вам не требовался батутный код для прерываний, они сохраняют определенное количество регистров и управляют переключением режимов процессора через содержимое регистров связи. до тех пор, пока аппаратное обеспечение и интерфейс для компилятора достаточно близки, все это работает. В этом случае я сделал обработчик в C, в отличие от других платформ и прошлого, вам не нужно делать ничего особенного с компилятором / синтаксисом, просто сделайте функцию (но не делайте глупых вещей в функции / обработчике)
Makefile для blinker05 должен напоминать пример blinker02, в большинстве случаев он вырезан и вставлен. превратить отдельные исходные файлы в объекты, а затем связать. Я делаю сборку для большого пальца, thumb2, используя gcc и clang. Вы можете изменить строку all: на тот момент, чтобы включить элементы gcc, только если вы не включили / хотите использовать clang (llvm). Я использую binutils, чтобы собрать и связать вывод clang между прочим.
Во всех этих проектах используются бесплатные, готовые к использованию инструменты с открытым исходным кодом. нет IDE, только командная строка. Да, я связываюсь только с Linux, но не с Windows, но эти инструменты также доступны для пользователей Windows, меняя что-то вроде rm -f на что-то, что делится в make-файле, и тому подобное при сборке на windows. Это или запустить Linux на VMware или VirtualBox или QEMU. Отсутствие IDE означает, что вы также выбираете свой текстовый редактор, я не буду вдаваться в подробности, у меня есть мои любимые. Обратите внимание, что чрезвычайно раздражающей особенностью программы gnu make является то, что она требует наличия реальных вкладок в make-файле, я страстно ненавижу невидимые вкладки. Итак, один текстовый редактор для make-файлов, который оставляет вкладки, другой для исходного кода, который создает пробелы. Я не знаю об окнах,
Надеюсь, это поможет, это не точная микросхема / плата, а скважина m4 cortex-m4, а не m3, достаточно близкая для этого обсуждения. см. каталог mbed или stm32vld для получения информации о действительном cortex-m3 (не достаточно отличий от m4 для make-файлов, загрузочного кода и т. д.), но не сделанных st. Ядра cortex-m3 должны быть одинаковыми у разных поставщиков, cortex-m3 и cortex-m4 оба ARMv7m и ближе, чем различаются. Cortex-m0 - это ARMv6m, вряд ли у него достаточно инструкций thumb2, чтобы компиляторы его не догоняли, поэтому используйте только большой палец (представьте, что вы строите для ARMv4T (только большой палец), если это необходимо). Мой симулятор большого пальца - это только thumb, но не thumb2, он может быть полезен и вам, я думаю, я заставил его выполнять прерывания в той или иной форме.
источник
Вы можете взглянуть на этот сайт, где он пытается объяснить основы компоновщика и low_level_init в коде.
Обратите внимание, что страница сфокусирована на описании проблемы, поэтому вектор nvic является минимальным.
Затем у вас есть более полные примеры в «библиотеке стандартных периферийных устройств STM32F2xx», просто посмотрите разделы gcc (поскольку Yagarto основан на gcc). И там есть пример кода, который поможет вам с правильной настройкой nvic (таблицы векторов прерываний).
Поэтому, даже если это не полный ответ, я надеюсь, что он все равно будет полезен.
источник