ARM標(biāo)準(zhǔn)庫(kù)
下面給出了具體實(shí)現(xiàn)的模板,能夠根據(jù)實(shí)際需要修改。 }; } ! Semihosted Semihosted 環(huán)境 (semihosting 是針對(duì) ARM 目標(biāo)機(jī)的一種機(jī)制,它能夠根據(jù)應(yīng)用程序代碼的輸入 / 輸出請(qǐng)求,與運(yùn)行有調(diào)試功能的主機(jī)通訊。這種技術(shù)允許主機(jī)為通常沒(méi)有輸入和輸出功能的目標(biāo)硬件提供主機(jī)資源 ) 可以在你的 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 公司對(duì) Semihosting 的中文解釋是半主機(jī)機(jī)制。為什么叫半主機(jī)呢?主要是指應(yīng)用程序的代碼運(yùn)行在目標(biāo)系統(tǒng)上,當(dāng)需要類似 PC 平臺(tái)下的控制臺(tái)輸入輸出時(shí),會(huì)調(diào)用 Semihosting 去利用 PC 上的控制臺(tái)輸入輸出設(shè)備:如打開關(guān)閉文件, PC 顯示器輸出,鍵盤輸入等等。 2 、 Semihosting 在 ADS1.2 的開發(fā)環(huán)境下,只能在以下調(diào)試代理上運(yùn)行, ARMulator, RealMonitor, Multi-ICE 以及 Angle 。這就是為什么周工的 EasyJTAG 不支持 Semihosting 的原理,因?yàn)樗粚儆谏鲜鏊姆N調(diào)試代理中的任何一種。 3 、 Semihosting 是一段功能代碼,這段功能代碼主要運(yùn)行在 PC 上,并由調(diào)試工具上的固件來(lái)激活調(diào)用。而周工的 EasyJTAG 沒(méi)有實(shí)現(xiàn)這個(gè)激活調(diào)用功能。 4 、對(duì)于開發(fā)用戶來(lái)說(shuō), Semihosting 是目標(biāo)系統(tǒng)通過(guò)調(diào)用 SWI 0x123456 或 SWI 0xAB 來(lái)調(diào)用的。前者 ARM 狀態(tài)下的專用操作號(hào),后者是 THUMB 狀態(tài)的專用操作號(hào)。當(dāng)開發(fā)者的軟硬件調(diào)試工具配置正確時(shí),可以正確執(zhí)行 Semihosting 功能。打個(gè)比方說(shuō),你在 ARMulator 下仿真指令 在 AXD 中運(yùn)行程序時(shí),報(bào)告 out of heap memory ? 不是程序的問(wèn)題。因?yàn)?ADS 調(diào)用了 semihosting ,所以需要修改變量 $top_of_memory 。 使用 SEMIHOSTING 時(shí), SEMIHOSTING 的設(shè)置一般不需要修改。主要的是設(shè)置 TOP_OF_MEMORY, 這個(gè)值指定的部分內(nèi)存空間在 SEMIHOSTING 的時(shí)候需要用到。你要保證 TOP_OF_MEMORY 值知道的空間是可用的。而且,要使用 SEMIHOSTING 的話,你需要做些初始化的工作的,如果你沒(méi)有用 MAIN 的話,需要自己添加,如果你有 MAIN 函數(shù)的話,編譯器自己會(huì)添加。 SEMIHOSTING 主要是針對(duì) I/O 操作的,在嵌入式開發(fā)過(guò)程當(dāng)中,通過(guò) SEMIHOSTING ,可以把輸入輸出定向到 HOST 上,利用 HOST 的輸入和輸出。 從用戶的角度來(lái)看, printf 好像和普通的一樣,關(guān)鍵的區(qū)別在于 printf 的實(shí)現(xiàn)。一般的調(diào)試器都提供兩個(gè)版本的 IO 庫(kù),一個(gè)式標(biāo)準(zhǔn)的庫(kù),另外一個(gè)是支持 semihosting 的庫(kù)。其實(shí)現(xiàn)有區(qū)別。下面以 printf 舉例說(shuō)明其原理:支持 semihosting 的 printf 的實(shí)現(xiàn)和標(biāo)準(zhǔn)的 printf 不同,支持 semihosting 的 printf 用 SWI 指令來(lái)通知仿真器。仿真器在地址 0x8 處設(shè)置斷點(diǎn),但 SWI 指令執(zhí)行后,仿真器可以捕獲到該 SWI 指令。根據(jù) SWI 的 number 來(lái)判斷這個(gè) SWI 是不是 SEMIHOSTING 請(qǐng)求,如果是,再根據(jù)具體的 semihosting number 響應(yīng)用戶的 semihosting 請(qǐng)求,完成用戶的 semihosting 請(qǐng)求后,返回到 SWI 的后面一條指令,繼續(xù)執(zhí)行。所以,對(duì)用戶來(lái)說(shuō),這是透明的。 在 ADS 下面,默認(rèn)的好像是支持 SEMIHOSTING 的,你自己寫一個(gè)簡(jiǎn)單的程序,用 printf 輸出,應(yīng)該能在 console 看到輸出。注意幾點(diǎn): 1. 在 AXD 里面 semihosting 必須要打開; 2. 仿真器必須支持 semihosting 。 在 ARM 的集成開發(fā)環(huán)境中,只讀的代碼段和常量被稱作 RO 段 (ReadOnly) ;可讀寫的全局變量 和靜態(tài)變量被稱作 RW 段 (ReadWrite) ; RW 段中要被初始化為零的變量被稱為 ZI 段 (ZeroInit) 。對(duì)于嵌入式系統(tǒng)而言,程序映象都是存儲(chǔ) 在 Flash 存儲(chǔ)器等一些非易失性器件中的,而在運(yùn)行時(shí),程序中的 RW 段必須重新裝載到可讀寫的 RAM 中。這就涉及到程序的加載時(shí)域和運(yùn)行時(shí)域。簡(jiǎn)單來(lái) 說(shuō),程序的加載時(shí)域 就是指程序燒入 Flash 中的狀態(tài),運(yùn)行時(shí)域 是指程序執(zhí)行時(shí)的狀態(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é)語(yǔ)
本文分析了ARM標(biāo)準(zhǔn)庫(kù)的工作機(jī)理,給出了裁減C庫(kù)進(jìn)行程式研發(fā)的關(guān)鍵步驟。實(shí)際應(yīng)用時(shí)需要根據(jù)具體的硬件環(huán)境和應(yīng)用需要裁減C庫(kù),提高代碼執(zhí)行效率。 .
在 semlhosted 環(huán)境下用來(lái)實(shí)現(xiàn) C 庫(kù)函數(shù)與目標(biāo)相關(guān)的函數(shù)。
MOV R1 , 0x18
SWI 0x123456
ARMulator 會(huì)正確終止你的程序執(zhí)行。
而在 EasyJTAG 下仿真時(shí),卻會(huì)跳入 0x08 的異常向量入口處。
SEMIHOSTING 相關(guān)配置
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
評(píng)論