如何使用arm-none-eabi-gcc工具链保持固件映像中未使用的功能?

时间:2018-11-02 07:45:21

标签: gcc attributes arm

我现在尝试创建运行STM32F0xx MCU的固件映像。就像闪存算法一样,提供了一些函数调用来控制STM32F0xx MCU引脚,但是它比闪存算法复杂。因此它将使用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符号为no。 我还尝试使用static作为功能(“ -uXXXXX”标志),创建一个新部分。

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

1 个答案:

答案 0 :(得分:0)

确保所需函数不会被垃圾收集的一种方法是在使用 的方法中创建指向该函数的函数指针。您不必对函数指针进行任何操作,只需对其进行初始化即可。

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

另一种选择是从编译单元中省略-ffunction-sections标志,该标志包含不应剥离的函数,但可能会导致代码库的重大重组。