您現(xiàn)在的位置:
中國傳動網(wǎng)
>
技術(shù)頻道
>
應(yīng)用方案
>
面向過程的編譯和解釋環(huán)境在工控組態(tài)軟件系統(tǒng)中的應(yīng)用
時(shí)間:2008-08-06 13:44:00來源:ronggang
圖3 存儲空間關(guān)系圖(a)和運(yùn)行時(shí)存儲空間示意圖(b)[/align]
3.4 中間代碼操作數(shù)的定義
Child-C程序被編譯成中間代碼指令被解釋器執(zhí)行,如以下的Child-C語句執(zhí)行相加操作:
int a,b,c; a=b+c;
它被編譯為如下幾條中間代碼指令:
LOD R0 Ox00000010 4; ①—— 加載變量a到寄存器R0,Ox00000010是變量a在運(yùn)行時(shí)堆存儲區(qū)內(nèi)的偏移地址,4表示加載的數(shù)據(jù)為4個(gè)字節(jié)
LOD R1 Ox00000014 4; ②—— 加載變量b到寄存器R1
ADD ③—— R1+R0->R2,三個(gè)寄存器的意義是固定的
STR R2 Ox00000018 ④— 將寄存器R2的值保存到變量c中
其中指令③的ADD指令是二元操作數(shù)指令,但是它的操作數(shù)固定為R0和R1寄存器,計(jì)算結(jié)果也固定放到R3中。
3.5 字符串的兼容和特殊處理
C語言中的字符串是通過字符數(shù)組進(jìn)行處理的,Child-C繼承了這種字符串處理方法。字符數(shù)組是長度固定的字符串,而在使用Child-C與COM組件交互時(shí)經(jīng)常要處理COM標(biāo)準(zhǔn)的BSTR類型變長字符串,為了兼容該數(shù)據(jù)類型,在Child-C中增加了bstr類型的變長字符串?dāng)?shù)據(jù)類型。bstr由頭尾兩部分組成:頭部信息由head和len兩個(gè)32位無符號整形組成,頭部信息代表了字符串實(shí)體,它可以作為局部和全局變量存儲,head是一個(gè)指針,它指向字符數(shù)據(jù)在全局堆中的首地址,len記錄了字符串的長度。尾部信息保存在全局堆存儲區(qū)中,字符信息在該區(qū)中并不是連續(xù)的,這也適應(yīng)了字符串長度變化的需要。bstr可以直接代替BSTR類型,中間代碼指令集中有專門的轉(zhuǎn)換指令COMTOC和CTOCOM進(jìn)行數(shù)據(jù)轉(zhuǎn)換。當(dāng)需要將bstr轉(zhuǎn)換成BSTR時(shí),編譯器自動添加COMTOC指令,該指令根據(jù)bstr的頭信息讀取字符數(shù)據(jù)組裝成BSTR數(shù)據(jù)提交給COM組件,而CTOCOM是一個(gè)逆過程。這兩條指令使用特設(shè)的第二組虛擬寄存器進(jìn)行轉(zhuǎn)換操作。
3.6 COM組件的訪問
COM對象的訪問需要進(jìn)行特殊處理,它是在解析運(yùn)行環(huán)境建立之前就已經(jīng)存在的。如圖3a所示,它存儲在組態(tài)軟件系統(tǒng)的存儲空間中,它不會隨著解釋運(yùn)行環(huán)境的消亡而消亡。而除此之外的數(shù)據(jù)都存儲在解釋器的存儲空間中,它們會隨著解釋運(yùn)行環(huán)境的消亡而消亡。為了便于編譯器和解釋器統(tǒng)一存儲空間的處理,需要將COM組件映像到解釋器存儲空間中,圖3b中的COM組件地址映射區(qū)就用來保存COM組件地址的映像。在編譯器和解釋器的運(yùn)行過程中,所有對COM組件的訪問都被映射到該區(qū)域,從而避免了存儲空間的交叉訪問。
3.7 解釋器環(huán)境中對COM組件方法的調(diào)用
COM組件的各種函數(shù)已經(jīng)被編譯成可被計(jì)算機(jī)直接執(zhí)行的機(jī)器代碼,自動化COM對象允許使用IDispatch接口的統(tǒng)一調(diào)度函數(shù)Invoke()調(diào)用組件的函數(shù),被執(zhí)行的函數(shù)可以當(dāng)作一個(gè)字符串參數(shù)被傳送。因此在構(gòu)造的中間代碼指令集中有一條INVOKE指令,該指令格式為:INVOKE ComOffset FuncOffset ParaOffset;該指令有三個(gè)操作數(shù):ComOffset為要訪問的COM組件在COM組件地址映射區(qū)的偏移,F(xiàn)uncOffset為被調(diào)用函數(shù)的名稱bstr變量地址,ParaOffset是該函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)的存儲單元地址,該存儲區(qū)之后是一個(gè)4字節(jié)的單元,它用來保存Invoke()函數(shù)執(zhí)行的返回值。就是說,對COM組件的所有操作,解釋器只需通過執(zhí)行Invoke()函數(shù)就能完成。
4 事件體系的構(gòu)造
Child-C函數(shù)是通過事件觸發(fā)而被調(diào)用的。事件包含兩種類型,一種是組件運(yùn)行系統(tǒng)定義的事件,該類型事件屬于整個(gè)系統(tǒng),它與具體組件無關(guān),但可以被COM組件和系統(tǒng)觸發(fā)。另一種是COM組件自定義的事件,該類型事件屬于COM組件,它只能被組件自身觸發(fā)。事件發(fā)生時(shí)觸發(fā)解釋器解釋運(yùn)行事件的相應(yīng)函數(shù)。事件的處理工作全部交給事件槽來處理,事件槽實(shí)際上是一個(gè)可鏈接對象接收器[5],它可以接受系統(tǒng)和COM組件觸發(fā)的事件,同時(shí)它還維護(hù)了一張事件映射表,該表記錄了所有添加了響應(yīng)函數(shù)的事件和該事件響應(yīng)函數(shù)的入口地址以及有關(guān)參數(shù)信息。當(dāng)有事件到達(dá)時(shí),首先檢查事件映射表該事件是否有被注冊,如果有則根據(jù)響應(yīng)函數(shù)的參數(shù)信息分配存儲空間并調(diào)用響應(yīng)函數(shù)。
5 結(jié)束語
在實(shí)際的生產(chǎn)應(yīng)用中可以證明,Child-C完全可以勝任絕大部分流程控制的需要,提高了工控組態(tài)軟件的靈活性。解釋器環(huán)境開發(fā)難度小但是程序執(zhí)行效率低,自動化COM組件的函數(shù)調(diào)度機(jī)制可以很好的解決這種矛盾,該機(jī)制還可以廣泛地應(yīng)用于其它領(lǐng)域。
參考文獻(xiàn):
[1] 李志剛.工控組態(tài)軟件及其在工業(yè)控制中的應(yīng)用[J].微機(jī)算計(jì)信息,1998;14(3)
[2] 夏坤,張建國,蔣洪. COM+及其在組態(tài)軟件中的應(yīng)用研究[J].計(jì)算機(jī)工程與應(yīng)用,2002,20.117-119
[3] 王培進(jìn).面向?qū)ο蟮娜嵝栽O(shè)計(jì)與控制理論(I)[J].計(jì)算機(jī)工程與應(yīng)用,2001;36(16):17-19
[4] 潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.12
[5] KennethCLouden.編譯原理與實(shí)踐[M].北京:機(jī)械工業(yè)出版社,1998.
[6] 熊清平,張正勇,李作清.CNC系統(tǒng)巨量NC程序解釋實(shí)現(xiàn)的方法[J].中國機(jī)械工程,1999,10(6):673-675.
標(biāo)簽:
傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為傳動網(wǎng)(connectcrack.com)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>2025-09-23
2025-09-23
「頻」實(shí)力,新上市——富士電機(jī) FRENIC...
2025-09-08
華為昇騰Atlas800iA2 910B服務(wù)器Deepsee...
2025-09-04
TaiShan(泰山)200 2280系列服務(wù)器 鯤...
2025-09-03
2025-08-06