问题标签 [semihosting]

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 回答
531 浏览

stm32 - OpenOCD 在断点处退出

我正在 STM32F042 上开发应用程序。我从一个 makefile 驱动一切,包括我的单元测试。我使用 OpenOCD 和 ST-LINK 来刷新目标。我的单元测试在主机和目标上运行。主机单元测试驱动程序在成功时从 main() 返回 0,在失败时返回非零,因此 makefile 知道测试是否通过。makefile 在目标上闪烁并开始测试,但不知道它们是成功还是失败。嵌入式测试应用程序打开红色 LED 表示失败,绿色表示通过,所以我知道——现在我想自动化这一步。

我想在代码中设置两个断点,一个在故障处理程序中,一个在 main 末尾,并告诉 OpenOCD 如果遇到一个或另一个断点,则以零或非零状态退出。

所以我的问题归结为两个具体的问题:

  1. 要设置断点,我需要知道特定代码行的 PC 值。如何从 arm-gcc 工具链中获取该值?

  2. 我可以将 OpenOCD 配置为在特定断点处以特定状态退出吗?

0 投票
1 回答
435 浏览

arm - STDOUT 与 GDB、OopenOCD 和半主机有什么关系?

我正在尝试找出 ARM(STM32042)上的半主机。如果我直接从命令行运行并通过 TCP连接到它,我可以看到printf输出。但是,如果我从内部启动,输出会转到天空中的某个大 /dev/null 。openocdgdbopenocdgdb

如果我启动openocd自己

gdb并像这样连接到它

printf我在opeocd终端中看到了输出。但是,如果我按照此链接的建议openocd从内部启动,gdb

我看到所有openocd调试消息(例如,xPSR: 0xc1000000 pc: 0x08001648 msp: 0x20001800, semihosting),但没有看到我printf的 s。

0 投票
2 回答
173 浏览

assembly - 如果 ASM 模板中没有指定输入和输出操作数,那么提供输入和输出操作数有什么意义?

我在u-boot/arch/arm/lib/semihosting.c中找到了以下代码,它使用bkpt和其他指令并提供输入和输出操作数,即使它们未在 ASM 模板中指定:

最小的,可验证的例子:

根据 ARM 体系结构参考手册bkpt指令采用单个 imm 参数,并且根据我对内联汇编的 GCC 手册部分的阅读,如果模板中未指定操作数,则 GCC 不允许提供操作数。生成的输出程序集-S

那么"=r" (result) : "0"(sysnum), "r"(addr)这一行的意义何在:

?

0 投票
1 回答
174 浏览

gcc - 裸机 ARM Cortex-A7 newlib crt0 未初始化 .bss 和 .data 区域

我正在学习编写裸机 ARM Cortex-A7 固件以在带有半主机的 QEMU 上运行。我知道 ARM GCC 有一个名为 newlib 的 libc 实现,它支持常用 libc 函数的半主机。所以我试图让 newlib 也能正常工作。

在解决了很多问题之后,代码终于在 QEMU 上正常运行了:https ://github.com/iNvEr7/qemu-learn/tree/master/semihosting-newlib

(注意:QEMU 5.2.0 似乎有一个错误会导致 newlib 对 HEAPINFO 的半主机调用崩溃,因此要在 QEMU 上运行我的代码,您必须编译 QEMU 主服务器,并使用make runtarget 在 tmux 会话中使用 QEMU 运行代码)

但是,我想为我在与 newlib 集成时遇到的一些问题找到一些答案。

据我了解,newlib 作为一个 libc 实现,提供了一个 crt0 例程来初始化应用程序的内存区域,包括 .bss、.data、堆和堆栈。

但是,根据我的测试,GCC 链接的 crt0 不会初始化 .bss 和 .data 区域,因此会导致后面的 crt0 例程崩溃。

所以我必须为 .bss 和 .data 编写自己的初始化代码,以使其正确运行。

所以我想了解我是否以正确的方式做事?我是否遗漏了一些可以让 newlib 为我初始化这些区域的东西?还是自己进行初始化是常规的?

注意:我正在使用 arm-none-eabi-gcc stable 9-2019-q4-major

0 投票
1 回答
45 浏览

arm - 捕获 QEMU 半主机 I/O

出于单元测试的目的,我希望能够使用 qemu 运行裸机二进制文件并捕获它的输出。

示例文件:

运行:

显示到控制台的是:

此“示例文本”是在 QEMU 中生成的,因此将 stdout 重定向到文件不会捕获它(仅限:QEMU 2.8.0-13 监视器 - 键入“帮助”以获取更多信息 (qemu))。-d help就我所见,查看可用的 qemu 日志记录选项并没有提供任何东西。

编辑

一个 hacky 解决方案是使用脚本来捕获终端会话: script --quiet --command <qemu-shell-script-wrapper>