本帖最后由 IFX_OwenSu 于 2024-9-2 11:23 编辑
我们在调试的过程中有时候需要用到printf等函数将信息输出到console中,但在DAVE中默认情况下是不能直接输出的,需要进行相关的配置。
这时候我们就需要用到Semihosting。Semihosting是一种在ARM处理器上运行的应用程序与调试器的主机进行通信的技术。通过这个机制,跑在ARM处理器上的应用程序可以使用主机的IO设备,比如键盘输入,屏幕输出以及文件的IO等等。如果目标开发板没有这些IO设备,或者为了使用printf()函数输出一些debug信息,那使用Semihosting将非常有用。
具体配置的步骤如下:
1. 在工程的properties中进行配置:
-> C/C++ Build ->Settings ARM GCC C Linker -> Miscellaneous -> Other Flags-> "-specs=rdimon.specs"
2. 添加相关的配置:
-> C/C++ Build ->Settings ARM GCC Assembler ->Preprocessor -> "__SKIP_LIBC_INIT_ARRAY"
3. 在debug configurations里勾选semihosting:
4. 在main函数中添加相关的定义
extern void initialise_monitor_handles(void);
int main(void)
{
initialise_monitor_handles();
…
// Example printf statements for semihosting
printf("XMClib printf using semihosting \n");
如果用的是DAVE CE工程,那么initialise_monitor_handles()需要放在DAVE_Init()之后。
5. 完成之后进行编译并运行代码,结果就会出现在console中。
注意:
配置的步骤其实很简单,但很多小伙伴在开发的时候会经常遇到以下类似的报错:
No source available for "_swistat() at 0x10001f4a"
No source available for "_fstat() at 0x10001f7a"
No source available for "_fstat_r() at 0x10001c0a"
这个问题在经过排查之后发现是J-LINK版本不同所导致的,目前用的比较新的版本是会遇到这个情况,比如V7.96或者以上版本。
V7.88/V7.68/V6.88这些版本测试过的都是没问题的,后续J-LINK版本的更新应该会把这个问题给修复。所以如果在遇到这个问题的时候可以将较新版本的驱动替换成我们测试过的能成功的版本。
如果有什么不清楚的,可以参考我们附件中配置好的代码。
|