2017-01-10 36 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建议的内容