各位先進好
最近碰到一個問題,目前使用兩台USRP-2943當作Tx跟Rx,而Rx最近在接收資料的時候會有overflow的狀況出現,如圖。
想問的是LabVIEW是否有記憶體管理的工具或API可以使用?可以清理掉USRP裡面的buffer,讓資料可以按照順序抓進來讀取。試過(1) stop session 加上start session配合,但是資料順序會亂掉使得資料decode錯誤。(2)降低IQ Rate但是這樣會使資料抓的不完全導致不正確,且還是會overflow。如果各位先進有碰過這樣的問題還請幫忙分享自身解決這樣問題的經驗,小弟先謝謝各位了!
–Shung
不知道你的程式怎麼寫的,只能猜了。
你的流程是不是TX持續送,RX持續收,但是你每次只從RX buffer內讀一段處理一段,然後處理速度跟不上傳送/接收速度,buffer就爆了?
如果是上述這種情況,建議將RX部分分成兩個loop,一個loop單純收資料後直接丟到pc端的buffer,另一個loop再從pc端的buffer撈資料出來解,理論上這樣設備的buffer不會爆,而你的資料量應該也不會把pc buffer塞爆,永遠記得硬體收發訊號的速度非常快,而設備buffer設計只是預防來不及收,而不是預防來不及處理。
Hi, Dogthief
抱歉晚了回覆。首先先謝謝你的回覆,抱歉我沒有辦法貼上我的程式出來,但大致上就是像您說的那樣,Rx每秒抓取固定數量的sample做處理,抓取多少處理多少data;但您說的分成兩個loop,一個專門接收資料而另一個loop處理資料應該是沒有辦法這樣做,因為我研究到現在都沒有辦法看到USRP內部的buffer長怎麼樣,所以就沒有辦法拆開來作處理。
不過您提到了,我想到或許可以用array先接收收到的資料充當buffer,在承接該array來做處理,但是這樣感覺上還是會先放到記憶體當暫存而後再處理資料,記憶體的部分還是會不構,但我還是會試試看,謝謝您的建議。
另外您第二段的意思是,USRP或是設備的buffer是不會滿的,因為在要滿之前RX只會不接收而已,並不會超出自己的能力(buffer大小)而造成overflow,我可以這樣理解嗎?
如果我有錯還請糾正我,謝謝
–Shung
1.為什麼你需要知道USRP的buffer長怎樣?對你來說只是一堆IQ data,收進來對了,收得夠快就好了。而且如果你的流程是收一筆做一筆,那就是程式流程的問題導致buffer爆掉,我說的做法大概如下,收資料歸收資料,不做其他多餘的事,處理資料歸處理資料,這樣就不會卡接收,buffer隨便你要用Array/Queue/…,都一樣只是一堆記憶體空間。
2.如果你先放PC記憶體再處理還可以把PC記憶體搞爆掉,那程式真的問題很大…
3.這是我的原文,請不要斷章取義我說USRP或是設備的buffer是不會滿的
如果是上述這種情況,建議將RX部分分成兩個loop,一個loop單純收資料後直接丟到pc端的buffer,另一個loop再從pc端的buffer撈資料出來解,理論上這樣設備的buffer不會爆,而你的資料量應該也不會把pc buffer塞爆,永遠記得硬體收發訊號的速度非常快,而設備buffer設計只是預防來不及收,而不是預防來不及處理。
意思是如果你照我上面的說分兩個loop的話,這樣程式流程正確的前提下,設備的buffer應該不會爆。
4.千萬不要在不了解的的情況下,隨便下結論問題在哪裡或是沒辦法怎樣做,這可能會讓你一開始就往錯的方向走,除非你有根據。
2個讚
Hi, Dogthief
抱歉,這幾天在忙著請教別人以及改善程式效能,但是效果還是不彰。最後嘗試了您說的創建兩個while loop,一個是收集資料而另一個是分析資料的作用,也就是所謂的consumer及producer mode。承蒙您的模型,我也是這樣開始著手,只是搭配USRP一起進行,如附圖。但是最近遇到問題是上面while loop做的工作就是收下USRP所接收的IQ data,而下面的大while loop做的工作就是準備dequeue上面while loop接收的資料並開始做處理。現在碰到一個問題就是要從下面的大while loop dequeue data出來的時候queue裡面的data出不來,上面while loop接收data的USRP裡面確定有資料在跑,但是下面要dequeue出來時候卻沒有辦法把資料弄出來。好消息是您建議的把資料放進queue的是有幫助的,因為我的資料在接收至少三十秒都不會爆掉,比之前的大概3秒就會內部記憶體爆掉的情況要好很多。我想這應該是正確的路
還有另外一點是您說的pc端buffer是queue在一開始就預設放置的位置嗎?還是要再另外設置呢?
忘了說明錯誤代碼,在這邊補充一下
在執行之後,對接收資料的while loop(上面的while loop)按下停止動作後就會有附圖中的錯誤出現。
我想這可能是對於下面的while loop來說根本沒有接收到資料所以造成的錯誤。
以你的程式截圖來看,上面迴圈結束之前,下面迴圈都不會開始動作,而上面迴圈結束之後,Queue也馬上會被 release,所以下面開始dequeue當然會報錯。
您好
那我想請教一下,如果用queue來做consumer/producer mode的話不是就是要用兩個while loop來實現嗎?如果只有上面那個迴圈可以跑,跑完之後下面迴圈才接著跑的話那不就沒有意義了嗎?
但是如果要配合USRP接收資料的話又必須要有接線
所以我嘗試了把USRP接線接到上面的while loop,而下面的while loop只單純拿資料來處理如圖一
但是現在又遇到問題是類似下面while loop有開始動但是沒有接收到資料如圖二
這是我第一次用queue來寫,還請告訴我錯誤的地方,謝謝
Dogthief, 您好
我在下面的while loop疏忽掉接線給後面的程式處理資料才會發現這項錯誤代碼。
我附圖的那樣是可以運作的(把斷掉的線給接起來就好)!
只是現在又遇到更多問題了…
- 可能是上下while loop不同速度的關係,效能比以前abort後重新initial的效能比起來更差,可能是放進queue後的data順序是有誤的
- 這個問題比較嚴重,程式在跑了大概一分鐘之後memory就快用完了,最後導致電腦當機,這邊用到的memory應該就是您說的PC端memory而不是設備的buffer,不然也不會導致電腦最後動不了。但是正常來說queue在放進資料之後如果再取出資料的話是不會把memory搞到爆掉才對,這樣是不是就是因為接收資料的速度跟取資料做處理的速度(上面的while loop跟下面的while loop)相差太多導致。
補充一點: 上面的留言串我有講錯,資料並不是收一筆處理一筆,而是取決於有什麼資料就處理什麼資料,如果是收一筆處理一筆的話就可能會有data dependence 的問題,但這邊是沒有的。
1.養成好習慣,程式要能正常結束,除非發生不可預期的錯誤,不然一個正常的程式不應該需要按abort才能結束,所有的resource結束要正常close或release,不然只是留一堆垃圾在記憶體,你圖中的queue結束沒有release,加上你說跑一分鐘就爆了,那塞爆queue的東西就一直在記憶體內,除非你把labview整個關掉重開,不然永遠清不掉。
2.上下迴圈執行的時間可以自己拉時間的vi來看,當前queue裡面的數量也有vi可以看,不需要猜是不是處理速度跟不上接收速度,如果一直消耗不了queue裡面的東西,又有無限的資料進來,那爆掉只是早晚的問題而已。
好的,我懂您的意思了。Queue的release已經加上去了。最後還有個問題想請教一下,就是Queue裡面的值如果取出之後還會繼續占用記憶體的值嗎?還是說取出之後要做flush Queue的動作才能清除掉已經取出值的記憶體空間呢?
Dequeue拿出的資料就永遠從queue裡面消失,這一樣可以拉Get queue status出來看,我覺得你還是不了解queue的機制,建議你google一下,另外你若enqueue 100次,你就要dequeue 100次,dequeue絕對不會一次幫你全部拿出來。
好的,我了解了! 有上網爬過文看過 LabVIEW Queue 的用法,但上面提到的都是架構以及大略用法,沒有深入到記憶體的空間運作。經過您的解答有比較清楚了。 謝謝您不吝及耐心回答我的問題!
您好
現在又有遇到一個Queue的問題
在Enqueue跟Dequeue上速度差異太大或是有差異,在長時間執行下導致電腦內部記憶體會慢慢的增加。
可是Producer跟Consumer的設計及使用時機不就是用在兩邊迴圈的速度差異大(或是有差異)的時候嗎?還是說是在兩邊速度差異大的時候不能執行程式的時間不能太久,否則會發生記憶體不堪負荷的情況呢?
我有做一個簡單的測試系統
發現即使Consumer loop不做任何的工作,單純Dequeue data出來,因為queue裡面的data會越來越多這樣的程式在長時間執行下來memory是沒有辦法負荷的。
因為我的程式是需要連續接收IQ Data的,所以長時間的執行接收Data是需要的;不知道大家在使用這個架構的時候會不會有這樣的問題?Producer_Consumer_Prototype.vi (17.4 KB)