gcc - 如何使用 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函数代码?
解决方案
确保所需函数不会被垃圾收集的一种方法是在使用的方法中创建指向它的函数指针。您不必对函数指针做任何事情,只需初始化它。
void(*dummy)(uint32_t)=&writeSPI;
另一种方法是-ffunction-sections
从包含不应剥离的函数的编译单元中省略标志,但这可能涉及对代码库的重大重组。
推荐阅读
- vue.js - 如何使用多个选择按钮过滤 Vue.js 中的数组?
- c++ - 将函数 SetKeys 添加到 MFRC522 库
- azure - Azure App Service Deploy 返回 (403) Forbidden with IP 限制
- php - 如何修复 Yii2 自定义视图控制器的 URL
- git - 可以将 Composer 配置为使用 http 而不是 git clone git@
- django - Django 应用程序使用哪种 nginx 负载平衡方法?
- c# - Prism 的 RegionManager.RequestNavigate 在 WPF 中不起作用
- django - Django ModelForm 不适用于十进制字段
- c# - 将应用程序中捕获的字符串与具有两种不同预期语言的代码中的正则表达式模式进行比较
- mysql - 从一个随机列 MySQL 中选择 2 个随机记录