问题标签 [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.
c - 排除 GNU 作为 (GAS) 标准的启动代码
我希望 GCC 排除它与构建过程自动链接的启动代码
我应该怎么办?
所以我有我自己的启动汇编代码定义标签(_start,_exit,..etc)
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
位于内存的开头:
assembly - 十进制到十六进制的转换如何在汇编中工作?
我试图弄清楚十进制的 12345 如何产生十六进制的 0x39 0x30。谁能解释一下?自从介绍组装以来已经有一段时间了。建议的帖子对我有所帮助,但没有一个例子可以说明这是如何工作的。
给定 hword 一次处理 16 位,12345 如何给出所述的十六进制结果?
64位的值是否相同?只是用 0xFF 填充?
@dwelch - 非常感谢。
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 工作台的文件?
我知道这是一个幼稚的问题,但我是嵌入式编程的初学者,并且仍处于设置该项目的初始阶段。
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 函数没有被调用?我错过了什么?
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 实现,而是将其指向正确的实现。任何帮助是极大的赞赏。
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: 如果您跟踪答案中的链接,这是解释这一切的最全面的网站。
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 终端等。
c - 函数 sscanf 必须分配给变量否则奇怪的行为
考虑这段代码:
当上面的代码运行时,里面的语句if
会导致程序崩溃(转到某个默认处理程序)。
但是当我将这两个(word_getValue
和 word_ getAddres
)函数更改为:
有用。添加假人i
似乎可以解决该问题。但是为什么它不以另一种方式工作呢?
GNU ARM v4.8.3 工具链
macros - GNU 汇编器:使用宏参数创建符号
我有一个创建标签的宏,但如果它们尚未定义,我只想创建这些标签。问题是标签是使用宏参数构建的,而汇编器不喜欢使用宏参数生成的符号。这是不起作用的代码。它在 ifndef 上出错。有没有其他方法可以写这个?
错误:行尾有垃圾,第一个无法识别的字符是 `\'