簡體   English   中英

使用內存映射I / O的memcpy和朋友

[英]Using memcpy and friends with memory-mapped I/O

我正在研究一個涉及內存映射FPGA寄存器的I / O的嵌入式項目。 這些存儲區域的指針需要標記為volatile因此編譯器不會通過緩存CPU寄存器中的值來“優化”對FPGA的讀寫操作。

在少數情況下,我們希望將一系列FPGA寄存器復制到緩沖區中以供進一步使用。 由於寄存器映射到連續的地址, memcpy似乎是合適的,但是傳遞我們的volatile指針作為source參數會發出關於丟棄volatile限定符的警告。

是否安全(並且理智)拋棄指針的volatile以抑制此警告? 除非編譯器做了一些神奇的事情,否則我無法想象調用memcpy會無法執行實際復制的情況。 另一種方法是只使用for循環並逐字節復制,但memcpy實現可以(並且確實)根據副本的大小,對齊等來優化副本。

作為FPGA和嵌入式軟件的開發人員,只有一個明確的答案: 不要使用memcpy等。 為了這

一些原因:

  • 無法保證memcpy可以按任何特定順序運行。
  • 編譯器可能會使用內聯代碼替換調用。
  • 這種接受通常需要一定的字大小。 memcpy不保證。
  • 寄存器映射中的間隙可能導致未定義的行為。

但是,您可以使用簡單的for循環並自行復制。 如果寄存器是volatile ,這是安全的( 見下文 )。

根據您的平台,單獨使用volatile可能還不夠。 內存區域也必須是不可 緩存嚴格排序的 (並且可能是非共享的)。 否則,系統總線可能(並且將針對某些平台)重新排序訪問。

此外,您可能需要CPU的障礙/圍欄不要重新排序訪問。 請仔細閱讀您的硬件規格。

如果您需要更頻繁地傳輸更大的塊,請考慮使用DMA。 如果FPGA使用PCI(e),你可以使用帶有分散/聚集的busmaster DMA(但是,這不容易實現;自己這樣做,但可能值得付出努力)。

最好的(也是最理智的)方法實際上取決於多種因素,例如平台,要求的速度等。在所有可能的方法中,我認為使用mempcy()一個(1)(1):不確定如果這是正確的語法,但我希望你得到我的觀點)。

絕對不安全。 無法保證memcpy將復制數據的順序,以及一次復制多少字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM