Я отлаживаю проект STM32, созданный с помощью CMake. Он использует библиотеку HAL, и в начале я настраиваю HAL и SysTick.
root/
├─ core/
│ ├─ core.c
│ ├─ core.h
│ ├─ stm32g4xx_it.c
│ ├─ stm32g4xx_it.h
│ ├─ CMakeLists
├─ main.c
├─ startup.s
├─ CMakeLists.txt
startup.s
содержит слабый SysTick_Handler, а именно:
.weak SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler
stm32g4xx_it.c
также содержит SysTick_Handler
, который переопределяет слабое объявление. Проблема в том, что при компиляции, компоновке и загрузке приложения, как показано выше, прерывание SysTick заканчивается на Default_Handler
. Если я удаляю слабое объявление из файла startup.s
, то он работает правильно и выполняется правильная функция обработчика. Я думаю, что это результат того, как работает cmake. В корневом каталоге находится основной файл CMakeLists.txt, который компилирует файлы startup.s
и main.c
, а затем связывает основную библиотеку. Правильный SysTick handler
помещается в основную библиотеку, поэтому компиляция файла startup.s
не видит другую реализацию этой функции-обработчика. Каков правильный, но элегантный подход к ее решению?
Другой вопрос, который приходит мне на ум, заключается в том, как мне написать код для других обработчиков прерываний и как связать их в системе сборки CMake? Допустим, у меня есть модуль UART, и этот модуль имеет свои собственные обработчики прерываний. Должен ли я создать отдельную библиотеку на основе файла startup.s
и связать с ней все остальные модули, имеющие обработчики прерываний? Я думал, что CMake должен сделать сборку более прозрачной, читабельной и простой, но в этом случае это больше похоже на спагетти. Наверное, я что-то упускаю...
РЕДАКТИРОВАТЬ 14.04.2021
Я узнал, что проблема связана только с файлом запуска asm. Например, я могу создать символ слабой функции в main.c, например:
__attribute__((weak)) void SystemInit(void)
В основной библиотеке в core.c я создаю функцию:
void SystemInit(void)
затем после компиляции и компоновки используется правильная функция из core.c. Итак, похоже, что здесь есть что-то, строго связанное с ассемблерным файлом.