構建單片機虛擬實驗仿真平臺_第1頁
構建單片機虛擬實驗仿真平臺_第2頁
構建單片機虛擬實驗仿真平臺_第3頁
構建單片機虛擬實驗仿真平臺_第4頁
構建單片機虛擬實驗仿真平臺_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

構建單片機虛擬實驗仿真平臺

摘要介紹了構建單片機虛擬實驗仿真平臺的基本思路和各功能的實現(xiàn)方法,詳細敘述了構建仿真平臺所使用的一些技術手段。關鍵詞虛擬實驗平臺;中斷;輸入輸出接口;示波器;仿真實驗

1引言虛擬仿真實驗是利用計算機創(chuàng)建出一個可視化的實驗操作環(huán)境,其中的每一個可視化仿真物體代表一種實驗儀器或者設備,通過操作這些虛擬的實驗儀器或設備,即可進行各種復雜的實驗,達到與真實實驗環(huán)境相一致的教學要求和目的。與傳統(tǒng)的硬件實驗平臺相比,虛擬實驗平臺可以不受時空的限制,用戶能隨時隨地進行實驗。通過采用虛擬化技術,利用軟件仿真,可以完全不使用真實的實驗儀器,因此不會存在儀器磨損、破壞等情況,既節(jié)省了資金,又有利于資源共享。對于有危險性的實驗,虛擬實驗平臺更具有優(yōu)勢。

2單片機虛擬實驗仿真平臺的實現(xiàn)

系統(tǒng)設計思想及總體設計我們開發(fā)的“單片機虛擬實驗平臺”將“硬件實驗臺”和“軟件調(diào)試環(huán)境”均統(tǒng)一進行虛擬化設計,亦即不僅“硬件實驗臺”設計為軟件形式,原來的匯編程序等調(diào)試工具也要重新專門進行設計,MASM等工具就不能使用。并且由于采用封閉式設計思路,對應用環(huán)境的適應性及其可靠性、穩(wěn)定性相對較強;也就是說,這種虛擬平臺下的實驗結果與硬件條件下的結果更為相似。圖1傳統(tǒng)單片機實驗系統(tǒng)組成結構該仿真平臺可以由如圖2所示的模塊圖來表示。從圖2可以看出8031和存儲器構成了虛擬的CPU,直接或間接地控制其它所有模塊,并負責執(zhí)行匯編語句。通信橋模塊實際上是一個虛擬的存儲空間,是接口芯片和外設(LED、開關和顯示器等)間數(shù)據(jù)交換的場所。接口芯片和外設之間不直接發(fā)生關系,它們通過通信橋模塊提供的接口將數(shù)據(jù)放入通信橋緩存或從通信橋緩存中取出數(shù)據(jù)。通常,通信橋分為輸入橋、輸出橋、芯片橋三種情況。開關與芯片連接構成輸入橋,LED或者顯示器與芯片連接構成輸出橋,芯片與芯片連接構成芯片橋。圖2總體框架圖

