Я программирую микроконтроллер STM32F413 с помощью SystemWorkbench 4 stm32. Векторы прерывания определены в файле запуска сборки как слабые псевдонимы, как показано ниже:
.weak TIM1_UP_TIM10_IRQHandler
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
И упоминается в объекте следующим образом:
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.....
.word TIM1_UP_TIM10_IRQHandler
.....
Так что g_pfnVectors
это список адресов функций обработчика IRQ. Они объявлены как слабые псевдонимы, поэтому, если они не определены пользователем, используется обработчик по умолчанию.
Я определил обработчик следующим образом:
extern "C" {
void TIM1_UP_TIM10_IRQHandler() {
if (SU_TIM->SR & TIM_SR_UIF) {
SU_TIM->SR &= ~TIM_SR_UIF;
...
}
}
}
Это прекрасно работает с обычными флагами оптимизации компилятора, однако я хотел попробовать, если я получу меньший и, возможно, более быстрый код с -flto
(в основном для того, чтобы попробовать его, на самом деле это не нужно). Но при компиляции с -flto
g++ игнорирует мою реализацию обработчика и просто использует обработчик по умолчанию, моего обработчика вообще нет в коде.
Поэтому я попытался заставить g++ включить функцию, добавив __attribute__((used))
в определение функции, но она все еще не была скомпилирована. Однако, если я дам ему другое имя, тогда он был включен в двоичный файл. Также, если я удалю слабый псевдоним и просто укажу ссылку на обработчик в файле запуска, это тоже сработает.
Так что слабые псевдонимы почему-то не работают с оптимизацией времени ссылки g++. Может быть, кто-нибудь может сказать мне, что это за ошибка и что я делаю неправильно здесь.
РЕДАКТИРОВАТЬ:
Я посмотрел, какие символы создаются с помощью nm в результирующем файле .elf, и TIM1_UP_TIM10_IRQHandler
экспортируется как слабый символ с адресом DefaultHandler. Однако при просмотре только файла .o из модуля компиляции, содержащего функцию TIM1_UP_TIM10_IRQHandler
, он экспортируется как символ в текстовом разделе (T). Таким образом, компоновщик по какой-то причине предпочитает сохранить слабый символ, даже если есть сильный символ с тем же именем.