所谓的半主机模式:semihosting机制
Semihosting技术将应用程序中的IO请求通过一定的通道传送到主机(host),由主机上的资源响应应用程序的IO请求, 而不是像在主机上执行本地应用程序一样,由应用程序所在的计算机响应应用程序IO请求, 也就是将目标板的输入/输出请求从应用程序代码传递到远程运行调试器的主机的一种机制。 简单来说,目标开发板上通常不会有输入/输出这些外设,开发板运行的代码想要将结果打印出来, 或者获得用户的输入,可以通过请求远程主机IO设备来实现,如:显示器,键盘等。 目标开发板执行代码中加入对输入/输出设备进行访问函数,如:printf,scanf等, 这些函数并不是目标开发板的库函数,而是远程主机交叉编译器中带有的库函数,这些库函数被编译时,编译成一条软件中断指令。 当目标开发板上电运行之后,执行到请求访问输入/输出设备指令时,产生特定中断号的软件中断SWI, 与开发板相连的调试器会先截获目标板SWI请求,由于开发板程序中也可能存在用户自定义软件中断, 为了区分二者,调试器会根据SWI的软中断号来判断是不是semihosting模式IO请求, 如果是,则取出R0寄存器里代表的具体请求号,然后使用远程主机来响应目标板具体IO请求, 而不是开发板本身去处理setmihosting请求。 semihosting仅仅是一种调试手段,它的工作原理就是利用调试器捕捉目标环境运行过程中产生SWI中断, 然后向远程主机调试环境发送对应的调试信息。 也就是说目标开发板通过特定的软件中断指令,借用了远程主机的输入输出设备实现IO请求的访问。
Semihosting半主机调试模式,只能使用在开发板和调试主机通过仿真器连接的情况下, 也就是说脱离了主机调试环境上述代码不能正常运行。 目标开发板上执行的IO实际上是交给了远程主机来处理实现,正是因为如此,这种方式只适合在调试模式下, 真正的嵌入式系统不可能依赖于主机实现IO处理的,嵌入式系统要想独立出来实现IO请求的处理, 这就需要将输入输出库函数的底层相关硬件实现重定向。
使用ITM机制实现调试,实现printf与scanf, ITM是ARM在推出semihosting之后推出的新一代调试机制。
ITM机制要求使用SWD方式接口,并需要连接SWO线。
What is semihosting?
Semihosting is a mechanism that enables code running on an ARM target to communicate and use the Input/Output facilities on a host computer that is running a debugger.
11.1 What is semihosting?
Examples of these facilities include keyboard input, screen output, and disk I/O. For example, you can use this mechanism to enable functions in the C library, such as printf()
and scanf()
, to use the screen and keyboard of the host instead of having a scre