我现在尝试创建运行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函数代码?
答案 0 :(得分:0)
确保所需函数不会被垃圾收集的一种方法是在使用 的方法中创建指向该函数的函数指针。您不必对函数指针进行任何操作,只需对其进行初始化即可。
void(*dummy)(uint32_t)=&writeSPI;
另一种选择是从编译单元中省略-ffunction-sections
标志,该标志包含不应剥离的函数,但可能会导致代码库的重大重组。