具體設計仿真平臺編譯原理仿真平臺對于匯編語言的編譯模擬了真實的CPU。大家都知道,真實的CPU在編譯過程中要使用寄存器(包括通用寄存器、特殊功能寄存器)。在虛擬的CPU環(huán)境下,我們模擬了一些寄存器,并且定義了一些執(zhí)行函數(shù)以及運行規(guī)則。當然,這些運行規(guī)則是根據(jù)匯編指令制定的。虛擬的編譯過程則是逐一與運行規(guī)則進行比較,從而檢查語法錯誤,同時生成數(shù)據(jù)庫存儲所得到的一些數(shù)據(jù)。我們可以更具體地表述一下虛擬編譯系統(tǒng)的工作過程:CPU在執(zhí)行匯編程序的時候,實際上是運行的執(zhí)行函數(shù)。首先啟動一個新的線程mainthread,然后把源程序取出來逐行逐行地執(zhí)行,這個動作是由Qrun函數(shù)執(zhí)行的。Qrun函數(shù)從源程序的第一行開始執(zhí)行,把取得的這一行數(shù)據(jù)先進行預處理,去掉注釋(以“;”開始的說明)和標號(位于行首并以“;”開始的程序),然后再按照匯編語言的固定格式取得指令名稱和操作數(shù),每一個指令名稱都有一個與之相對應的執(zhí)行函數(shù),這些函數(shù)負責完成對應指令的功能,例如:MOV函數(shù)和MOV指令是對應的,此函數(shù)負責把第二個參數(shù)的值放到第一個參數(shù)里面。程序就像這樣一行一行執(zhí)行下去。值得我們注意的還有指針的實現(xiàn)以及中斷的實現(xiàn)問題。在虛擬的編譯系統(tǒng)中,指針和真實的指針不同。我們用行號代替了內(nèi)存地址。普通情況下,程序每執(zhí)行一行,指針就加一(不論單指令語句、雙指令語句還是多指令語句均同樣處理),跳到下一行繼續(xù)執(zhí)行。但若遇到跳轉指令或類跳轉指令的時候就不一樣了。首先要根據(jù)跳轉的目的標號到在編譯階段建立的數(shù)據(jù)庫中查找相應的行號,然后將獲得的行號賦值給指針I(yè)P,那么此時程序就跳到對應的行繼續(xù)執(zhí)行。對于中斷的處理,我們借助了虛擬的8259A。具體實現(xiàn)過程將在中斷實現(xiàn)模塊中詳細介紹。虛擬實驗操作臺虛擬實驗操作臺是硬件設備的一個縮影。它包含了8031的四個并行I/O端口即P0口、P1口、P2口、P3口;以及中斷控制器8259A的IR0~IR7八條中斷請求輸入線;還有8255的三個8位I/O數(shù)據(jù)口PA口、PB口、PC口;最后還有LED、顯示器、開關三種外部設備(示波器是以單獨的界面形式存在的,其設計方法將單獨介紹)。它可以劃分為三個部分:顯示部分、外設部分(LED、開關)、接線部分(一個接口實現(xiàn),用于將外設和實驗中用到的芯片連接起來即建立通信)。對于顯示部分,我們模擬了八段顯示器。并且在程序中我們給它分配了一個中斷號10H,功能號0(AH=0)表示對顯示屏的操作(例如,AL=1表示清屏)。功能號1(AH=1)表示將AL中的數(shù)據(jù)寫入顯示器。它的實現(xiàn)可以利用一個RichTextBox來模擬,給顯示部分劃分一個線程,讓該線程一直處于不停的檢測狀態(tài)isMonitorInterrupt,若為真表示顯示器有中斷,然后馬上去尋找功能號并實現(xiàn)相應的功能。在執(zhí)行函數(shù)INT中,有一個對應于顯示器的分支,當參數(shù)為10H(也就是內(nèi)中斷號為10H)時就將狀態(tài)isMonitorInterrupt置為真,從而,只要在程序中一有顯示器中斷則馬上就可以在模擬的顯示器中體現(xiàn)出來。對于外設部分,我們模擬了LED和開關。LED我們用Label來實現(xiàn),通過backcolor的變換來實現(xiàn)LED的亮與滅。開關我們用TrackBar來實現(xiàn),通過變形可以得到一個很形象的開關,將滑塊滑到最上面表示開,滑到最下面表示關。在LED相關的程序中,我們還定義了一個線程RunLED,該線程將一直處于運行狀態(tài),不停地將緩沖中的數(shù)據(jù)取出,并按位對LED進行操作。開關的程序實現(xiàn)更簡單,當我們改變開關的一個狀態(tài)之后,馬上將SwitchStatus傳遞給接線部分對應的程序模塊。實際上,開關只負責狀態(tài)的改變。對于接線部分,實際上是一個復雜的模塊。首先要解決表面上接線的問題。在虛擬實驗操作臺上,每一個需要接線的地方都設定了一個接線孔。實際上是用圖片模擬的,沒接線的時候是一種圖片,處于接線狀態(tài)的時候又是另一種圖片。同時引用了DrawLine函數(shù)來繪制導線。其次要考慮到它深層次上的意義。從另外一個角度來說,虛擬實驗操作臺起到了“橋”的作用。它負責接收外設(開關)送過來的數(shù)據(jù),并根據(jù)建立的“輸入橋”將數(shù)據(jù)傳遞給相應的芯片,還負責接收芯片傳過來的數(shù)據(jù)并根據(jù)建立的“輸出橋”將數(shù)據(jù)傳遞給外設(主要是LED)。而各種橋的建立也是不容忽視的。所有接線孔都對應一個序號,芯片對應接線孔的序號固定在一個范圍內(nèi),外設對應接線孔的序號對應在一個范圍內(nèi)(開關與LED也要區(qū)分開)。這樣做能夠很容易地通過序號獲得該接線孔的類型。當連續(xù)點擊兩個接線孔時,程序就會根據(jù)接線孔的序號得出接線孔的類型,若是輸入的接線孔和芯片孔,則加入輸入橋;若是輸出的接線孔和芯片孔,則加入輸出橋;若兩個都是芯片接線孔,則加入芯片橋。這樣就建立了橋。圖3虛擬實驗操作臺(正在運行中)中斷模塊(8259A)真正的8259A在編程的時候要將中斷服務子程序入口地址放入中斷向量表;在虛擬系統(tǒng)中,地址均由行號來代替,當用匯編指令獲得一個子程序的地址時,實際上是取得了它的行號。當中斷到來的時候實際上執(zhí)行的也正是該行號對應的程序,所以其功能與真實的是一樣的。為了能夠更真實地模擬硬件,我們定義了狀態(tài)機來負責管理8259A的工作。狀態(tài)機的功能是:識別寫入端口的是否是初始化數(shù)據(jù),并可以根據(jù)寫入的內(nèi)容來確定下一步應該寫入的內(nèi)容,即從一個狀態(tài)到另一個狀態(tài)的轉化;同時還記錄8259A的一些工作狀態(tài),比如:優(yōu)先級方式、中斷結束方式等等。對于中斷嵌套,我們使用堆棧進行處理。首先定義一個堆棧stack(實際上是由一個數(shù)組構成的存儲區(qū))負責在執(zhí)行中斷前將IP入棧,即行號入棧。每當程序執(zhí)行到RETI指令的時候就從stack中取出一個行號放入IP(可稱為出棧)。這樣就保證了中斷程序結束后順利回到斷點處繼續(xù)執(zhí)行,這時的斷點可以在主程序中,也可以在某個中斷程序中(即中斷嵌套)。

