LabVIEWCompactRIO 開發(fā)指南9 保持連續(xù)內(nèi)存健康
LabVIEWCompactRIO?開發(fā)指南9
保持連續(xù)內(nèi)存健康
連續(xù)內(nèi)存是一種連續(xù)的、不分段的內(nèi)存塊。當程序包含各種動態(tài)分配時,內(nèi)存可能會變得碎片化,從而使查找大塊連續(xù)內(nèi)存變得更加困難。在圖3.26的例子中,即使RTOS有足夠的內(nèi)存來存儲40字節(jié)的請求分配,程序還是會失敗并崩潰,因為RTOS沒有足夠大的連續(xù)段。

圖3.26?RTOS上的內(nèi)存會變得碎片化,令內(nèi)存管理器很難定位大塊的連續(xù)內(nèi)存
可以通過最小化動態(tài)內(nèi)存分配和為等于最大預(yù)期數(shù)組大小的數(shù)組預(yù)分配空間來保持連續(xù)內(nèi)存的健康狀態(tài)。圖3.27展示了如何使用Initialize?array和Replace?array函數(shù)為數(shù)組預(yù)分配內(nèi)存。數(shù)組只創(chuàng)建一次,并且Replace?array可以將輸入緩沖區(qū)重用為輸出緩沖區(qū)。如果可以確定數(shù)組的大小上限,則應(yīng)該預(yù)先分配數(shù)組。

圖3.27?在可能的情況下為數(shù)組預(yù)先分配內(nèi)存
監(jiān)控系統(tǒng)內(nèi)存
在設(shè)計系統(tǒng)時,考慮包含內(nèi)存監(jiān)視代碼,以便在內(nèi)存不足時安全地重新啟動目標。當以實時目標為目標時,可以使用RT?Get?memory?Usage?VI以編程方式訪問系統(tǒng)的內(nèi)存狀態(tài)。

圖3.28?通過NI系統(tǒng)配置API以編程方式監(jiān)控內(nèi)存
還應(yīng)該包括一個執(zhí)行以下功能的安全關(guān)閉例程:
■關(guān)閉文件以防止損壞
■終止通信以避免沖突
■將硬件輸出設(shè)置為安全狀態(tài)
有關(guān)此主題的更多信息,請參閱NI?Developer?Zone文檔Fail-Safe?Control?Reference?Design。還可以在工具菜單下的LabVIEW中使用NI分布式系統(tǒng)管理器監(jiān)視內(nèi)存使用情況。

圖3.29?使用NI分布式系統(tǒng)管理器監(jiān)控CompactRIO內(nèi)存使用情況
使用有限的CPU資源
在設(shè)計實時目標應(yīng)用程序時,應(yīng)該將CPU使用率控制在70%以下。可以使用NI分布式系統(tǒng)管理器或以編程方式使用RT獲取CPU負載VI來監(jiān)控CPU使用情況。在嘗試減少應(yīng)用程序的CPU使用情況時,請考慮以下幾點。

圖3.30?使用RT獲取CPU負載VI監(jiān)控CPU使用情況
在使用定時結(jié)構(gòu)時要小心
如果應(yīng)用程序不包含任何需要確定性行為的任務(wù),請使用帶有定時函數(shù)的While循環(huán)而不是Timed循環(huán)。定時循環(huán)提供了許多有用的內(nèi)置功能,但也比While循環(huán)有更多的開銷。此外,如果定時循環(huán)沒有得到正確的執(zhí)行,它們可能會導(dǎo)致系統(tǒng)變得無響應(yīng)。因此,應(yīng)該只在絕對必要的時候使用定時循環(huán)。
只在必要時快速運行循環(huán)
盡管可能希望盡可能快地運行應(yīng)用程序中的每個循環(huán),但這種做法可能會導(dǎo)致不希望的計時行為,包括增加抖動甚至系統(tǒng)死鎖。例如,運行用戶界面數(shù)據(jù)發(fā)布循環(huán)的速度比人類操作員處理和響應(yīng)數(shù)據(jù)的速度要快,這對實時目標的CPU造成了不必要的負擔。在大多數(shù)情況下,對于通過網(wǎng)絡(luò)發(fā)布用戶界面數(shù)據(jù)的環(huán)路,2Hz到15Hz的速率就足夠了。
避免使用太多網(wǎng)絡(luò)發(fā)布的共享變量
當托管在CompactRIO控制器上時,網(wǎng)絡(luò)發(fā)布的共享變量會導(dǎo)致顯著的CPU和內(nèi)存開銷。如果應(yīng)用程序使用大量網(wǎng)絡(luò)發(fā)布的共享變量(超過幾十個),那么盡可能將這些共享變量托管在Windows主機PC上。請注意,在主機PC上托管共享變量時,不能啟用RT?FIFO,以便在時間關(guān)鍵循環(huán)之間進行確定性數(shù)據(jù)傳輸。
在可能的情況下卸載任務(wù)
為了最大限度地減少實時目標上的CPU使用,請考慮將某些任務(wù)卸載到桌面PC或FPGA目標(如果可用)。
?
需要說明的是,上述的例程和文檔,都是可以下載的,雙擊即可打開,其中壓縮文件是可以采用粘貼復(fù)制的方式,拷貝到硬盤上。這不是圖片,各位小伙伴看到后嘗試一下,這個問題就不用加微信咨詢了。有關(guān)LabVIEW編程、LabVIEW開發(fā)等相關(guān)項目,可聯(lián)系們。附件中的資料這里無法上傳,可去公司網(wǎng)站搜索下載。