从内存中的特定地址开始初始化数组 - C编程

ele*_*lem 10 c arrays shared-memory

你知道如何从内存中的特定地址开始初始化结构数组(不是虚拟的物理DDR内存).我正致力于在SoC(ARM-FPGA)上实现TxRx.基本上ARM(PS)和FPGA(PL)通过使用共享RAM存储器相互通信.目前我正在处理发送器端,因此我需要不断加载从MAC层到内存的数据包,然后我的Tx读取数据并将其发送到空中.为了实现这一点,我想在(ARM)端实现循环FIFO缓冲,以便我可以将最多6个数据包存储到缓冲区并逐个发送,同时在已发送的包的位置加载其他数据包.因为我需要使用特定的内存地址,我感兴趣的是可以初始化将存储在内存中特定地址的结构数组.例如,我希望我的数组从地址0x400000开始,结束地址0x400000 + MaximumNumberOfPackets x SizeOfPackets我知道如何为结构的一个实例化做这样的事情,例如:buffer_t*tmp =(struct buffer_t*)234881024;

但是如何为结构数组做到这一点?

kdo*_*pen 7

指向单个结构(或int,float或其他任何东西)的指针本质上是指向它们数组的指针.指针类型为数组条目提供sizeof()值,从而允许指针算法工作.

因此,给struct buffer你一个你可以简单地做

static struct buffer * const myFIFO = (struct buffer *) 0x40000
Run Code Online (Sandbox Code Playgroud)

然后只需myFIFO作为一个数组访问

for (size_t i = 0; i < maxPackets; ++i)
{
    buffer[i].someField = initialValue1;
    buffer[i].someOtherField = 42;
}
Run Code Online (Sandbox Code Playgroud)

这可以按照您的预期方式工作.

不能做的(使用纯标准C)是在特定地址声明一个数组,如下所示:

struct buffer myFIFO[23] @ 0x400000;
Run Code Online (Sandbox Code Playgroud)

但是,您的编译器可能具有允许它的扩展.许多嵌入式编译器(毕竟,它们通常是如何声明内存映射设备寄存器),但它对于每个编译器供应商都是不同的,并且可能对于每个芯片都是不同的,因为它是供应商扩展.

例如,GCC确实允许它通过属性用于AVR处理器

volatile int porta __attribute__((address (0x600)));
Run Code Online (Sandbox Code Playgroud)

但它似乎不支持ARM.