问题标签 [gnu-arm]

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 投票
1 回答
48 浏览

c - 排除 GNU 作为 (GAS) 标准的启动代码

我希望 GCC 排除它与构建过程自动链接的启动代码

我应该怎么办?

所以我有我自己的启动汇编代码定义标签(_start,_exit,..etc)

0 投票
2 回答
338 浏览

c - 如何将堆栈对齐到 SRAM 的末尾?

我有一个STM32F103VCT6带有 48kb SRAM 的微控制器,最近我遇到了内存冲突:

我有一些静态变量(让我们调用它A)位于堆中,大小为0x7000,我编写了一些简单的函数来获取有关堆栈和堆的信息:

所以我得到了这样的东西:

所有静态变量(包括A)都已经获得了它们的堆,所以堆位于0x8fd0. 看起来,最初,堆栈指针位于0x939b,远离 48kb ( 0xc000)

当我将A变量大小更改为时,0x4000我得到了这张图片:

因此,似乎堆栈位置不在 SRAM 的末尾,而是在某种程度上依赖于用户定义的变量。

如何将堆栈对齐到 SRAM 的最后(48kb)?

我正在使用带有GNU Tools ARM Embedded工具链的 CooCox IDE。

谢谢!

编辑:

对不起,这里有一些误解,A不是 const,我只因为关键字而称它为静态:

这表明A位于内存的开头:

0 投票
2 回答
981 浏览

assembly - 十进制到十六进制的转换如何在汇编中工作?

我试图弄清楚十进制的 12345 如何产生十六进制的 0x39 0x30。谁能解释一下?自从介绍组装以来已经有一段时间了。建议的帖子对我有所帮助,但没有一个例子可以说明这是如何工作的。

给定 hword 一次处理 16 位,12345 如何给出所述的十六进制结果?

64位的值是否相同?只是用 0xFF 填充?

@dwelch - 非常感谢。

0 投票
1 回答
393 浏览

iar - 由于在 IAR 工作台中使用 GNU ARM 工具链而导致的错误

我最近开始使用 STM32F4Discovery 板进行编程,并使用 IAR 工作台作为 IDE。我应该在 Eclipse 中使用已经开发的程序作为我项目的一部分。当我将它导入 IAR Workbench 时,我收到以下错误和警告: Error[Pe020]: identifier "_impure_ptr" is undefined Warning[Pe223]: function "_REENT_INIT_PTR" declared implicitly Warning[Pe223]: function "_reclaim_reent" declared implicitly C

我已经意识到 , _impure_ptr,_REENT_INIT_PTR是存在于 GNU ARM 工具链中_reclaim_reent的文件的一部分。reent.h这被用作使用 FreeRTOS 功能的一部分。使用 Eclipse,这不是问题,但是在使用 IAR 工作台时,是否还有其他类似于reent.h我应该包含的 IAR 工作台的文件?

我知道这是一个幼稚的问题,但我是嵌入式编程的初学者,并且仍处于设置该项目的初始阶段。

0 投票
1 回答
1245 浏览

c - STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting(newlib 和 libgloss)

我使用 Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu 的 GnuArmEclipse-Plugin、OpenOCD 0.9.0 和 STM32CubeMX 4.11.0 为 STM32F401C 探索板设置了一个基于 Windows 的工具链。

所以基本上,我使用 STM32CubeMX 生成了一个 SW4STM32 项目,将所有内容导入一个新的 Cross ARM GCC Eclipse C 项目并调整了一些参数,即符号、CPU 类型、FPU 和链接文件。一个简单的 LED 闪烁示例构建成功,可以由 OpenOCD 执行,断点也可以。

为了提供 newlib 或 newlib nano 所需的系统调用,例如_sbrk_write,我从--specs=nosys.specs链接器选​​项开始。这种方式动态内存分配工作得很好。但是,我想自己实现该_write功能,以便打印到显示器或通过 UART 发送数据。

在 libgloss 中,该_write函数有一个弱符号,因此重新实现它应该足够了。我在 main.c 中这样做了:

我预计 LED 会闪烁,但只有主函数本身的切换命令显示效果。

为什么我的 write 函数没有被调用?我错过了什么?

0 投票
1 回答
1884 浏览

gcc - arm gcc 默认编译它的 libc

我正在尝试使用 cygwin 中的嵌入式 arm gcc 编译器编译 SDK。它是一个基于 makefile 的 SDK。我的目标是皮质 m3 设备。我的问题是,SDK 有一个针对目标的自定义 libc 实现,当我使用 arm 编译器 (arm-none-eabi-gcc) 进行编译时,它看起来会选择 gnu arm libc,而不是 SDK libc。这会导致编译错误。我很肯定 makefile 是正确的(我从正在运行的计算机上复制并粘贴了整个 SDK)。我不再有权访问该计算机来尝试验证/比较设置。我不知道如何防止 arm gcc 编译器寻找自己的 libc 实现,而是将其指向正确的实现。任何帮助是极大的赞赏。

