構(gòu)建單片機虛擬實驗仿真平臺
(作者未知) 2009/4/22
(接上頁)統(tǒng)內(nèi)部模擬了0832(數(shù)模轉(zhuǎn)換芯片)。而在具體的實現(xiàn)過程中,我們?yōu)槭静ㄆ鹘⒘艘粋線程(thread)runshiboqi,用threadstatus 值(True和Flase)控制線程的運行。shiboqiClass.status=True時,線程運行,啟動draw函數(shù)繪制圖形;反之則不運行。而在執(zhí)行函數(shù)啟動線程之前,首先是要對D/A轉(zhuǎn)換器中的數(shù)據(jù)進行處理,因為在寫入?yún)R編程序之后,相應(yīng)的數(shù)據(jù)會分別存入對應(yīng)的寄存器中;所以D/A轉(zhuǎn)換器的數(shù)據(jù)處理在程序?qū)懭霑r已經(jīng)完成了。D/A轉(zhuǎn)換器實際上所完成的功能是對各存儲器中數(shù)據(jù)的調(diào)用以及相關(guān)數(shù)學函數(shù)的引用。 圖4 示波器(正在運行中) 3 構(gòu)建仿真平臺使用的一些技術(shù) 該仿真平臺是構(gòu)建在VB.NET工作平臺之上的。所以使用一些特殊技術(shù)能夠使得仿真平臺的運行結(jié)果與硬件實驗結(jié)果更為相似。
3.1 匯編程序的編譯
對于匯編語言的執(zhí)行和接口芯片的工作,傳統(tǒng)的思想是借助于MASM之類的工具將匯編語言編譯成二進制代碼,這些二進制代碼在CPU的控制下去完成相應(yīng)的功能。對于一個模擬硬件的軟件來說,做這樣的事情太過于復(fù)雜。因此我們用函數(shù)來模擬匯編指令,即每一個匯編指令對應(yīng)一個函數(shù),我們叫它執(zhí)行函數(shù),如:MOV函數(shù)完成MOV指令的功能,實現(xiàn)如下: Public Sub MOV(ByVal REF1 As String,ByVal REF2 As String) Dim temp As Integer temp=ReadData(REF2) Call WriteData(REF1,temp) End Sub ReadData函數(shù)為自定義的通用函數(shù),負責取出參數(shù)表示的值;WriteData函數(shù)也為通用函數(shù),負責將立即數(shù)temp寫入存儲區(qū)REF1。
3.2 DirectX技術(shù)
DirectX是Microsoft公司提供的一個對硬件直接進行操作的接口,早期的Windows不提供對硬件直接操作的功能,開發(fā)了這個接口之后,可以對顯示器、鼠標、鍵盤、聲卡、顯卡等硬件設(shè)備直接進行操作。在仿真平臺啟動的時候可以利用DirectX改變顯示器的分辨率,使可視化操作界面(虛擬實驗操作臺)的布局具有一致性。其簡單實現(xiàn)如下: Public DirectX As New DirectX7 Public DDraw As DirectDraw7 DDraw=DirectX.DirectDataCreate("") Call DDraw.SetDisplayMode (800,600,32,0,CONST_DDSDMFLAGS.DDSDM_DEFAULT)
3.3 通信橋
通信橋包括輸入橋、輸出橋和芯片橋。通信橋決定了芯片和外設(shè)間的通信。輸入橋負責接收外設(shè)(主要是開關(guān))送過來的數(shù)據(jù),并將數(shù)據(jù)傳遞給對應(yīng)的芯片;輸出橋負責接收芯片送過來的數(shù)據(jù),并將數(shù)據(jù)傳遞給對應(yīng)的外設(shè)(主要是LED);芯片橋負責在芯片間傳遞數(shù)據(jù),F(xiàn)給出通信橋的基本數(shù)據(jù)結(jié)構(gòu): Public Structure BridgeData Public chipvalue As Integer ’芯片接線孔的序號 Public devicevalue As Integer ’外設(shè)接線孔的序號 Public pchip As Integer ’芯片接線孔的位置,便于連線 Public pdevice As Integer ’外設(shè)接線孔的位置 當在接線板上接線的時候,點擊某個接線孔后,根據(jù)孔的編號確定它的類型(芯片、輸出外設(shè)、輸入外設(shè)),然后根據(jù)兩個接線孔的類型加入不同的通信橋。例如,若是芯片和輸入設(shè)備,則加入輸入橋。
3.4 多線程以及線程同步技術(shù)
由于每一個芯片對應(yīng)一個線程,就有可能出現(xiàn)多個線程同時對一個數(shù)據(jù)處理的情況,例如:通信橋模塊和8255模塊之間就有可能出現(xiàn)這樣的情況,8255模塊通過通信橋模塊提供的接口數(shù)據(jù)的同時,通信橋模塊把從外設(shè)接收到的數(shù)據(jù)寫入該接口?梢酝ㄟ^設(shè)置一個互斥變量來保證線程對臨界資源的互斥訪問,或者通過VB.NET提供的SyncLock語句來實現(xiàn)同步鎖。
3.5 緩沖技術(shù)
由于每個線程(同優(yōu)先級)運行的時間和次序具有不可預(yù)測性,所以在仿真時可能會出現(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)過程如下: Public Class CommClass Public Shared (未完,下一頁)
|
|
相關(guān)專業(yè)論文
|
|
推薦專業(yè)論文
|
|
|
|