问题标签 [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.
c - 如何使用 arm-non-eabi-gcc 作为交叉编译器生成 elf 文件以在 windows 上的 eclipse 中运行?
我使用 arm-non-eabi-gcc 作为交叉编译器。
我在 Eclipse 中创建了一个简单的 hello world 程序。
我可以使用 arm-non-eabi-gcc 编译程序,并且 helloworld.out[arm/le] 文件正在生成,但我无法运行它,因为它只能在 arm 上运行,而不能在 windows x86-64 上运行。
我知道我可以使用 cygwin 或 mingw 来编译代码,我将能够轻松地在 Windows 上运行该程序,但是,我只想使用 arm-non-eabi-gcc 作为交叉编译器。
我想知道如何使用 arm-non-eabi-gcc 作为交叉编译器,或者我需要在我的 make 文件或 eclise 工具链设置中包含哪些标志,并创建一个可以在 windows x86-64 上轻松运行的 elf 文件.
注意:生成的二进制文件将始终在 Windows 上运行,而不是任何 arm 系统,只是我的项目工作区有其他使用 arm-none-eabi-gcc 的项目,所以我想使用相同的,我不想要 cygwin 或 mingw。
我的完整工作区和其他项目很容易移动,因为我将 arm-non-eabi-gcc exe 保存在项目目录中。使用 cygwin 或 mingw 可以轻松编译和运行二进制文件,但我们需要在更改系统时安装它们。
任何指导或帮助将不胜感激。
谢谢你。
assembly - 为什么使用 arm-none-eabi-ld 链接器更改目标文件的顺序会更改可执行行为?
使用时我的行为有所不同
链接我的目标文件,vs
其中目标文件“to”和“ts.o”在命令中被转置。后一个版本会产生正确的行为,而前一个版本不会。不同之处似乎是我的程序中的堆栈指针在第一个版本中设置不正确,我想知道为什么会这样。
这是我正在使用的源文件和链接器脚本,以及要编译的脚本。
tld
tc
ts.s
mk.sh(使用产生预期结果的链接器命令)
运行二进制文件后
我得到以下。堆栈指针 (R13) 正确
VS 使用带有转置目标文件的链接器命令的结果
堆栈指针(R13)明显超出程序的内存范围。
clion - 无法使用 Clion Embedded 开发和外部 st-link 在 Stm32L486RX 板上运行代码(无法匹配请求的速度 500 kHz,使用 480 kHz)
我遵循了 StmCubeMxproject 和 OpenOCD 支持中的所有步骤(https://www.jetbrains.com/help/clion/embedded-overview.html)
我的操作系统是 Windows 10。
这是 .cfg 文件:
这些是设置:
它编译的代码。
我尝试将代码上传到带有外部 st-link 的 Stm32L486 板上(只需按下运行按钮),但这是我得到的错误:
c++ - 裸机嵌入式 C++:将闪存写入 ram 时未定义对 memcpy 和 memset 的引用
正如标题所暗示的那样,我遇到了一个与未定义 memcpy 和 memset 相关的错误,即使我没有直接使用它(尽管鉴于此错误的性质,我猜它用于链接器和编译过程)
长话短说:我正在将最初存储在 FLASH 中的 .data 和 .bss 部分写入 SRAM 存储器,我正在使用指针进行此类操作,如下所示:
我正在使用 arm 嵌入式 g++ 编译器来构建 .o 文件,然后使用 -nostdlib 选项链接到 .elf ,因为这是嵌入式应用程序,因此不需要 stdlib/负担得起。
该过程失败,因为似乎存在对“memcpy”和“memset”函数的隐式调用。我试图包含 <string.h> (据我所知,这是定义这两个函数的地方)另外,我已经在 extern "C" 中进行了包含,以避免由于名称修改而导致“未定义符号” .
这是 make 文件调用和终端输出:
如我所见,解决此问题的唯一方法是在删除 #include <string.h> 的同时定义我自己的 memcpy 和 memset 函数实现以避免重新定义问题。虽然我不知道 memcpy 和 memset 是做什么的。
提前致谢。
编辑:
通过删除 -nostdlib ,即允许链接器链接标准库,我得到这个错误也与未定义的函数有关。在我看来,即使我有一个 .cpp 启动文件,它也与汇编程序启动文件有关。
ld - 如何让 arm-none-eabi-gcc 输出多个固件
我正在尝试将一些代码编译到SRAM中,所以我使用MEMORY指令分配了一块MEMORY来将一些函数编译到指定的RAMCODE区域中,例如:
但是这样会导致输出文件过大,如下图 编译输出文件的截图
有没有办法将 RAMCODE 单独输出到文件中?
stm32 - 如何快速确定 stm32 板的 arm-none-eabi-gcc 标志?
我是 stm32 的新手,我在 linux shell 上编程。
每次我观看 arm gcc makefile 示例时,我都会看到很多附加的 gcc 标志。我想知道如何为特定类型的板(例如 stm32f10x)确定这些标志。或者我应该说我应该检查哪些文件以获取这些信息。或者这些标志对于不同的板基本相同?
这是我在https://github.com/rowol/stm32_discovery_arm_gcc.git中找到的一个 makefile 示例,我不知道 flags like-mcpu
是-mfpu
什么。
c - 构建项目时出错:arm-none-eabi/bin/ld: 找不到 -lnsc
我正在使用 eclipse 来构建一个演示项目。我尝试了 arm-none-eabi 的不同工具链版本,但它们都给了我相同的错误:
/usr/share/gcc-arm-none-eabi-10.3-2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm- none-eabi/bin/ld:找不到-lnsc collect2:错误:ld返回1退出状态`
我按照这个(第一个答案)在我的 Ubuntu 上安装 arm-none-eabi: https ://askubuntu.com/questions/1243252/how-to-install-arm-none-eabi-gdb-on-ubuntu-20- 04-lts-焦点-窝
c++ - 将 newlib nano 与 arm-none-eabi gnu 工具链链接:未定义对 __libc_init_array 的引用
尽管我已经浏览了关于这个主题的另一篇类似的帖子,但我还没有设法解决我的问题。
我正在为 stm32f411RE 开发裸机开发方法,我刚刚解决了使用嵌入式标准库(newlib nano)的需要,所以我开始将它链接到我的项目以及在 main() 之前调用 __libc_init_array()在我的 Reset_Handler 中用于标准库函数的适当初始化,这就是问题出现的地方。
粗略地说(你可能认为的伪代码)我的启动文件如下:
我成功地完成了编译和链接过程(没有警告、错误或任何东西),但是当我尝试运行它时程序无法访问 main() 函数,换句话说,它卡在了 __libc_init_array();
当我运行调试会话并查看调用堆栈时,这就是我得到的:
而且程序甚至还没有到达main()。我想很明显,设置断点是没有用的,因为程序甚至没有到达 main()。
如果我将 __libc_init_array() 从外部“C”中取出,则会出现“__libc_init_array undefined reference”编译错误。
值得一提的是,我的链接器脚本以及启动和生成文件在裸机方法上的工作就像一个魅力,所以问题不存在,我的意思是,我只需要考虑链接过程的适当标志。
我的项目结构如下:
我正在构建目标文件:
除了构建 syscall.c 之外:
然后将所有目标文件链接到:
这是链接后的地图:
我猜,出于我的无知,名称修改不是问题,因为 __libc_init_array() 是在 extern "C" 中定义的。此外,在映射文件中,我只看到一个名为 __libc_init_array 的符号,它似乎位于正确的闪存地址。
评论很有价值。感谢您阅读这么长的帖子。
PD:任何想阅读它的人的链接器脚本:
启动文件:
c - CMake C 项目在 arm-none-eabi 工具链下无法编译
我目前正在研究传感器的驱动程序。当我进行设置时,一切正常,我可以编译我的代码。但是,一旦我编写了驱动程序并想进行测试,CMake 就给了我很多我不太理解的错误。以下是输出(pastebin):
我使用操作系统Windows 10并使用arm-none-eabi-gcc编译代码。对于 Makefile 编译,我使用mingw32-make。
先感谢您!
编辑
CMakeLists.txt
CMake 输出:
c - GCC v10.3 使用的堆栈大小比 GCC v6.3 用于函数
我有一个使用 GCC v6.3 编译的应用程序,当我使用 GCC v10.3 编译它时,我发现一些函数使用的堆栈大小比 GCC v6.3 使用的更大,例如,这个函数对 GCC v6.3 使用零堆栈但 GCC v10.3 使用 8 个字节
GCC v6.3 程序集:
和 GCC v10.3 程序集:
在 GCCv10.3 中,它推送 {r4, lr} 而在 GCC v6.3 中不是这种情况,为什么会发生这种情况?,它比旧编译器花费应用程序更多的堆栈区域,所以如何避免它以获得更少的堆栈尺寸?另外,虽然它是一个叶子函数,但为什么它会堆叠 lr ?另外,为什么它在所有情况下都返回 z 虽然 c 代码在 case 条件内返回它?(更新:这已通过在函数末尾添加返回来解决)
笔记:
- 这个函数是一个虚拟函数,只是为了重现问题,所以不要考虑重写它。
- 构建标志是: arm-none-eabi-gcc -O0 -c -std=c99 -fmessage-length=0 -fomit-frame-pointer -Wno-aggressive-loop-optimizations -Werror -Werror=strict-prototypes -pedantic-错误 -Wconversion -pedantic -Wall -Wextra -Wno-unused-function -Wextra -Wpointer-arith -Wsign-compare -Wswitch -Wno-maybe-uninitialized -fno-strict-aliasing -fshort-wchar -mfix-cortex-m3- ldrd -gdwarf-3 -gstrict-dwarf -mabi=aapcs -mthumb -mcpu=Cortex-M0 -g3 -Os -mthumb -ffunction-sections -fdata-sections -MMD -MP -MF"xyz.d" -MT"xyz .o"