I/O模塊(8255)8255有三個I/O數(shù)據(jù)口,即PA口、PB口、PC口。在虛擬實驗操作臺上有相應的A口、B口、C口的接線孔,共24個。模擬的8255由相應的執(zhí)行函數(shù)和寄存器組成。由于各口工作方式的不同以及編程的方便問題,除了模擬控制寄存器外,還單獨模擬了A、B、C三口的輸入、輸出狀態(tài),以及A、B口的工作狀態(tài)。8255的執(zhí)行函數(shù)只有在OUT、IN兩種指令中執(zhí)行。當在執(zhí)行OUT指令或者IN指令時端口地址就屬于8255,就會去執(zhí)行8255模塊的執(zhí)行函數(shù)。8255的執(zhí)行函數(shù)只負責對其對應的寄存器進行操作,例如:當執(zhí)行OUT指令的時候模塊的執(zhí)行函數(shù)就法則把AL中的值放到相應的端口寄存器中,當執(zhí)行IN指令時執(zhí)行函數(shù)就負責把對應端口寄存器的值放到AL中。存儲器存儲器是用來存儲數(shù)據(jù)和程序代碼的,我們所創(chuàng)建的虛擬平臺同樣也需要存儲器來存儲一些數(shù)據(jù)和代碼。具體的實現(xiàn)方法是使用一個一維數(shù)組,模擬虛擬內(nèi)存。數(shù)組的下標則代表內(nèi)存地址,也就是說下標與地址一一對應。并且我們專門設計了一個窗口負責顯示和修改內(nèi)存。比如,在運行一個程序的時候可以根據(jù)需要通過此窗口將數(shù)據(jù)預先輸入內(nèi)存,或者運行程序的時候將結果放入某個內(nèi)存單元中,程序運行完畢后可以通過此窗口查看結果。示波器示波器是一種外部設備。任何數(shù)據(jù)在送入示波器之前都必須符合一個前提,就是要為模擬量。而在單片機實驗中我們處理的數(shù)據(jù)對象均為數(shù)字量,所以要將數(shù)據(jù)進行D/A轉換。所以我們在仿真系統(tǒng)內(nèi)部模擬了0832(數(shù)模轉換芯片)。而在具體的實現(xiàn)過程中,我們?yōu)槭静ㄆ鹘⒘艘粋€線程(thread)runshiboqi,用threadstatus值(True和Flase)控制線程的運行。=True時,線程運行,啟動draw函數(shù)繪制圖形;反之則不運行。而在執(zhí)行函數(shù)啟動線程之前,首先是要對D/A轉換器中的數(shù)據(jù)進行處理,因為在寫入?yún)R編程序之后,相應的數(shù)據(jù)會分別存入對應的寄存器中;所以D/A轉換器的數(shù)據(jù)處理在程序寫入時已經(jīng)完成了。D/A轉換器實際上所完成的功能是對各存儲器中數(shù)據(jù)的調(diào)用以及相關數(shù)學函數(shù)的引用。圖4示波器(正在運行中)

