半托管功能通常通过与标准C库接口的特殊库来实现。在许多情况下,该库默认包含在开发环境中。例如,在Renesas Synergy(TM)平台e2 Studio中,默认包含–specs=rdimon.specs选项,其中包括使用半托管的挂钩。开发人员需要做的就是包含标准库,并且他们模块中的所有printf语句都通过半托管设施重定向。
在最低级别,通过触发SWI指令(软件中断)在ARM内核中实现半托管,该指令已被SVC指令(监督调用)取代。在某些部分,也可能使用BKPT指令。当指令执行时,处理器停止执行应用程序并等待调试器访问处理器并检索需要传输到主机的内容。
表面上的半托管似乎是个好主意,并非所有嵌入式目标都具有连接键盘、屏幕或文件系统的 i/o 功能,半托管提供了通过主机环境拥有此功能并使用调试器传输数据的能力。
首先,半托管非常慢。在嵌入式开发中,CPU停止并且调试器必须访问内核、传输到主机然后恢复操作这一事实会导致执行延迟,可能长达数十毫秒!这比大多数系统滴答持续时间更长,并且可能对软件的实时性能造成严重破坏。
其次,当启用半主机时,处理器会暂停并等待调试器。如果调试器未连接到系统,处理器将无限期停止!这意味着半托管只能在调试期间使用,开发人员必须编译出他们的半托管功能以用于生产。否则,他们的设备可能会在等待调试器检索信息并恢复操作时挂断最终用户。这种阻塞行为令人失望,但开发人员需要接受这一事实。
最后,半托管不是确定性的。执行时间可能会有很大差异,并且可能会使开发人员发疯,因为他们试图在他们的软件中追踪真正源于使用半托管的奇怪行为。在实时应用程序中,确定性至关重要,应不惜一切代价避免任何可能影响这一点的事情。
半托管是一个非常简洁的功能,在许多情况下肯定会对开发人员有所帮助。然而,在大多数情况下,它更像是一个问题而不是资产。尽管如此,对于嵌入式开发开发人员来说,了解可用的工具和功能也很重要。建议你花一个小时左右的时间来探索工具链中存在的半托管功能,并了解它们如何影响时间以及你开发系统的能力。
发表评论 取消回复