如何在固件镜像中保留未使用的功能使用arm-none eabi-gcc工具链



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

编译器/链接器使用"-ffunction sections"one_answers"-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"one_answers"-fdata sections"标志的writeSPI函数代码?

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

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

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

最新更新