我正在查看由GNU ARM Eclipse插件生成的STM32f4xx项目模板,并启用了半主机。 main
函数定义了argc
和argv
参数,这在独立式嵌入式程序中毫无用处,但在半托管调试程序的情况下,它们可以通过使用某种机制。所以我的问题是如何访问此机制?现在,在没有对模板和项目设置进行任何更改的情况下,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
,从那里我迷失了。
答案 0 :(得分:0)
这是您的可执行文件的名称。您可能在创建项目时设置它并忘记了它。
半主机环境通过在运行argc
和argv[]
时将其作为普通可执与主人。链接半主机应用程序所需的库包括一些调用,这些调用在启动期间通过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
源文件中查看。