0 投票
2 回答
993 浏览

c++ - 声明抽象类(纯虚方法)大幅增加二进制大小

故事如下:我正在使用 AC6 Toolpack 在 Linux 中为 ARM Cortex-M0 处理器开发 C++ 软件。在我使用 Keil(在 Windows 中)(拥有自己的工具链)之前,我已经迁移到 GNU-toolchain ((GNU Tools for ARM Embedded Processors) 5.2.1) 。我意识到的第一件事是;二进制文件大小大幅增加。我已经测试了每个编译器优化(链接时间优化除外,它在内联汇编中给出错误,不是问题的一部分,但可能与答案有关)。然后开始使用任何可用的工具检查可执行文件(elf 文件不是 bin,gnu 生成两者):objdump、readelf、nm。我发现一些导致尺寸增加的符号,重要的是:' d_print_comp_inner',' d_exprlist','d_template_args'。但不知道是什么导致这些函数以二进制形式出现。(我使用了最少的库:nano newlib)。长话短说,我开始一一消除代码以找到罪魁祸首。最后是抽象方法声明!

定义函数为

代替

添加 45 KB 和我提到的符号。这是源代码的唯一变化。基类中存在空定义。请注意:方法仍然是虚拟的并且在子类中被覆盖

没有抽象类的大小输出:

抽象类的大小输出:

在这里,当方法是抽象的时候出现的符号和它们的大小,消除了两个版本中出现的那些。(nm使用工具。不完整列表,大小> = 0x60的列表)

一些我熟悉的名称(例如 printf、flush、malloc、fputs 等)在源代码中甚至都没有提及。

任何人都知道是什么导致了这种行为?

更新: 我已经用 flag 禁用了异常--noexception,所以我没有考虑它。事实证明,在这里提到这一点与回答很好有关。

更新 2: 如果您跟踪答案中的链接,这是解释这一切的最全面的网站。

0 投票
1 回答
953 浏览

eclipse - 是否可以与 gdbserver 建立多个连接?

我正在使用 Eclipse CDT 和 GNU ARM QEMU 模拟器。Eclipse在 QEMU 上运行时启动它自己的gdb会话。gdbserver我还希望能够从 OSX 终端连接以获得更精细的控制。我还希望能够使用 Node.js 脚本中的 GDB/MI 来获取有用的数据,例如注册状态等,并在网页中将其可视化。

使用我自己的 gdb 会话独立运行 QEMU 模拟器时,我可以很好地连接,但我想知道是否可以重新连接到 Eclipse 的 gdb,或者再次连接到gdbserver.

谢谢!


来自https://sourceware.org/gdb/onlinedocs/gdb/Server.html (20.3.1.2):

当 gdbserver 保持运行时,gdb 可以稍后再次连接到它。这种重新连接对于断开跟踪等功能很有用。为了完整起见,一次最多可以连接一个 gdb。


到目前为止,我无法弄清楚,从文档看来这是不可能的。

我现在使用的解决方案是从终端手动运行 QEMU 模拟器。GNU ARM Eclipse 调试器允许指定 a gdbserver host:port,我可以将其指向独立的 QEMU,它可以正常工作。

为了允许模拟 gdb 会话,我可以创建一个自定义 TCP 服务器供 Eclipse 连接,而不是直接连接到gdbserver. 这个 TCP 服务器会将所有来自 Eclipse 的流量转发到gdbserver.,我还可以通过这个通道监听并发送消息到 gdb。

最终结果是您可以像往常一样在 Eclipse 中调试和设置断点,还可以通过任何方式与 gdb 进行交互,例如通过 Web 界面、本机 OSX 终端等。

0 投票
2 回答
248 浏览

c - 函数 sscanf 必须分配给变量否则奇怪的行为

考虑这段代码:

当上面的代码运行时,里面的语句if会导致程序崩溃(转到某个默认处理程序)。

但是当我将这两个(word_getValue和 word_ getAddres)函数更改为:

有用。添加假人i似乎可以解决该问题。但是为什么它不以另一种方式工作呢?

GNU ARM v4.8.3 工具链

0 投票
1 回答
529 浏览

macros - GNU 汇编器:使用宏参数创建符号

我有一个创建标签的宏,但如果它们尚未定义,我只想创建这些标签。问题是标签是使用宏参数构建的,而汇编器不喜欢使用宏参数生成的符号。这是不起作用的代码。它在 ifndef 上出错。有没有其他方法可以写这个?

错误:行尾有垃圾,第一个无法识别的字符是 `\'