问题标签 [yagarto]
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.
gcc - 如何使用 gcc 确定嵌入式系统中的最大堆栈使用量?
我正在为嵌入式系统编写启动代码——在跳转到 main() 函数之前加载初始堆栈指针的代码——我需要告诉它我的应用程序将使用多少字节的堆栈(或者更大,保守估计)。
我被告知 gcc 编译器现在有一个 -fstack-usage 选项和 -fcallgraph-info 选项,它们可以以某种方式用于为我静态计算确切的“最大堆栈使用量”。(“使用 GCC 进行编译时堆栈需求分析”,Botcazou、Comar 和 Hainque 着)。
Nigel Jones 说递归在嵌入式系统中是一个非常糟糕的主意(“计算堆栈大小” 2009),所以我一直小心不要在这段代码中创建任何相互递归的函数。
另外,我确保我的中断处理程序在它们最后的从中断返回指令之前都不会重新启用中断,所以我不需要担心可重入中断处理程序。
如果没有递归或重入中断处理程序,应该可以静态确定最大堆栈使用量。(所以大多数关于如何确定最大堆栈使用量的答案?请勿应用)。我的理解是我(或者最好是我的 PC 上的一些代码,每次我重建可执行文件时都会自动运行)首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断中断时,以及最大值main() 函数未中断时的堆栈深度。然后我将它们全部加起来以找到总(最坏情况)最大堆栈深度。当 main() 后台任务在被最低优先级中断中断时处于其最大深度时,会发生这种情况(在我的嵌入式系统中),并且当它被下一个最低优先级中断时,该中断处于其最大深度中断等等。
我正在使用带有 gcc 4.6.0 的 YAARTO 来编译 LM3S1968 ARM Cortex-M3 的代码。
那么如何使用 gcc 的 -fstack-usage 选项和 -fcallgraph-info 选项来计算最大堆栈深度?还是有更好的方法来确定最大堆栈使用量?
(有关针对 Keil 编译器的几乎相同的问题,请参阅如何确定嵌入式系统中的最大堆栈使用量。)
gcc - 为什么我在 __libc_init_array 中有未定义的 _init 引用?
我正在尝试使用 Yagarto 和 Eclipse 为 ARM 微控制器平台构建一个简单的项目。在我的启动代码中,我有这个(我认为这是相当标准且无趣的):
除非我注释掉对 的调用__libc_init_array()
,否则我会从链接器收到以下错误:
为什么我会收到此“未定义的引用”错误?我错过了什么?我认为我缺少一些链接器标志,但我一生都无法弄清楚是什么。
gcc - 引用的 CMake 外部对象路径会产生链接器错误
我正在尝试使用 YAGARTO、Cmake 和 Ecpise 构建一个简单的 main.project。问题是 CMake 引用了我的两个来源的路径:
像这样(在 build.make 中从 CMAKE 自动生成)
这种路径引用产生了以下链接器错误:
无论如何告诉CMake不要引用源路径?
gcc - 从 gcc4.7.x 中删除 crt0.o 的基本原理是什么?
我正在尝试升级到yagarto4.7.2(Yet Another GNU ARM toolchain,对于那些想知道的人),它是 gcc 和 binutils,移植到 Windows。但是,尝试编译一个简单的 Hello World 会产生:
现在,在这个论坛中,它明确表示这是启动初始化库,在 gcc4.6.x 之后被删除。提出了两种解决方案:
- 使用 -nostartfiles 编译
- 将 crt0.o 从 4.6.x 复制到 4.7.x 文件夹
对于生产代码,两者看起来都很脏且不可接受。那么有谁知道为什么这个库被删除了,现在它的等价物是什么?
c - Yagarto (GCC, Win32) 在不同的 PC 上以不同的方式编译相同的代码
我在 Windows 上使用 Yagarto 工具链来编译大约 100K 行代码的代码库。
我们有两台开发电脑。然而,尽管具有相同的工具链和构建相同的源代码,它们各自构建的二进制文件略有不同。
我使用 MD5 检查了我们有相同的编译器二进制文件、相同的系统头文件,并且我们正在编译相同的源代码,将相同的命令行传递给 GCC,但存在细微的差异。
在我们代码库中的 81 个目标文件中,有 77 个编译完全相同;和四个有细微的差别。没有功能上的区别,但由于我们将支持编译的二进制文件,我想深入了解这个问题。
“arm-elf-gcc.exe”的日期为 2006 年 7 月 16 日。“arm-elf-gcc -v”的输出为:
以下是不同生成代码的列表文件中的示例:
在这两种情况下,只是堆栈帧中变量的顺序不同;除了变量的顺序不同之外,所有代码都是相同的。(列表文件上的“diff”只显示与 #40 相对应的各种其他行与 #28 等交换)。
这种变化显然是无害的(虽然我想知道为什么),但是在另外两个目标文件中,文本段的大小实际上在一个版本中大了 4 个字节,并且变量在堆栈帧,有几个不同的指令。
一台 PC 是运行 Windows 2000 的 Intel Core 2 Duo,另一台是运行 Windows 7 的 AMD X4。每台 PC 都能可靠地复制相同的构建,但其中一台 PC 的构建与其他 PC 不同。
GCC 是否可能会根据实际用于构建的 CPU 进行不同的优化?(不是目标 CPU)。或者还有什么可能导致这种差异?
c - 使用 C 和基本库烘焙 PI
我有以下问题 - 我已经完成了烘焙 pi 课程,没有任何问题,然后我决定将这个纯 asm 与一些 C 链接起来。我已经这样做了,就我决定使用函数 sprintf 而言,一切都很好将 int 转换为 char*。现在,当我尝试编译时,我很享受以下错误
ctesty.c:(.text+0x20): undefined reference to 'sprintf'
make: *** [build/output.elf] Error 1
当然我已经包含了stdio.h,我也尝试将这个lib直接包含在makefile中,但没有成功。
windows - 在 Windows 上为 ARM 设置 QtCreator 交叉编译器
我需要为 BeagleBone Black 和 Raspberry Pi-2 开发 Qt 和命令行软件。理想情况下,我希望按照习惯使用 QtCreator,但无论如何我都需要使用 QtDesigner 进行 GUI 工作。
我花了几天时间浏览文章,兜兜转转,一无所获。
Raspberry Pi-2 与 Qt 5.2.3 一起安装了 Raspbian/Jessie。我可以在此设计、编译和运行 Qt 桌面应用程序。当然,编译速度很慢,并且不能真正用于开发工作。
为了保持简单,我下载了 qt-opensource-windows-x86-android-5.3.2.exe 并将其安装在我的 Windows 7(64 位)系统上。我相信这个 Qt 安装与 Pi-2 上的 Qt 版本相同,并且已经包含交叉编译所需的 ARM7 库文件。只需要一个用于 Windows/ARM 的交叉编译器吗?
Windows/QtCreator 在工具 > 选项 > Qt 版本中抱怨 Android armv7 的 Qt 5.3 声明“没有编译器可以为这个 Qt 版本生成代码......”。
对于 Windows/ARM 交叉编译器,我下载并安装了 Yagarto (yagarto-bu-2.23.1_gcc-4.7.2-c-c++_nl-1.20.0_gdb-7.5.1_eabi_20121222.exe)。我想我只需要在 Tools > Options > Compilers 中设置 QtCreator 编译器路径,然后事情就会开始工作。不是这种情况。
很明显,我错过了一些重要的东西,并且已经被我读过的不完全相关的文章的数量弄糊涂了。
Yagarto 是我在这种情况下需要的交叉编译器吗?
如何在 QtCreator 中定义编译器并消除错误?
有没有更简单的方法来设置这些东西?
谢谢你。
详细信息:QtCreator 3.2.1 (Qt 5.3.2) Windows 7 64 位服务包 1
编辑:
我刚刚再次尝试使用 GCC ARM Embedded ToolChain 和 GNU Make for Windows。结果是一样的,因为我似乎无法配置 QtCreator ARM7 的设置并让它开心。