2

我正在查看 STM32f4xx 项目模板,它由GNU ARM Eclipse插件生成,并启用了半主机。该main函数使用argcargv参数定义,这在独立的嵌入式程序中非常无用,但在半托管调试程序的情况下,可以使用某种机制传递它们。所以我的问题是如何访问这个机制?现在,没有对模板和项目设置进行任何更改,argv[0]等于一个字符串"foobar",我不知道它来自哪里。而且我不知道如何将其他字符串传递给它。更多信息:
- IDE:Eclipse + GNU Arm Eclipse 插件
- 工具链:GCC ARM Embedded
- 调试:工具链中的 Eclipse + OpenOCD + GDB
- 硬件:STM32f401vC

更新:我开始怀疑该常量深埋在newlib代码中。我可以看到 args 读取被触发的位置(它在 中_syscals.ccall_host (SEMIHOSTING_SYS_GET_CMDLINE, &cmdBlock);,但我无法弄清楚它是在哪里处理的。然后它被转换为a bkpt 0xAB,从那里我迷路了。

4

2 回答 2

0

在挖掘了所有可用的源文件后弄清楚了。由于 OpenOCD 用作调试服务器,它为主机调用请求提供服务。对于SEMIHOSTING_SYS_GET_CMDLINE (0x15)请求,它argv使用硬编码字符串填充缓冲区foobar,这可以在 OpenOCDsrc/arm_semihosting.c源文件中观察到。

于 2015-09-15T20:22:25.970 回答
0

这是您的可执行文件的名称。您可能在创建项目时设置了它并忘记了它。

半主机环境模拟应用程序在类 UNIX 操作系统中作为普通可执行文件运行,方法是在应用程序运行时传递argcargv[],并允许应用程序使用某些系统调用与主机通信。链接半主机应用程序所需的库包括一些调用,它们在启动期间通过 JTAG 从主机检索此信息。(如果您的目标未连接到 JTAG,或者调试器未在主机上运行,​​这将导致您的应用程序无限期挂起。不要与生产中的半主机库链接!)

有关半主机的更多信息,请参阅 ARM 文档的“半主机”部分:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471g/Bgbjjgij.html

于 2015-09-15T17:45:43.960 回答