Спасибо за ответ из службы поддержки, конкретно Степанову Игорю ООО "Ангиоскан-Электроникс"
1. Проблема вызвана ошибкой в линкере MCLINK, которая связана с алгоритмом удаления неиспользуемого кода для функций, размещаемых в RAM. Спасибо Вам большое за обнаружение этой ошибки. Мы сейчас работаем над ее исправлением (ожидается, что ошибка будет исправлена в ближайшем релизе CodeMaster-ARM). Для обхода ошибки достаточно исключить из Вашего проекта модуль MDR32F9Qx_eeprom.c - единственный, в котором используются RAM-функции (в проекте он реально не используется).
По работе с startup:
2. Метка ?cstart - это начало служебного startup-кода, который выполняется до передачи управления в функцию main: инициализация статических переменных, копирование кода RAM-функций, инициализация heap (если в программе используются функции работы с динамической памятью стандартной библиотеки C). Этот код выполняется после вызова C-функции SystemInit(), реализация которой по умолчанию в рамках библиотеки "MDR32F9Qx Standard Peripherals Library" включена в модуль CMSIS\CM3\DeviceSupport\MDR32F9Qx\startup\system_MDR32F9Qx.c. Для того, чтобы выполнить собственный startup-код, рекомендуется создать свой модуль, скопировав в него содержимое system_MDR32F9Qx.c, адаптировать и включить его в проект вместо system_MDR32F9Qx.c. В частности, вызов собственных функций, которые должны выполняться на этапе strartup, можно включить в тело функции SystemInit, после вызова SystemCoreClockUpdate (реализация которой также находится в модуле system_MDR32F9Qx.c). При реализации собственного startup-кода нужно помнить, что на этом этапе статические переменные еще не инициализированы.
3. Для перекрытия обработчика прерывания достаточно реализовать в своем проекте функцию с таким же именем, которое задано в таблице векторов прерываний (__Vectors) модуля startup_1986BE9x.mca. Только если по каким-то причинам обработчики прерываний должны иметь другую конвенцию имен, нужно делать свой вариант startup_1986BE9x.mca и редактировать таблицу __Vectors (так как это сделано у Вас). В любом случае, комментировать модули с реализацией обработчиков по умолчанию, или писать свои аналогичные заглушки не обязательно - это низкоприоритетные библиотечные модули, которые в случае перекрытия обработчиков линковаться не будут. Также, см. п. "Обработка прерываний" (раздел "Обработка прерываний для моделей Cortex-M") Руководства по компилятору Си CMC-ARM.
|