開(kāi)放源碼的嵌入式仿真環(huán)境SkyEye(二)
——
第一種是BSD API。這種API非常像BSD標(biāo)準(zhǔn)UNIX中的socket API,所以對(duì)其這樣命名。它跟普通的socket API一樣,是基于open-read-write-close模型的。它提供了一種標(biāo)準(zhǔn)的方法來(lái)使用LwIP協(xié)議棧。但這種API效率較低,消耗資源較多,因此不推薦使用。
第二種稱(chēng)為RAW API。這種API接口實(shí)際上是直接使用了LwIP協(xié)議棧中的回調(diào)函數(shù)(call back functions),從而使應(yīng)用程序和協(xié)議棧代碼能夠更好地集成在一起,運(yùn)行同一個(gè)線(xiàn)程即任務(wù)中。RAW API相對(duì)于普通BSD API來(lái)說(shuō),速度更快,消耗內(nèi)存資源更少;唯一的缺點(diǎn)是編程復(fù)雜,對(duì)程序員的要求高??紤]到我們是在嵌入式設(shè)備中工作,這樣的缺點(diǎn)是可以接受的。事實(shí)上,BSD API就是用RAW API來(lái)實(shí)現(xiàn)的。
利用Berkley API實(shí)現(xiàn)的tcpecho_thread是一個(gè)TCP Echo服務(wù)器,監(jiān)聽(tīng)7號(hào)端口,這實(shí)際上是實(shí)現(xiàn)了RFC中最簡(jiǎn)單Echo協(xié)議:收到什么,就往回發(fā)同樣的內(nèi)容。編譯運(yùn)行后,用ping IP地址命令可以得到ICMP reply響應(yīng)。用telnet IP地址7(登錄7號(hào)端口)命令可以看到Echo Server的回顯效果。說(shuō)明ARP、ICMP、IP、TCP協(xié)議都已正確運(yùn)行。
5.2μC/OS-II只提供了操作系統(tǒng)內(nèi)核,用戶(hù)要自己添加文件處理、人機(jī)界面、網(wǎng)絡(luò)接口等重要部分。大部分人認(rèn)識(shí)OS都是從這里開(kāi)始的。
由于SkyEye下的仿真串口UART已經(jīng)實(shí)現(xiàn)了中斷方式的接收(實(shí)際是從鍵盤(pán)接收輸入)和輸出(實(shí)際上是輸出到終端屏幕),所以實(shí)現(xiàn)一個(gè)類(lèi)似Bash的簡(jiǎn)化版Shell并不困難。其本質(zhì)思想就是:Shell作為一個(gè)μC/OS-II下的任務(wù),工作于內(nèi)核之外,占用一個(gè)任務(wù)號(hào)。它接收用戶(hù)輸入的字符,存儲(chǔ)到緩沖區(qū),并回顯到屏幕上,以回車(chē)鍵為用戶(hù)輸入的結(jié)束信號(hào),隨后解析用戶(hù)輸入的命令名稱(chēng)、參數(shù),調(diào)用相應(yīng)的命令函數(shù)。一直到這個(gè)命令函數(shù)運(yùn)行返回,才繼續(xù)Shell的人機(jī)交互界面。
我們目前在μC/OS-II下實(shí)現(xiàn)的Shell被命名為Genie Shell。它實(shí)現(xiàn)了最基本的命令輸入、解析參數(shù)、調(diào)用命令函數(shù)功能,以及兩條示例性的命令。這個(gè)Shell的特色是采用了一些面向?qū)ο蟮乃悸穪?lái)實(shí)現(xiàn)Shell的各種命令。Genie Shell把每個(gè)命令看成一個(gè)對(duì)象,對(duì)象的屬性是命令名,而對(duì)象的方法就是命令的執(zhí)行函數(shù)本身。用戶(hù)輸入命令及參數(shù)后,將參數(shù)傳遞給對(duì)象的方法并執(zhí)行。要Shell中增加一條命令,就是增加一個(gè)對(duì)象,并實(shí)現(xiàn)這個(gè)對(duì)象的方法,以利于今后做進(jìn)一步的擴(kuò)充。
5.3μClinux上的應(yīng)用程序
目前μClinux-dist-20030305已經(jīng)可以在SkyEye上運(yùn)行。其中的sash(shell)、ping、ifconfig、telnet,telnet server、ftp、ftp server、boa(http server)、mount with nfs support等主要的應(yīng)用程序都可以成功地運(yùn)行在SkyEye中,而且不需要對(duì)應(yīng)用程序進(jìn)行任何修改。
6 SkyEye正在開(kāi)展的工作
6.1 LCD仿真
作為單片機(jī)系統(tǒng)重要的輸出設(shè)備,LCD屏幕用得非常廣泛,因此,我們認(rèn)為有必要為SkyEye加入LCD控制器設(shè)備仿真。我們使用GTK+圖形函數(shù)庫(kù)在Xwindow中模擬出一個(gè)LCD屏幕,這樣在SkyEye上運(yùn)行的OS,其LCD驅(qū)動(dòng)程序會(huì)像驅(qū)動(dòng)真正的LCD控制器一樣發(fā)送控制命令,而SkyEye解釋這些控制命令,并且應(yīng)地在GTK+繪出的窗口中畫(huà)不同灰度或顏色的點(diǎn)。這里對(duì)GTK+的使用僅限于繪制窗口和畫(huà)點(diǎn),因?yàn)檫@是LCD屏幕的最基本動(dòng)作,其它所有的工作如畫(huà)圖、GUI的實(shí)現(xiàn)都應(yīng)該由應(yīng)用程序利用畫(huà)點(diǎn)的功能去實(shí)現(xiàn),與SkyEye本身無(wú)關(guān)。
LCD的buffer RAM是映射到內(nèi)存RAM中的。LCD屏幕的每個(gè)點(diǎn)對(duì)應(yīng)內(nèi)存中的1位或幾位,各個(gè)點(diǎn)所對(duì)應(yīng)的內(nèi)存按行序連續(xù)存放。LCD上顯示什么內(nèi)容,完全由這塊內(nèi)存決定。LCD仿真控制器會(huì)根據(jù)這塊內(nèi)存去刷新屏幕顯示,刷新頻率等參數(shù)要根據(jù)具體使用的LCD屏幕來(lái)決定。OS中的LCD驅(qū)動(dòng)程序要往LCD屏幕上寫(xiě)東西,就是寫(xiě)這塊內(nèi)存。
6.2 基于ARM的其它體系結(jié)構(gòu)的仿真
S3C4510B是三星公司推出的針對(duì)嵌入式應(yīng)用的16/32位嵌入式處理器,是一款應(yīng)用十分廣泛的嵌入式處理器。該微控制器專(zhuān)為以太網(wǎng)通信系統(tǒng)的集線(xiàn)器和路由器而設(shè)計(jì),具有低成本和高性能的特點(diǎn)。S3C4510B中內(nèi)置了ARM公司設(shè)計(jì)的16/32位ARM7TDMI處理器,可以執(zhí)行32位的ARM指令,也可執(zhí)行16位的THUMB指令,并集成了多種外圍部件。目前,SkyEye仿真的體系結(jié)構(gòu)還比較少,嘗試對(duì)S3C4510B的仿真,一方面是使SkyEye能夠支持更多的體系結(jié)構(gòu);另一方面,通過(guò)仿真S3C4510B,有助于為SkyEye設(shè)計(jì)可擴(kuò)展框架,使SkyEye更具通用性和模塊化。
Intel公司的StrongARM芯片SA1110的最高運(yùn)行速度可達(dá)206MHz;其內(nèi)部有強(qiáng)大的指令操作能力、高速緩沖能力、寄存器管理能力、讀/寫(xiě)緩沖器能力。SA1110寄存器總線(xiàn)接口可與DRAM、SDRAM、ROM、SMROM、SRAM以及其它潛在的I/O器件共享數(shù)據(jù)信號(hào),其寄存器與PCMCIA模塊支持4個(gè)快速大同小頁(yè)操作模式(FPM)、擴(kuò)展數(shù)據(jù)輸出(EDO)、同步DRAM、6個(gè)靜態(tài)存儲(chǔ)器、6個(gè)ROM/SDRAM等。SA1110可提供系統(tǒng)支持邏輯、多個(gè)串行通信通道、1個(gè)彩色/灰度LCD控制器、2個(gè)PCMCIA插槽、28個(gè)GPIO口;內(nèi)部提供定時(shí)器、電源管理、指令控制、復(fù)位控制、時(shí)鐘產(chǎn)生、中斷控制等功能。SA1110電源管理提供正常、空閑、睡眠三種工作狀態(tài),其內(nèi)部包含六通道的DMA控制器,用于支持串行通信過(guò)程中的數(shù)據(jù)高速運(yùn)行,如串行通道與外部寄存器、DRAM、SRAM、Flash、ROM等之間的通信;此外,還有1個(gè)用于支持LCD控制器工作的獨(dú)立的DMA控制器SA1110,它有5個(gè)獨(dú)立的串行通道,可分別執(zhí)行半雙工被動(dòng)協(xié)議的通用串行總線(xiàn)(USB)通信、紅外數(shù)據(jù)(IrDA)通信、多媒體通信口/同步串行口(MCP/SSP)通信等。SA1110通過(guò)指令和數(shù)據(jù)斷點(diǎn)提供調(diào)試支持,還提供JTAG口,用于進(jìn)行系統(tǒng)連續(xù)檢查。通過(guò)對(duì)StrongARM芯片的仿真,除了有助于SkyEye設(shè)計(jì)可擴(kuò)展框架外,還將推動(dòng)下一步對(duì)Intel的XScale系列CPU的研究。
5.3 SkyEye集成開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)
集成開(kāi)發(fā)環(huán)境是SkyEye的一個(gè)重要組成部分,利用它,可以直接在可視環(huán)境中編輯、編譯、調(diào)試和修改OS代碼,方便了軟件開(kāi)發(fā)和稱(chēng)一。由于SkyEye的用戶(hù)接口是基于GDB的,所有支持GDB的集成開(kāi)發(fā)環(huán)境都可以很容易地移植為SkyEye的集成開(kāi)發(fā)環(huán)境。目前的Windows版本借鑒Dev-Cpp的源代碼,主要與Cygwin版本的SkyEye進(jìn)行通信,以進(jìn)行方便的、可視化的調(diào)試。Linux版本的IDE采用的是修改過(guò)的KDevelop3.0,目前它能和SkyEye進(jìn)行很好的集成,完成全以充分利用Kdevelop3.0的強(qiáng)大功能。
6.4 SkyEye可擴(kuò)展框架的設(shè)計(jì)
目前SkyEye各個(gè)部分的仿真還是緊耦合的,各仿真模塊之間的接口還不夠清晰,這不利于SkyEye的擴(kuò)展。如果要支持更多的CPU和嵌入式環(huán)境,需要很大的工作量,而且用戶(hù)也無(wú)法進(jìn)行二次開(kāi)發(fā),阻礙了SkyEye的進(jìn)一步推廣和應(yīng)用。這就需要為SkyEye設(shè)計(jì)一個(gè)可擴(kuò)展框架。目前,框架的設(shè)計(jì)要集中于定義和實(shí)現(xiàn)CPU的內(nèi)部接口,如內(nèi)存接口和協(xié)議處理器接口等,以讓它支持更多的CPU;下一步會(huì)為SkyEye設(shè)計(jì)虛擬外部接口,讓用戶(hù)可以根據(jù)自己的硬件或者應(yīng)用,來(lái)定義外設(shè)的功能,并能在SkyEye上方便地仿零點(diǎn)和驗(yàn)證,從而為用戶(hù)增加二次開(kāi)發(fā)的功能,讓SkyEye得到更廣泛的應(yīng)用。
7 總結(jié)與展望
經(jīng)過(guò)幾個(gè)月的努力,SkyEye已經(jīng)有了很大的發(fā)展,各方面的工作已經(jīng)按照計(jì)劃有條不紊地進(jìn)行著??梢哉f(shuō),SkyEye作為嵌入式系統(tǒng)的仿真環(huán)境,已經(jīng)成為學(xué)習(xí)嵌入式系統(tǒng)十分有效的工具。同時(shí),SkyEye在許多方面還有待手改進(jìn):一是要提高SkyEye的易用性,這就需要完善SkyEye的集成開(kāi)發(fā)環(huán)境,改善其用戶(hù)接口;再就是提高SkyEye的通用性,這需要SkyEye支持更多的外圍設(shè)備、更多的體系結(jié)構(gòu)乃至更多的CPU類(lèi)型。
在開(kāi)發(fā)的過(guò)程中,SkyEye項(xiàng)目得到了很多嵌入式愛(ài)好者大力的支持和熱情關(guān)注,項(xiàng)目的開(kāi)發(fā)隊(duì)伍也在不斷壯大。作為開(kāi)源項(xiàng)目,SkyEye真誠(chéng)希望廣大計(jì)算機(jī)愛(ài)好者積極參與與并對(duì)SkyEye的發(fā)展提出寶貴的意見(jiàn)和建議。
評(píng)論