3構建仿真平臺使用的一些技術該仿真平臺是構建在工作平臺之上的。所以使用一些特殊技術能夠使得仿真平臺的運行結果與硬件實驗結果更為相似。

匯編程序的編譯對于匯編語言的執(zhí)行和接口芯片的工作,傳統(tǒng)的思想是借助于MASM之類的工具將匯編語言編譯成二進制代碼,這些二進制代碼在CPU的控制下去完成相應的功能。對于一個模擬硬件的軟件來說,做這樣的事情太過于復雜。因此我們用函數(shù)來模擬匯編指令,即每一個匯編指令對應一個函數(shù),我們叫它執(zhí)行函數(shù),如:MOV函數(shù)完成MOV指令的功能,實現(xiàn)PublicSubMOV(ByValREF1AsString,ByValREF2AsString)DimtempAsIntegertemp=ReadData(REF2)CallWriteData(REF1,temp)EndSubReadData函數(shù)為自定義的通用函數(shù),負責取出參數(shù)表示的值;WriteData函數(shù)也為通用函數(shù),負責將立即數(shù)temp寫入存儲區(qū)REF1。

DirectX技術DirectX是Microsoft公司提供的一個對硬件直接進行操作的接口,早期的Windows不提供對硬件直接操作的功能,開發(fā)了這個接口之后,可以對顯示器、鼠標、鍵盤、聲卡、顯卡等硬件設備直接進行操作。在仿真平臺啟動的時候可以利用DirectX改變顯示器的分辨率,使可視化操作界面(虛擬實驗操作臺)的布局具有一致性。其簡單實現(xiàn)PublicDirectXAsNewDirectX7PublicDDrawAsDirectDraw7DDraw=("")Call(800,600,32,0,CONST__DEFAULT)

通信橋通信橋包括輸入橋、輸出橋和芯片橋。通信橋決定了芯片和外設間的通信。輸入橋負責接收外設(主要是開關)送過來的數(shù)據(jù),并將數(shù)據(jù)傳遞給對應的芯片;輸出橋負責接收芯片送過來的數(shù)據(jù),并將數(shù)據(jù)傳遞給對應的外設(主要是LED);芯片橋負責在芯片間傳遞數(shù)據(jù)?,F(xiàn)給出通信橋的基本數(shù)據(jù)結構:PublicStructureBridgeDataPublicchipvalueAsInteger‘芯片接線孔的序號PublicdevicevalueAsInteger‘外設接線孔的序號PublicpchipAsInteger‘芯片接線孔的位置,便于連線PublicpdeviceAsInteger‘外設接線孔的位置當在接線板上接線的時候,點擊某個接線孔后,根據(jù)孔的編號確定它的類型(芯片、輸出外設、輸入外設),然后根據(jù)兩個接線孔的類型加入不同的通信橋。例如,若是芯片和輸入設備,則加入輸入橋。

多線程以及線程同步技術由于每一個芯片對應一個線程,就有可能出現(xiàn)多個線程同時對一個數(shù)據(jù)處理的情況,例如:通信橋模塊和8255模塊之間就有可能出現(xiàn)這樣的情況,8255模塊通過通信橋模塊提供的接口數(shù)據(jù)的同時,通信橋模塊把從外設接收到的數(shù)據(jù)寫入該接口??梢酝ㄟ^設置一個互斥變量來保證線程對臨界資源的互斥訪問,或者通過提供的SyncLock語句來實現(xiàn)同步鎖。

緩沖技術由于每個線程(同優(yōu)先級)運行的時間和次序具有不可預測性,所以在仿真時可能會出現(xiàn)這樣額問題:線程1傳送數(shù)據(jù)給線程2,線程1一共發(fā)出了3個數(shù)據(jù),而線程2只收到了1個??梢杂镁彌_的思想來解決這個問題。首先建立一個隊列,當線程1發(fā)送數(shù)據(jù)的時候不直接發(fā)給線程2,而是進隊列,線程2取數(shù)據(jù)的時候直接到隊列中去取。這樣就保證了數(shù)據(jù)的完整性,從而屏蔽了線程之間差異性。實現(xiàn)過程PublicClassCommClassPublicShareddata()As

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論