如何将命令行参数传递给半托管程序?

时间:2015-09-15 17:12:35

标签: c embedded stm32 stm32f4discovery openocd

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

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

2 个答案:

答案 0 :(得分:0)

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

半主机环境通过在运行argcargv[]时将其作为普通可执与主人。链接半主机应用程序所需的库包括一些调用,这些调用在启动期间通过JTAG从主机检索此信息。 (如果您的目标未连接到JTAG,或者调试器未在主机上运行,​​则会导致应用程序无限期挂起。请勿在生产中与半主机库链接!)

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

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

答案 1 :(得分:0)

在挖掘所有可用的源文件后计算出来。由于OpenOCD用作调试服务器,因此它正在为主机调用请求提供服务。对于SEMIHOSTING_SYS_GET_CMDLINE (0x15)请求,它使用硬编码的argv字符串填充foobar缓冲区,可以在OpenOCD src/arm_semihosting.c源文件中查看。