半托管是ARM處理器支持的調試功能,在嵌入式開發(fā)中,它允許嵌入式目標通過調試接口訪問主機PC上的 i/o 功能。i/o 功能最常與printf一起使用,將文本數據傳輸到調試環(huán)境中的虛擬終端,但它也可用于文件訪問和鍵盤輸入。
半托管功能通常通過與標準C庫接口的特殊庫來實現。在許多情況下,該庫默認包含在開發(fā)環(huán)境中。例如,在Renesas Synergy(TM)平臺e2 Studio中,默認包含–specs=rdimon.specs選項,其中包括使用半托管的掛鉤。開發(fā)人員需要做的就是包含標準庫,并且他們模塊中的所有printf語句都通過半托管設施重定向。
在最低級別,通過觸發(fā)SWI指令(軟件中斷)在ARM內核中實現半托管,該指令已被SVC指令(監(jiān)督調用)取代。在某些部分,也可能使用BKPT指令。當指令執(zhí)行時,處理器停止執(zhí)行應用程序并等待調試器訪問處理器并檢索需要傳輸到主機的內容。
表面上的半托管似乎是個好主意,并非所有嵌入式目標都具有連接鍵盤、屏幕或文件系統(tǒng)的 i/o 功能,半托管提供了通過主機環(huán)境擁有此功能并使用調試器傳輸數據的能力。
首先,半托管非常慢。在嵌入式開發(fā)中,CPU停止并且調試器必須訪問內核、傳輸到主機然后恢復操作這一事實會導致執(zhí)行延遲,可能長達數十毫秒!這比大多數系統(tǒng)滴答持續(xù)時間更長,并且可能對軟件的實時性能造成嚴重破壞。
其次,當啟用半主機時,處理器會暫停并等待調試器。如果調試器未連接到系統(tǒng),處理器將無限期停止!這意味著半托管只能在調試期間使用,開發(fā)人員必須編譯出他們的半托管功能以用于生產。否則,他們的設備可能會在等待調試器檢索信息并恢復操作時掛斷最終用戶。這種阻塞行為令人失望,但開發(fā)人員需要接受這一事實。
最后,半托管不是確定性的。執(zhí)行時間可能會有很大差異,并且可能會使開發(fā)人員發(fā)瘋,因為他們試圖在他們的軟件中追蹤真正源于使用半托管的奇怪行為。在實時應用程序中,確定性至關重要,應不惜一切代價避免任何可能影響這一點的事情。
半托管是一個非常簡潔的功能,在許多情況下肯定會對開發(fā)人員有所幫助。然而,在大多數情況下,它更像是一個問題而不是資產。盡管如此,對于嵌入式開發(fā)開發(fā)人員來說,了解可用的工具和功能也很重要。建議你花一個小時左右的時間來探索工具鏈中存在的半托管功能,并了解它們如何影響時間以及你開發(fā)系統(tǒng)的能力。