首页 > 解决方案 > 如何使用 arm-none-eabi-gcc 工具链在固件映像中保留未使用的功能?

问题描述

我现在尝试创建一个运行 STM32F0xx MCU 的固件映像。类似于flash算法,提供一些函数调用来控制STM32F0xx MCU Pins,但比flash算法复杂。所以它将使用 STM32 HAL 库和 Mbed 库。

编译器/链接器使用“-ffunction-sections”和“-fdata-sections”标志。

所以我使用“属性((使用))”尝试将功能保留到固件映像中,但它失败了。
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 符号。我也尝试static了功能,“-uXXXX”标志,创建一个新部分。

问题:如何保留带有“-ffunction-sections”和“-fdata-sections”标志的writeSPI函数代码?

标签: gccattributesarm

解决方案


确保所需函数不会被垃圾收集的一种方法在使用的方法中创建指向它的函数指针。您不必对函数指针做任何事情,只需初始化它。

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

另一种方法是-ffunction-sections从包含不应剥离的函数的编译单元中省略标志,但这可能涉及对代码库的重大重组。


推荐阅读