ZYNQ AXI DMA除錯細節 二

2021-09-24 14:27:27 字數 1230 閱讀 7738

這是之前那篇部落格的實驗篇。

驗證結果出了之前壓根都沒想到的現象,特此記錄。

實驗前:之前看ip核的介紹,axidma開始出現第乙個有效的資料,是在配置好了長度暫存器,開始傳輸的時候。

實驗後:根據sdk除錯,發現在axidma復位後會出現4個有效訊號,真正配置長度暫存器以後,傳的是第5個資料了。另外一種情況,axidma把資料發給ps的時候,如果,輸入給axidma的資料中(我的實驗是ad給的資料),出現last訊號,axidma收到last訊號後,同樣會出現4個有效訊號。

注:實驗中每個有效訊號的資料是32位。

二:axidma接收時,具體的接收長度怎麼規定

實驗前:看寫入長度暫存器的值。寫1000就收1000,寫500就收500

實驗後:和寫入長度暫存器無直接關係。感覺設定值的作用就是判斷接收有沒有出錯。實驗工程的不同,有兩種情況

情況一:

axidma的接收通ad資料的訊號線上last訊號,寫1000可能收了1064,反正大於1000就對了,這個多的量具體不好說。axidma應該自己有記數功能,當它判斷出實際接收的資料大於長度暫存器的設定值的時候,axidma會報錯(0x34資料0x5011或經過處理為0x11),報錯後,就不再繼續收資料了。在報錯前,到底能多傳多少數,不好說。

結果:根據錯誤原因分析,雖然這種會出錯,但是,確實能收到想要個數的資料,配合復位,也能「正常」連續接收資料。對於ad端來說,axidma丟了給它的一些資料。

改進:那麼如何避免多傳報錯呢,可以在ad送資料給axidma的訊號線上,加入last訊號。但是有個問題,這個last資料一旦出現,axidma立刻停止了接收資料。此時實際接收的資料也可能和寫入長度暫存器的值不一樣。這種情況時,長度暫存器這時候會重新整理,由「設定的長度值」重新整理為「真正傳輸的長度值」。

舉個例子,比如在接收通道設定長度為1000位元組,實際工程中發512個位元組就出last訊號,那麼

第一次接收:

實際就是收了512個資料,而且last之後還出現4個有效訊號(這4個資料看波形是有效的傳輸,但是並沒有送進來),影響第二次接收。

第二次接收:

(2)復位,配置長度暫存器前,已經傳了8個有效訊號了(上一次傳輸出的last訊號後的4個有效訊號,進行復位會再有4個有效訊號),這8個有效訊號對應的資料,會不會出現在接收記憶體中。

第n次接收:

參考第二次。

三:既然接收的資料由last決定,但是實際工程這個長度會變,這次100下次200,怎麼不出錯,靈活配置呢

實驗前:這個問題好難,超出了我的知識範疇

注意細節和習慣(二)除錯

1.按照乙份比較好的編碼規範書寫 這個樣做不僅僅是為了增強可讀性,更重要的是可以幫你減少除錯的時間,無形之間賦予你更多的生命 2.使用良好的注釋風格,為了別人,更為了自己。3.使用版本管理器吧,在瘋狂的修改之後,你可能會陷入僵局,這個時候,重新開始是個不錯的選擇。4.增加足夠的引數檢查。千萬不要以為...

PHP小細節(tp5除錯)

php eol 換行 事務 db starttrans try 提交事務 db commit dump code 200,msg 操作成功 catch exception e array multisort 關聯排序 平時遇到 a b 相關聯的陣列,當對 a 排序後希望 b也相對應排列可以試試arr...

Python程式設計細節(二)

1.使用正則來拆分分隔符不一致的字串 import re re.split r s str 2.在篩選檔案拓展名 url協議的時候,使用str.startswith 或者str.endswith 來檢查字串的開頭或者結尾 any name.endswith py for name in filesn...