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