2017-01-10 67 views
0

我正在使用zynq設備,嘗試通過一段獨立程序(無OS)將數據從DRAM傳輸到ARM外設。在示例代碼中,我發現此代碼聲明事務的源地址和目標地址。如何從嵌入式ARM處理器的某個物理內存中分配一塊內存?

volatile static u8 SrcBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 
volatile static u8 DestBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 

由於沒有操作系統,地址的價值是什麼?我該如何改變它?

+2

如果你想要一個特定的內存區域用於特殊的東西,我建議你設置鏈接描述文件來保留該地區,所以它不用於其他任何東西。然後只需使用指向內存開始的指針即可。 –

+0

也許這個例子使用DMA? – Lundin

+0

是的,它使用DMA。 srcBuffer和DestBuffer用於DMA交易 –

回答

3

您需要在連接文件來定義部分中的,然後使用(海合會)將數據放置在它:

__attribute__ ((section ("your_section")))

在連接文件(將有其他的東西在它已經作爲孔)是這樣的:

MEMORY 
{ 
    ....will be other stuff here 
    .... 
    YOUR_MEMORY_NAME : ORIGIN = 0xWhatever, Length = a_length // Creates a memory region 
} 

SECTIONS 
{ 
    ... 
    ... 

    .something_data : 
    { 
     *(your_data) 
    } > YOUR_MEMORY_NAME 

    ... 

} 
+0

它的工作原理!謝謝! –

+0

一些尼特。我認爲「your_data」和「your_section」需要是同一個詞?另外,64字節對齊'.something_data'可能會很好,因爲有人可能會將其他部分添加到'YOUR_MEMORY_NAME'。我同意鏈接器是做這些事情的更好的工具,但我沒有看到OP如何解決任何問題?也許他想要一個編譯時間地址的內存? –

+0

你是對的「your_data」和「your_section」應該是同一個詞。對齊也可能是明智的。 –

0

綜觀一條信息提供似乎代碼的作用DMA向和從DRAM到微控制器的外圍設備的特定硬件緩衝寄存器。

應該有一個代碼,其中硬件外設寄存器地址使用像SBUF或I2C_DATA_REG或類似的東西。 如果你想知道兩個緩衝區的地址,你可能需要使用調試器來查看這兩個陣列的地址,或者如果你有UART工作,那麼你可以在控制檯上打印它。 如果你想修復兩個緩衝區的內存,那麼你需要遵循@Realtime Rik建議的內容