新聞中心

        EEPW首頁 > 測試測量 > 設(shè)計應用 > labview教程之如何實現(xiàn)內(nèi)存空間共享

        labview教程之如何實現(xiàn)內(nèi)存空間共享

        作者: 時間:2017-02-27 來源:網(wǎng)絡(luò) 收藏

          在C語言中,可以采用文件映射的方法,開辟一段內(nèi)存空間,各個進程和線程可以利用這段共享內(nèi)存空間進行數(shù)據(jù)交換,也就是寫讀操作,這里涉及到一個控制權(quán)限的問題,任何時刻,只能允許一個線程或者進程對內(nèi)存空間進行操作,看一段代碼,是通過API實現(xiàn)的內(nèi)存空間共享.

          #defineFILE_SIZE1024

          staticHANDLEhMapFile;

          staticLPVOIDlpMapAddress;

          staticLPCTSTRg_szEventName="EventName";

          voidWrite(char*data){

          if(lpMapAddress!=NULL){

          MEMSet(lpMapAddress,0,FILE_SIZE);

          sprintf((char*)lpMapAddress,"%s",data);

          }

          }

          voidRead(){

          if(lpMapAddress!=NULL){

          printf("%sn",lpMapAddress);

          }

          }

          voidProcess1(){//寫數(shù)據(jù)

          hMapFile=CreateFileMapping(

          INVALID_HANDLE_VALUE,//Currentfilehandle.

          NULL,//Defaultsecurity.

          PAGE_READWRITE,//Read/writepermission.

          0,//Max.objectsize.

          FILE_SIZE,//SizeofhFile.

          "MyFileMappingObject");//Nameofmappingobject.

          if(hMapFile==NULL)

          {

          printf("Couldnotcreatefile-mappingobject.");

          return;

          }

          //

          lpMapAddress=MapViewOfFile(hMapFile,//Handletomappingobject.

          FILE_MAP_ALL_ACCESS,//Read/writepermission

          0,//Max.objectsize.

          0,//SizeofhFile.

          FILE_SIZE);//Mapentirefile.

          if(lpMapAddress==NULL)

          {

          printf("Couldnotmapviewoffile.");

          return;

          }

          ::Sleep(10000);

          //Writedata

          ANDLEhEvent=::OpenEvent(

          EVENT_MODIFY_STATE,

          FALSE,

          g_szEventName);

          while(hEvent!=NULL){

          scanf("%s",lpMapAddress);

          ::SetEvent(hEvent);

          }

          ::CloseHandle(hEvent);

          hEvent=INVALID_HANDLE_VALUE;

          }

          在Labview如果想動態(tài)申請內(nèi)存只能通過DLL或者CIN來實現(xiàn),LABVIEW本身又不支持指針操作,實現(xiàn)非常困難,不過我們可以通過數(shù)組來實現(xiàn)內(nèi)存的分配.

          共享內(nèi)存同全局變量一樣,同樣存在數(shù)據(jù)競爭的問題,我們可以把共享內(nèi)存看成是內(nèi)存數(shù)據(jù)塊全局變量.

          LABVIEW中防止數(shù)據(jù)競爭的最好辦法是把讀寫操作在一個VI里,LABVIEW本身就會保證任意時刻只能有一個讀寫操作.

          對于全局可讀寫變量,LABVIEW可以用內(nèi)置全局變量也可以用FUNCTIONGLOBAL(我前面的文章中專門談到了FUNCTIONGLOBAL和AE的概念,可以參照一下)

          在自動化控制領(lǐng)域,內(nèi)存共享應用非常廣泛,對CAN總線控制卡,有雙口RAM的概念,對PLC有輸入輸出映射區(qū),實際上指的都是固定的RAM空間,相對于計算機來說,就是一段內(nèi)存空間.

          熟悉PLC的朋友都非常清楚,PLC是采用循環(huán)掃描的方式來運行程序的,掃描開始前,一次性地讀入外部開關(guān)的狀態(tài),存入輸入映射區(qū)中,在一次掃描程序運行期間,它的狀態(tài)是不變的.

          我們在LABVIEW設(shè)計控制程序時,也完全可以借用這個方法,實際上很多DSC和外部設(shè)備通過OPC通訊都是采用固定間隔更新的方法.


        上一頁 1 2 下一頁

        關(guān)鍵詞: labview內(nèi)存空間共

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 汉沽区| 沧源| 张掖市| 当阳市| 宜昌市| 桦南县| 共和县| 东台市| 瑞丽市| 杭锦旗| 汉沽区| 蒙阴县| 双桥区| 甘孜县| 南丹县| 桑植县| 改则县| 社会| 高台县| 全州县| 秭归县| 金华市| 姜堰市| 江西省| 翼城县| 和政县| 巨野县| 印江| 西华县| 塘沽区| 博兴县| 长汀县| 白朗县| 调兵山市| 侯马市| 莱州市| 淮阳县| 普宁市| 邛崃市| 二手房| 霍州市|