问题标签 [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 回答
136 浏览

c - arm-none-eabi-gcc(错误:初始化元素不是常数)

我正在阅读Daniele Lacamera的《嵌入式系统架构》一书。在第 4 章,启动过程中,我们创建了中断向量表(对于 ARM Cortex M4),如下所示:

没有显示如何END_STACK编辑extern,所以我这样做了:

链接描述文件类似于以下内容:

我收到以下错误:

处理此问题的正确方法是什么?是否可以将其转换为函数的地址,或者我应该仅为堆栈指针创建一个新部分?

我试过洒constexternand cast 上,但无法解决错误。

0 投票
1 回答
168 浏览

windows - 'make' 程序不是内置在 gcc-arm-none-eabi 库中吗?

我的英语很差,因为我不是以英语为母语的人。我希望你能理解。

我在https://developer.arm.com/tools-and-software/open-source-software/developer-tools/上下载了 gcc-arm-none-eabi-9-2020-q2-update-win32.exe 版本gnu-工具链/gnu-rm/下载

我确保与 arm-none-eabi 相关的命令如下所示。 在此处输入图像描述

但奇怪的是,“make”命令不能按如下方式工作。 在此处输入图像描述

'make' 程序不是内置在 gcc 库(或 gcc-arm-none-eabi)中吗?还是我使用了“make”命令错误?

如果有人能告诉我如何解决这个问题,我将不胜感激

感谢您的阅读。

0 投票
1 回答
288 浏览

arm-none-eabi-gcc - arm-none-eabi-gcc 代码程序如何在 x86 机器上运行?

这个论坛里的很多问题都是从“为什么我的代码不能运行...”开始的

我在 Ubuntu 18.04 上开发,在笔记本电脑(Windows x86)上作为 VM 机器运行。以下用 gcc 编译和链接的程序运行良好并显示 64 位地址。

char *s = "Hello\n"; printf ("Hello at address: %p\n", s);

我的假设是 arm-none-eabi 以系统裸机为目标。当然,我并不是想在裸机上运行上述程序。但我试图了解交叉编译是如何工作的。

与 arm-none-eabi-gcc (从 Ubuntu 安装)编译和链接的同一程序表明很多缺少引用(_exit ...等) - 正常。创建的代码是 ARM 汇编语言,我使用 arm-none-eabi-objdump 进行了验证。

在加载时添加选项 --specs=nosys.specs 可以解决缺少的引用 - 正如预期的那样。当我在 Ubuntu 上运行它时,会自动调用 QEMU 并出现分段错误。我对分段错误并不感到惊讶,但 QEMU 的自动启动是出乎意料的。

将选项更改为 --spec=rdimon.specs 也可以解决缺少的引用 - 正如预期的那样。但是尽管创建的汇编代码是 arm,但它在 Ubuntu (x86) 上运行。显示的地址为 32 位。

我知道 rdimon.specs 与半托管有关,但我认为这仅在程序在目标(arm 处理器)上运行并与运行 gdb 的主机通信时才被激活。显然我错了。

很抱歉这么长的序言......简单的问题:我的 arm 代码是如何在 x86 上运行的?

0 投票
0 回答
468 浏览

linker - 链接时 GCC/Clang 之间的差异

由于 C++ 编译时间大大缩短,我最近添加了使用 Clang 而不是 arm-none-eabi-gcc 工具链为 ARM Cortex-M4 微控制器编译项目的选项。整个过程运行得非常顺利,我很快就有了 ELF 和 HEX 文件。直到昨天晚上我才注意到 ELF 文件实际上差异很大......

在我继续之前,让我们检查一下 GCC 生成的 ELF 以获得某种基线。

GCC 的 ELF 包含以下部分(除了调试内容)

但是尽管 .data 和 .bss 标有“A”(alloc)标志,但仅加载以下内容

到目前为止,一切都很好。

当我尝试从 Clang 生成的 ELF 创建二进制文件时,问题出现了。这些文件的大小(256MB)与我的预期相去甚远。现在,如果您不熟悉 ARM 微控制器,它们通常包含位于不同地址位置的 FLASH 和 RAM 存储器(例如,如上所示,FLASH 为 0x0800'0000,RAM 为 0x2000'0000)。所以我已经对发生了什么有些怀疑......我检查了我的链接器脚本并在每个单独进入 RAM 的部分上放置了一个 NOLOAD 指令。问题解决了?

嗯...不是真的。事实上,我的二进制文件变得更大了。

我们来看看 Clang 的 ELF。尽管我使用 -fno-unwind-tables 和 -gc-sections 进行编译,但 Clang 似乎并没有删除展开部分(ARM.exidx),这让我有点烦恼,但好吧,我可以忍受那些 16B。

现在这是它变得有趣的地方,我不知道发生了什么。什么是 GNU_RELRO 和 GNU_STACK 以及它是如何结束的?为什么 GNU_STACK 位于地址 0。此条目是否有可能使我的二进制文件膨胀?

进一步的问题:

  • 尽管以前在链接描述文件中没有 NOLOAD 指令,但 GCC 如何能够删除所有 RAM 部分?
  • 在 Clang 的 ELF 上运行大小将我在链接描述文件中定义的最小堆栈大小计入 .data 部分,而在 GCC 的 ELF 上则没有。那个怎么样?我的链接器脚本包含一个看起来像这样的部分
  • 但据我所知,这应该只“检查”至少有足够的 RAM 来覆盖我定义的最小堆和堆栈大小。该部分实际上不包含任何内容,那么它如何计入.data?

我知道在实际创建二进制文件时可以使用 objcopy 删除不需要的部分,但我真的很想了解 GCC 和 Clang 之间的那些细微差别。

/edit 我刚刚注意到我的 ._user_heap_stack 部分具有不同的类型,具体取决于编译器(NOBITS 与 PROGBITS)。猜猜这解释了为什么它被计入.data ...

/edit 现在是@ ​​LLVM 上的(潜在)错误 https://bugs.llvm.org/show_bug.cgi?id=46299

/edit 并从 lld 10.0.1 关闭 https://bugs.llvm.org/show_bug.cgi?id=46225

0 投票
3 回答
355 浏览

debugging - GDB 便利变量不会在 .gdbinit 中展开

gdb使用一个.gdbinit文件运行,该文件有一些不会扩展的便利变量。

1. 我的设置

我编写了以下.gdbinit文件以通过 blackmagic 探针将可执行文件闪存到微控制器(请参阅https://github.com/blacksphere/blackmagic/wiki):

blackmagic 探针将自身连接到一个 COM 端口,该端口在一台计算机上与另一台计算机上可能不同。因此,我不想在.gdbinit文件中硬编码。GDB 便利变量看起来是最优雅的解决方案:

https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_59.html

所以我$com.gdbinit文件中使用了便利变量,并在调用 GDB 时在命令行中定义了它:

2.错误

GDB 启动但抛出错误消息:

看起来 GDB 无法识别$com便利变量。所以我检查 GDB 是否实际存储了变量:

这证明 GDB 正确地将其存储为"COM9". 因此,问题在于未能扩展它。

3. 更多试验

$com当我观察到执行时扩展失败时.gdbinit,我认为直接在 GDB 中发出命令可能会起作用:

但错误仍然存​​在。

4. 问题

您知道一种使 GDB 中的便利变量起作用的方法吗?或者您知道实现相同目标的另一种机制吗?


5.解决方案

谢谢@Mark Plotnick 的回答!正如您所建议的,我为我的.gdbinit文件提供了以下内容:

COM9但是,在调用 GDB 时,我必须删除参数周围的引号。所以而不是:

我以这种方式调用 GDB:

现在它起作用了!你救了我的一天!

0 投票
1 回答
539 浏览

c - 带有 cmake4eclipse 的 Eclipse:编辑器无法识别 CMakeLists.txt 中定义的符号

  • 视窗 10 版本 1809
  • 面向 C/C++ 开发人员的 Eclipse IDE(版本:2019-06 (4.12.0))
  • cmake4eclipse 2.1.1
  • cmake 版本 3.17.0
  • GNU Make 4.2.1

一个简单示例项目的存储库:https ://bitbucket.org/ChristianW/cmake_driven_example_arm-none-eabi-gcc/src/master/

使用 arm-none-eabi-gcc 编译器时,Eclipse C/C++ 编辑器无法识别我在 CMakeLists.txt 中设置的符号。

main.c,使用 arm-none-eabi-gcc 构建

使用 gcc 编译器时,Eclipse C/C++ 编辑器会识别我在 CMakeLists.txt 中设置的符号。

main.c,用 gcc 构建

在这两种情况下,构建项目都是有效的。任何想法这里有什么问题?

亲切的问候,克里斯蒂安

编辑:CMakeLists.txt 的内容

相关 cmake4eclipse 主题

0 投票
1 回答
54 浏览

c - 在#pragma pack(push,ALIGNMENT) 中作为宏传递的对齐会导致代码生成硬故障

我使用 9-2020-q2-update 和 8-2019-q3-update arm-none-eabi 工具链的以下代码遇到了硬故障:

#pragma packgcc 中将对齐定义为宏生成以下代码-O0

r7包含s未与 4 字节边界对齐的值。strd产生硬故障。

当我使用时生成正确的程序集#pragma pack(push, 1)

有没有办法正确地将定义为宏的对齐传递给#pragma pack?我在整个代码库中都有打包的结构定义。有一些内存受限的平台,我想将它们对齐到一字节边界和一些平台,它不是那么重要,性能提升会很好。将对齐定义一次并在所有 pragma 中使用会很方便。

0 投票
1 回答
79 浏览

gnu-make - 在包含带有 stm32f4xx 的 makefile 的文件时,我遇到了麻烦

我开始使用 Linux,在我的项目gcc-testing中使用一些 stm32f4 库时遇到了一些麻烦。所需的所有 CMSIS 程序都在 STM32F4_Discovery_FW_V1.1.0 内部,项目安排如下:

main.c 和 system_stm32f4xx.c 使用 STM32F4_Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include 中的 stm32f4xx.h 文件我从终端得到的错误是:

制作文件控制台错误

我的制作文件:

希望enyne可以帮助解决这个问题。

0 投票
1 回答
272 浏览

arm - GNU Arm 嵌入式工具链 | arm-none-eabi-gcc 选项:Thumb (-mthumb) 和 Arm (-marm) 状态有什么区别?

Thumb (-mthumb)我有一个可能微不足道的问题,但是和state有什么区别Arm (-marm),为什么大多数教程都建议使用Thumbstate?

我很好奇这到底是什么意思?它与什么有关?

最好的!

0 投票
1 回答
3195 浏览

arm - arm-none-eabi-gdb:加载共享库时出错:libncurses.so.5:无法打开共享对象文件:没有这样的文件或目录

Ubuntu 20.04.1 LTS 64 位 3.36.3 Gnome Intel core-i7-975H 31.2GiB 内存 1.6 TB 磁盘空间 有我的流感疫苗 COVID-19:否定,但我很无聊,反正哪儿也不去...

我尝试了一些修复,包括这个:

消息“无法运行 arm-none-eabi-gdb:找不到 libncurses.so.5”

但没有爱。我仍然继续收到同样的错误。我正在尝试使用 Arduino IDE v1.8.13 刷新软件设备。GDB版本在这里:

arm-none-eabi-gdb --version

libncurses 版本在这里:

dpkg -l '诅咒' | grep '^ii'

我不知道还有什么可以尝试或检查的。有人会对进一步检查有什么想法吗?

@MarkPlotnick - 我跑了 ls -ld $(dpkg -S libncurses.so.5),结果:

ls -ld $(dpkg -S libncurses.so.5)

然后我通过尝试安装它来专门检查是否安装了 libncurses5:i386,它显示:

我又试了一次,有点不同:

然后 libudev1:i386 是唯一要安装的软件包。但是,如果我尝试找到该文件:

然后我在这个位置得到五个文件:

就像薛定谔档案...