问题标签 [arm-none-eabi-gcc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
198 浏览

arm - Arm-Embedded-GCC 工具链 - 差异版本 7 和 9

我们将基于 GCC 的 ARM Embedded Toolchain 用于我们的 Cortex-M3 项目(由 ARM 维护的 arm-none-eabi)。

我们最近在一个使用 GNU11 和 GNU++14 以及 newlib-nano (nano.specs) 的项目中从 7.2.1 升级到了 9.3.1,优化级别设置为 Og。

我们面临一些奇怪的行为,突然随机一个 GPIO 不再打开/关闭,如果我们使用 7.2.1,则不会发生这种情况。当单步执行程序检查为什么它不再切换时,所有命令都正确执行:初始化,然后将值写入 GPIO。同样值得注意的是,如果我们将优化级别更改为任何其他级别(O0、01、02、0s),它会再次起作用,似乎 9.3.1 的 Og 会破坏某些东西。

然后我们继续并开始搜索我们必须从优化中排除的代码部分(哪个函数或哪个指令),以便它再次变得可运行。在那里我们没有找到解决方案,因为它不是一个函数调用。通过缩小随机范围,只需禁用与访问GPIO无关的随机功能的优化,它就可以再次工作。

目前我们不知道如何进一步处理此事,以找到这种行为的根本原因。

问题:

  • 在 Gnu11/Gnu++14、newlib-nano 和优化调试 (Og) 方面,7.2.1 和 9.3.1 之间有什么变化?
  • 如何解释旧版本似乎生成了一个可运行的二进制文件,而新版本会导致问题?
  • 你怎么解释,为什么只有 Og 会造成麻烦,而所有其他优化级别似乎都可以正常工作?

高度赞赏任何提示/输入。

0 投票
2 回答
1046 浏览

windows - 断言失败:工具链无法构建虚拟 C 文件

一些学生和我自己一直在尝试在 Windows 10 下建立 Zephyr RTOS 构建环境,以构建针对各种 ARM Cortex M 板的应用程序。我们每个人都遵循了 Zephyr“入门指南”并遇到了同样的问题。当为许多不同的板子编译时(我们这里只使用 nrf52840dk_nrf52840 作为例子)我们得到这个错误:

错误信息

此错误将我们指向文件:CMakeError 和 CMakeOutput。以下是他们的内容:

CMake错误

CMake输出

我的问题:

  1. 这个错误是什么意思?
  2. 如何修复它,以便我可以成功构建应用程序。
0 投票
1 回答
144 浏览

linker - 使用 arm-none-eabi-gcc 编译器为 RaspberryPI2 和 BeableBoneBlack 编译 sqrt 函数时出错

我是这种编码的新手,我正在尝试为 Cortex-A 处理器执行一些测试执行裸机软件。我有使用 Cortex-M MCU 的经验,我使用 ARM-Keil 之类的 IDE 和 Nordic 的 SDK 编译了一些 BLE 作业的代码。现在我想尝试更好地了解 Cortex-A 的世界,我将从我在网上找到的一些示例开始以裸机方式学习编码。我有一些使用 Cortex-M 的 freeRTOS 的经验,所以我在网上找到了一些好人的 git 存储库,它为 RaspberryPI 和 BeableBoneBlack 移植了 freeRTOS。从现在开始,我将只为 BeableBoneBlack 解释我的问题,因为对于 RaspberryPI,它是相似的。

我在 linux 上,我安装了 gcc-arm-none-eabi 编译器,所以我从这个链接克隆了带有 freeRTOS 存储库的 BeagleBone Black 。

我通常使用 VS Code 来编写代码,所以在集成终端中,当我运行命令时,它正常工作,并且我的 BBB 会正确闪烁。所以现在我想改进我的代码,为了做一些测试,我想使用stdlib.hrand()中的函数。不幸的是,我发现有一些错误:. 最近几个月,在使用 BBB 进行测试之前,我找到了 RPi2 的其他存储库,并且我了解了有关 arm-none-eabi 编译器的链接器的一些信息,这需要在此过程中添加一些参数以按顺序链接库文件。从这个 repo 现在我有两个文件: makedefs_timakefile。打开我在第 26-27 行找到的生成文件的部分文件undefined reference to randapp,所以在哪里调用链接器。在这一行中有对LIB_GCCand的引用LIB_C,它们在makedefs_ti中定义。在第 49-50 行中,引用了安装编译器的目录(我更改了 4.7.3,在我的 linux pc 上安装了正确的 9.2.1)。在 makefile 之后-L$(LIB_C),如果我添加链接器参数,如-lcor-lg并尝试重新编译,我有错误,如arm-none-eabi-ld: cannot find -lc. 通过对在线资源的一些了解,我修改了makedefs_ti如下:

makefile

这样,我调用rand()函数的 main.c 文件就可以正确编译。在另一个测试中,我尝试编译另一个代码。现在我编写了一对 .c 和 .h 文件(我将它们放在 rtos 目录中以利用那里存在的相同 makefile),它们在一个调用sqrt(). 因此,在编译中调用该函数main(),即使我在任何地方都包含<math.h>我有错误:

显然编译停止了。从这里开始我尝试向链接器添加另一个参数,所以我修改了makefile如下:

我得到了其他我无法以任何方式解决的错误:

我会说,sqrt()在 main 中调用正常工作,当我sqrt()在其他 .c 文件中调用时会出现问题。相反,rand().c 附加文件中的函数可以正常工作。

我不知道如何解决这些错误,有人可以帮助我吗?

我另一天尝试的是在 Code Composer Studio 项目中编写相同的代码并且它可以工作(具有在附加 .c 文件中调用 sqrt 和 rand 的相同函数。有什么区别?

如果这是一个很长的解释,我很抱歉,但我没有找到另一种方式来解释我的情况。

提前非常感谢。

齐射

0 投票
1 回答
103 浏览

github - GitHub Actions 作业序列

我正在尝试在 GitHub Actions 上实现一系列作业:结帐和上传 arm-none-eabi-gcc 编译器,下一个构建不同目标的矩阵,下一个创建发布和上传发布资产(矩阵)。

对于结帐,我使用actions/checkout@v2干净的错误标志,当然可以拆分工作strategy:matrix:fiam/arm-none-eabi-gcc@v1- 上传 gcc。

我在构建和上传作业中有两个拆分。

是否可以在 github 操作中创建此序列?如何禁用结帐后清理以存储上传的编译器?

0 投票
2 回答
170 浏览

gcc - 无法识别的选项 --gc-keep-exported on arm ld

现在,我正在尝试集成一个 GitHub 操作,以检查拉取请求中的某些代码是否正确编译(任何感兴趣的人都可以使用 VEX 机器人)。但是,当它开始运行make命令时,我收到此错误:

我非常困惑为什么会发生这种情况?--gc-keep-exported 是一个真正的选择,这段代码可以在我的本地机器上完美编译。我尝试更改 ubuntu 版本并更新 VEX SDK 以查看是否有帮助,但我不断收到相同的错误。我应该怎么办?

代码:

Dockerfile

entrypoint.sh

0 投票
1 回答
163 浏览

gcc - arm-none-eabi 的默认链接器脚本中是否有任何对“main”的引用,这可能会在从命令行链接时产生干扰

当使用 gnu 工具链,特别是 arm-none-eabi 时,是否有任何理由为什么在使用命令行链接器选项时它会求助于“main”开头的似乎不正确的地址。然而,当'main' 是其他任何东西时,正确的起始地址和堆栈被初始化。例如,

在反汇编中,上面的输出没有从我注意到的正确初始化堆栈0x20001000和启动 rom ,但是..0x08000000

我尝试通过文件中的工具链查找与链接器脚本有关的任何其他对 main 的引用,并在此过程中获得了一些其他帮助,但似乎没有一个明确的解决方案来解释为什么会这样。当然,如果您创建自己的链接器或生成的链接器,您不会遇到这个问题,但我只是好奇,因为我正在尝试更多地学习该工具。

0 投票
1 回答
65 浏览

keil - 带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA

我正在为我的 stm32f767zi 板编写一些基本的裸机 C 代码(如果这也很重要,请使用 Keil uVision IDE),我希望我的向量表(以及在某些时候所有 .text 的东西)在闪存中有一个 LMA通过 AXIM 总线和通过 ITCM 总线的闪存中的 VMA。我想要的是链接器脚本中的以下内容:

此链接描述文件会导致程序在尝试调试时无法运行并挂起。当程序挂起时,调试器显示(在 Keil uVision 内存窗口中进行内存读取时)地址 0x08000000 和 0x00200000 处的数据完全相同,即

在地址 0x08000000 处读取内存:
0x08000000:00 F4 01 20 1D 02 20 00 9D .....

读取地址 0x00200000 的内存:
0x00200000:00 F4 01 20 1D 02 20 00 9D .....

对我来说,这重申了 AXIM 闪存和 ITCM 闪存漏斗到完全相同的物理闪存并通过 AXIM 总线将程序加载到闪存中,然后通过 ITCM 总线从闪存读取指令应该可以工作......但它没有t,至少不是我目前的设置。

相反,我必须将链接器脚本修改为以下内容,以使程序顺利运行并能够在重置处理程序中开始调试:

为什么将 .vector_table 输出部分的 VMA 更改为与 LMA 相同会影响我运行程序的能力?另请注意,如果我将 .vector_table 输出部分的 VMA 和 LMA 设置为 FLASH_ITCM 而不是 FLASH_AXIM,则会收到有关闪存中数据不匹配的 Keil uVision 闪存编程错误。

0 投票
0 回答
377 浏览

c - 带有静态库的 stm32F4 的闪存大小问题

我目前在我的 stm32 项目和可以显示不同条形码(QRCode、Datamatrix...)的静态库之间的链接存在很大问题。确实,我需要这个库在 Epaper 屏幕上显示不同的条形码。

不幸的是,我找不到在我的项目中实现的简单源代码。我必须通过一个静态库...

我设法为我的电路板的良好架构编译了这个,但我的项目显示存储错误。我不知道该怎么做了!如果有人有解决方案,我会很高兴!

对我来说最好的办法是简单地使用这个库的源代码,但是这些源代码需要预编译才能一起工作......

在网上,我设法为 QRCodes 找到了一个 .c 和一个 .h(这在我的项目中完美运行),但对于其他类型的代码,我找不到任何东西(Datamatrix、Code128、Aztec Code...) .

图书馆链接:https ://github.com/woo-j/zint

控制台日志:

0 投票
0 回答
180 浏览

c - arm-none-gcc-ld 错误:找不到目标文件,即使它以正确的路径存在

所以这是我的 makefile 中的一个片段,用于构建我的目标:

我的项目目录如下:

srcdir
+---include
+---obj
\---src

这是我得到的输出:

arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb -std=gnu11 -O0 -g -Wall -c src/RCC.c -o obj/RCC.o
arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb -std=gnu11 -O0 -g -Wall -c src/SPI.c -o obj/SPI.o
arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb - std=gnu11 -O0 -g -Wall -c src/main.c -o obj/main.o
arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb -std=gnu11 -O0 -g -Wall -c src/startup.c -o obj/startup.o
arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb -std=gnu11 -O0 -g -Wall -c src/timer.c -o obj/timer.o
arm-none-eabi-gcc -Iinclude -mcpu=cortex-m3 -mthumb -std=gnu11 -O0 -g -Wall -c src/usart.c -o obj/usart.o

arm-none-eabi-gcc -Xlinker -T -Xlinker lscript.ld -Xlinker -nostdlib -Xlinker -Map=main.map obj/RCC.o obj/SPI.o obj/main.o obj/startup.o obj/ timer.o obj/usart.o -o main.elf

c:/program files (x86)/gnu arm embedded toolchain/9 2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3 .1/../../../../arm-none-eabi/bin/ld.exe:找不到startup.o collect2.exe:错误:ld返回1退出状态make.exe”:** * [main.elf] 错误 1

所以 startup.o 存在于 obj/ 文件夹中,并且路径也已在配方中指定,所以这里出了什么问题?

由于大量此类错误,我一直在努力创建自己的makefile,即使在尝试了许多可能解决问题的教程和示例之后,另一个新的不时弹出,有没有更方便的方法来构建这样的项目那不会给我带来那么多麻烦吗?

0 投票
0 回答
136 浏览

cmake - CMake 错误:AR19DD~1.EXE:致命错误:无法指定 -o 与 -c、-S 或 -E 与多个文件编译终止

我正在尝试从一个纯粹由 C 文件组成的项目创建一个可执行文件。当我尝试创建一个库时,如下所示:

图书馆创建成功。但是,如果我添加类似于以下内容的内容,我需要的是一个可执行文件(更准确地说是 .elf 文件):

我收到以下错误: AR19DD~1.EXE: fatal error: cannot specify -o with -c, -S or -E with multiple files compilation terminated.

以下是我的编译器和链接器标志: