当前位置: 首页 > 知识库问答 >
问题:

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

罗宪
2023-03-14

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

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

所以我使用“attribute((used))”尝试将函数保留在固件映像中,但失败了
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对于函数“-uxxx”标志,创建一个新的部分。

问:如何保持带有“-ffunction-节”和“-fdata-节”标志的写SPI函数代码?

共有1个答案

吴康平
2023-03-14

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

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

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

 类似资料:
  • 我有一个项目,我想在链接阶段保留某些功能/部分。 我试过: 但这是针对编译器的,而不是针对链接器的。 现在链接器负责并使用了-gc部分,我想保留的功能“消失了”:( 如何指示链接器不删除所需的函数。 我想这样做的原因是函数的后期构建用法,通过改变二进制文件上的内容。

  • #include <stdio.h> union Type { int a; int *b; }; int main() { printf("sizeof(union Type) is %lu\n", sizeof(union Type)); return 0; } 技巧 使用gcc -g编译生成的程序,是不包含union Type的符号信息: (gdb) p sizeof(

  • 我使用的是leanback库,它需要Android17或更高版本。但是我的应用程序支持16的minSDK,所以我从gradle那里得到了一个构建错误 当我查看构建工具文档时,我看到了如何将标记添加到清单中,但问题是我在gradle文件中而不是在清单中声明了minSdk。 在build.gradle而不是AndroidManifest.xml中声明minSdk时,如何使用?

  • 我目前正在使用ECS部署web应用程序。此应用程序在我的ECR上推送,带有最新标签,但放置新图像似乎不会改变部署时的代码。 我尝试使用在这里找到的答案如何将更新的Docker映像部署到Amazon ECS任务?使用 放在我的ECS配置中,并将部署\u minimum\u health\u percent=0和部署\u maximum\u percent=200放在我的部署设置中。 我注意到图像摘要

  • 了解“基本”和“高级”工具栏,以及如何自定义工具栏、创建新工具栏及管理多个工具栏。 启动 Illustrator 后,屏幕左侧会出现一个工具栏,其中包含处理文档时需要使用的各种工具。您可以使用工具栏中的工具执行各种任务,例如创建、选择和处理对象以及选择、文字、上色、绘制、采样、编辑和移动图像。 工具栏类型 Illustrator 提供以下类型的工具栏: 基本:启动 Illustrator 后,默认

  • 了解“基本”和“高级”工具栏,以及如何自定义工具栏、创建新工具栏及管理多个工具栏。 启动 Illustrator 后,屏幕左侧会出现一个工具栏,其中包含处理文档时需要使用的各种工具。您可以使用工具栏中的工具执行各种任务,例如创建、选择和处理对象以及选择、文字、上色、绘制、采样、编辑和移动图像。 工具栏类型 Illustrator 提供以下类型的工具栏: 基本:启动 Illustrator 后,默认