问题标签 [bare-metal]
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(裸机):调用二进制文件作为函数
我有用于 AT91sam9 ARM 控制器的 AT91Bootloader。我需要添加一些额外的硬件初始化,但我只编译了 .bin 文件。我将 bin 文件加载到内存并尝试调用它:
但是,没有任何结果。请尽量少用汇编。我之前被介绍过汇编程序,但由于它的同谋,我无法理解 ARM 汇编程序。如何从引导加载程序中间调用,执行 bin 文件(它将在某个内存扇区,例如 0x00005000)然后返回引导加载程序并继续执行它自己的代码?
gdb - How to get a call stack from a SoftWare Interrupt exception
I'm trying to debug a program running on a bare-metal ARM platform using gdb
. At some point an SWI
(Software Interrupt) exception is generated. However the back-trace doesn't show what generated the exception as you can see:
(gdb) c
The program running on the ARM was compiled with arm-none-linux-gnueabi-gcc -O2 -c -ggdb
, I also tried using -O0
with the same result.
How can I get a meaningful call stack? Is there another way to find what is generating this exception?
gdb - 软件中断异常还是未定义指令异常?
我正在使用 JTAG 连接器和 gdb 在裸机 ARM(符合 v5TE)上运行程序。该程序以管理员模式从某个 SDRAM 运行,并且仅使用 arm 指令。
在某些时候会发生异常。使用 ctrl+CI 停止 gdb 可以看到 CPSR 指示未定义的异常模式,但是程序计数器指示软件中断异常 ( 0xffff0008
)。根据ARM ARM,当发生未定义的指令异常时,PC_und
应该是0xffff0004
或0x00000004
。我的程序发生了什么,是否发生了 SWI 或未定义的指令异常?
编辑以使我的问题更清楚:
我的程序目的是测试定制板的硬件。当出现硬件问题时,RAM 中的程序可能会损坏(如下所示),这是产生异常的原因。当硬件正常时,测试软件运行没有问题。我的 RAM 地址范围从 0 到 0x40000000,程序加载在 0x1000 和 0x2000 之间。监督模式堆栈指针设置为 0xff0。中断向量仅包含断点。
未定义异常模式的寄存器:
从管理员模式注册:
这是 RAM 中的(损坏的)程序,位于主管链接寄存器指向的地址周围:
从程序目标文件转储:
boot - 类型 1 管理程序启动顺序
我对类型 1 虚拟化有一个非常基本的查询。我真的很想了解启动过程。
1 类管理程序基本上在裸机级别运行,直接与硬件通信。
我的问题是,当系统启动并加载引导代码时,下一个加载的组件是管理程序,或者初始化本身是否需要一个管理操作系统?
任何人都可以参考 1 类管理程序向我解释引导顺序吗?
我认为它应该像引导代码一样直接引用管理程序组件,而管理程序组件又负责加载其他虚拟 VM 实例的内核。
assembly - 装配中的搬迁
我有一个用汇编语言编写的裸机 ARM 的启动代码,我试图了解它是如何工作的。该二进制文件被写入一些外部闪存中,并在启动时将其自身的一部分复制到 RAM 中。在这种情况下,我仍然没有完全理解重定位的概念,即使我阅读了这个wikipedia entry。RAM 映射到低地址窗口,闪存映射到高地址窗口。有人可以向我解释为什么我们在这里测试链接寄存器的值吗?
ld - 链接描述文件中的段加载地址和执行地址
我正在为裸机 ARM 应用程序编写自定义链接器脚本。该应用程序存储在闪存中,目前我有一个启动代码将整个应用程序复制到 SDRAM 中,并继续在 SDRAM 中执行以提高速度。我想修改此脚本以直接从 Flash 运行整个代码,但我无法理解某些元素。
在下面的链接描述文件中,该.ram_data
段有一个执行地址RAM
和一个加载地址ROM
(这两个段都在 SDRAM 中)。据我了解,链接器使用执行地址来对所有与 PC 无关的元素进行符号解析,但是加载地址呢?在裸机 ARM 的上下文中,没有程序加载器之类的东西,链接器也无法影响我在闪存中编写程序的位置,那么它实际上是用来做什么的呢?
同样,链接器如何对运行时的 (rx) 或 (rw) SDRAM 产生任何影响?当我修改内存区域中的这些选项时,它实际上会改变什么吗?
assembly - 了解程序集堆栈操作
我正在裸机 ARM 上编写一个 sdram 测试程序。我用 C 编写了它,但现在我想修改生成的程序集以防止程序使用 sdram,这意味着除其他外,没有堆栈。
我最近开始学习ARM汇编,不明白编译器生成的汇编是如何使用下面代码中的堆栈的(我通过阅读ARM ARM :/也找不到答案)。32位的变量值放在栈上,但是为什么push在函数开头保留3乘以32位呢?有人可以在这里解释堆栈操作吗?
C代码:
生成的程序集(来自 gcc-arm-elf):
arm - ARM 开发快速入门
我想尝试使用 ARM 平台进行开发,特别是我对裸机感兴趣。我正在尝试使用 QEMU 开始,但是这种学习方式缺乏全面的教程,并且不可避免地增加了另一个级别的复杂性。请推荐一个符合以下要求的体面的 ARM 开发平台(按重要性降序排列):
- 附带一个很好的分步教程。
- 提供基本输入/输出。我想看到一些闪烁并能够按下它上面的一些按钮。此外,拥有数字显示器(如计算器)甚至液晶显示器会很棒
- 至少提供一些调试功能。
- 现代的。
assembly - 有没有无分支实现数字逻辑功能的系统?
我打算在电气工程上问这个,但决定它与编程更相关。
通过数字逻辑,我们可以使用卡诺图或布尔代数将真值表简化为最小化的函数。在 CPU 上,这些函数当然可以使用条件语句来表达,但是,我很好奇是否有一种标准方法可以在没有分支的情况下实现它们,只要可能的话,只使用位操作。
我不知道现在能够做到这一点是否有趣,或者使用今天的处理器是否真的会更有效。尽管如此,它在过去可能是相关的,无论如何知道它会很有趣。
所以,假设我有f = !a*b + !b*!c
或任何类似的功能:是否有一个系统(如卡诺)通过使用额外的寄存器、计算总位、掩码等来找出是否存在避免分支的“智能”方法?或者,它只是你看到的东西,如果你看到它,否则你没有?
embedded - 对于没有 ARM 经验的人来说,学习强大的嵌入式系统的最佳开发路径是什么?
我想设计需要大量计算能力的低成本嵌入式系统,例如实时高清视频压缩。
对于有 PIC 和 Atmel 架构经验但没有 ARM 或 Linux 经验的人来说,通往“强大”嵌入式系统的最佳途径是什么?
强大的意思是 >=32 位处理器,时钟频率 >=500MHZ 和大量内部 RAM 和闪存。
显而易见的首选是在 ARM 处理器上运行的 Linux。我对这条路径的看法是它漫长而困难,运行 Linux 通常需要外部 RAM 和/或非易失性存储器(例如闪存驱动器),更不用说支持诸如 PMIC(电源管理 IC)之类的硬件了。所有这些支持基础设施都很昂贵。
裸机 ARM 将消除 Linux 的学习曲线,但我的看法是大多数 ARM 芯片都没有完整的文档记录,即使它们正在开发也很困难,因为 ARM 架构的复杂性。
还有什么其他好的选择?