Как сохранить неиспользуемую функцию в образе прошивки, используя набор инструментов arm-none-eabi-gcc? - PullRequest
0 голосов
/ 02 ноября 2018

Я сейчас пытаюсь создать образ прошивки под управлением STM32F0xx MCU. Это похоже на алгоритм флеш-памяти, обеспечивает некоторый вызов функции для управления выводами микроконтроллера STM32F0xx, но он сложнее, чем алгоритм флеш-памяти. Поэтому он будет использовать STM32 HAL lib и Mbed lib.

Компилятор / компоновщик использует флаги "-ffunction-section" и "-fdata-section".

Поэтому я использую атрибут " (( used ))", чтобы попытаться сохранить функцию в образе прошивки, но она не удалась.
Версия набора инструментов arm-none-eabi-gcc - 4.9.3.

Мои коды такие:

extern "C" {
__attribute__((__used__))  void writeSPI(uint32_t value)
{
    for (int i = 0; i < spiPinsNum; i++) {
        spiPins[i] = (((value >> i) & 0x01) != 0) ? 1 : 0;
    }
    __ASM volatile ("movs r0, #0"); // set R0 to 0 show success
    __ASM volatile ("bkpt  #0");   // halt MCU
}

}

После успешной сборки символ writeSPI no в изображении. Я также пробую static для функции, флаг "-uXXXXX", создайте новый раздел.

Вопрос: Как сохранить код функции writeSPI с флагами "-ffunction-section" и "-fdata-section"?

1 Ответ

0 голосов
/ 06 ноября 2018

Один из способов гарантировать, что искомая функция не будет собирать мусор, - это создать указатель на функцию в методе, который используется . Вам не нужно ничего делать с указателем функции, просто инициализируйте его.

void(*dummy)(uint32_t)=&writeSPI;

В качестве альтернативы можно было бы опустить флаг -ffunction-sections в модулях компиляции, которые содержат функции, которые не должны быть удалены, но это может повлечь за собой существенную реструктуризацию вашей кодовой базы.

...