ARM標準庫
下面給出了具體實現(xiàn)的模板,能夠根據(jù)實際需要修改。 }; } ! Semihosted Semihosted 環(huán)境 (semihosting 是針對 ARM 目標機的一種機制,它能夠根據(jù)應用程序代碼的輸入 / 輸出請求,與運行有調(diào)試功能的主機通訊。這種技術(shù)允許主機為通常沒有輸入和輸出功能的目標硬件提供主機資源 ) 可以在你的 Application Code 中使用 printf 等 stand IO Function in C Library! 方便調(diào)試!更多的你可以參考 ARM DUI 0058D ( Debug Target Guide ?。?p>http://infocenter.arm.com/help/topic/com.arm.doc.dui0058d/DUI0058.pdf 1 、 ARM 公司對 Semihosting 的中文解釋是半主機機制。為什么叫半主機呢?主要是指應用程序的代碼運行在目標系統(tǒng)上,當需要類似 PC 平臺下的控制臺輸入輸出時,會調(diào)用 Semihosting 去利用 PC 上的控制臺輸入輸出設備:如打開關閉文件, PC 顯示器輸出,鍵盤輸入等等。 2 、 Semihosting 在 ADS1.2 的開發(fā)環(huán)境下,只能在以下調(diào)試代理上運行, ARMulator, RealMonitor, Multi-ICE 以及 Angle 。這就是為什么周工的 EasyJTAG 不支持 Semihosting 的原理,因為它不屬于上述四種調(diào)試代理中的任何一種。 3 、 Semihosting 是一段功能代碼,這段功能代碼主要運行在 PC 上,并由調(diào)試工具上的固件來激活調(diào)用。而周工的 EasyJTAG 沒有實現(xiàn)這個激活調(diào)用功能。 4 、對于開發(fā)用戶來說, Semihosting 是目標系統(tǒng)通過調(diào)用 SWI 0x123456 或 SWI 0xAB 來調(diào)用的。前者 ARM 狀態(tài)下的專用操作號,后者是 THUMB 狀態(tài)的專用操作號。當開發(fā)者的軟硬件調(diào)試工具配置正確時,可以正確執(zhí)行 Semihosting 功能。打個比方說,你在 ARMulator 下仿真指令 在 AXD 中運行程序時,報告 out of heap memory ? 不是程序的問題。因為 ADS 調(diào)用了 semihosting ,所以需要修改變量 $top_of_memory 。 使用 SEMIHOSTING 時, SEMIHOSTING 的設置一般不需要修改。主要的是設置 TOP_OF_MEMORY, 這個值指定的部分內(nèi)存空間在 SEMIHOSTING 的時候需要用到。你要保證 TOP_OF_MEMORY 值知道的空間是可用的。而且,要使用 SEMIHOSTING 的話,你需要做些初始化的工作的,如果你沒有用 MAIN 的話,需要自己添加,如果你有 MAIN 函數(shù)的話,編譯器自己會添加。 SEMIHOSTING 主要是針對 I/O 操作的,在嵌入式開發(fā)過程當中,通過 SEMIHOSTING ,可以把輸入輸出定向到 HOST 上,利用 HOST 的輸入和輸出。 從用戶的角度來看, printf 好像和普通的一樣,關鍵的區(qū)別在于 printf 的實現(xiàn)。一般的調(diào)試器都提供兩個版本的 IO 庫,一個式標準的庫,另外一個是支持 semihosting 的庫。其實現(xiàn)有區(qū)別。下面以 printf 舉例說明其原理:支持 semihosting 的 printf 的實現(xiàn)和標準的 printf 不同,支持 semihosting 的 printf 用 SWI 指令來通知仿真器。仿真器在地址 0x8 處設置斷點,但 SWI 指令執(zhí)行后,仿真器可以捕獲到該 SWI 指令。根據(jù) SWI 的 number 來判斷這個 SWI 是不是 SEMIHOSTING 請求,如果是,再根據(jù)具體的 semihosting number 響應用戶的 semihosting 請求,完成用戶的 semihosting 請求后,返回到 SWI 的后面一條指令,繼續(xù)執(zhí)行。所以,對用戶來說,這是透明的。 在 ADS 下面,默認的好像是支持 SEMIHOSTING 的,你自己寫一個簡單的程序,用 printf 輸出,應該能在 console 看到輸出。注意幾點: 1. 在 AXD 里面 semihosting 必須要打開; 2. 仿真器必須支持 semihosting 。 在 ARM 的集成開發(fā)環(huán)境中,只讀的代碼段和常量被稱作 RO 段 (ReadOnly) ;可讀寫的全局變量 和靜態(tài)變量被稱作 RW 段 (ReadWrite) ; RW 段中要被初始化為零的變量被稱為 ZI 段 (ZeroInit) 。對于嵌入式系統(tǒng)而言,程序映象都是存儲 在 Flash 存儲器等一些非易失性器件中的,而在運行時,程序中的 RW 段必須重新裝載到可讀寫的 RAM 中。這就涉及到程序的加載時域和運行時域。簡單來 說,程序的加載時域 就是指程序燒入 Flash 中的狀態(tài),運行時域 是指程序執(zhí)行時的狀態(tài)。
#include
struct__FILE
{
FlLE_stdout;
int fputc(int ch,F(xiàn)ILE*f){
return ch; !
int ferror(FILE*f){
return EOF;
} .
結(jié)語
本文分析了ARM標準庫的工作機理,給出了裁減C庫進行程式研發(fā)的關鍵步驟。實際應用時需要根據(jù)具體的硬件環(huán)境和應用需要裁減C庫,提高代碼執(zhí)行效率。 .
在 semlhosted 環(huán)境下用來實現(xiàn) C 庫函數(shù)與目標相關的函數(shù)。
MOV R1 , 0x18
SWI 0x123456
ARMulator 會正確終止你的程序執(zhí)行。
而在 EasyJTAG 下仿真時,卻會跳入 0x08 的異常向量入口處。
SEMIHOSTING 相關配置
AXD 中:
1.OPTIONS -> CONFIGURE TARGET -> ARMULATE;
2.OPTIONS -> CONFIGRUE PROCESSOR -> SEMIHOSTING -> 選中
quote from:
http://forum.eepw.com.cn/forum/main?url=http://bbs.edw.com.cn/thread/61698/1
評論