标准C:在片外RAM中存储阵列

标准C:在片外RAM中存储阵列,c,stack,embedded,memory-address,C,Stack,Embedded,Memory Address,我想知道是否可以在c中选择阵列的存储位置。这里已经有两个问题和一些有用的信息,但我正在寻找一些额外的信息 我有一个嵌入式系统,在FPGA上实现了软核ARM cortex 启动时,从内存加载代码并由处理器执行。我的代码是汇编语言,包含一些c函数。一个特殊的功能是uART中断,我在下面介绍了它 void UART_ISR() { int count, n=1000, t1=0, t2=1, display=0, y, z; int x[1000]; //storage array for f

我想知道是否可以在c中选择阵列的存储位置。这里已经有两个问题和一些有用的信息,但我正在寻找一些额外的信息

我有一个嵌入式系统,在FPGA上实现了软核ARM cortex

启动时,从内存加载代码并由处理器执行。我的代码是汇编语言,包含一些c函数。一个特殊的功能是uART中断,我在下面介绍了它

void UART_ISR()
{
int count, n=1000, t1=0, t2=1, display=0, y, z;

int x[1000];    //storage array for first 1000 terms of Fibonacci series

x[1] = t1;
x[2] = t2;

printf("\n\nFibonacci Series: \n\n %d \n %d \n ", t1, t2); 

count=2;    /* count=2 because first two terms are already displayed. */

while (count<n)  
{
  display=t1+t2;
  t1=t2;
  t2=display;

  x[count] = t2;
  ++count;

  printf(" %d \n",display);
}

printf("\n\n Finished. Sequence written to memory. Reading sequence from memory.....:\n\n");

for (z=0; z<10000; z++){} // Delay 


for (y=0; y<1000; y++) {    //Read variables from memory
    printf("%d \n",x[y]);
}
}
void UART\u ISR()
{
整数计数,n=1000,t1=0,t2=1,显示=0,y,z;
int x[1000];//Fibonacci级数前1000项的存储阵列
x[1]=t1;
x[2]=t2;
printf(“\n\n波那契系列:\n\n%d\n%d\n”,t1,t2);
count=2;/*count=2,因为前两个术语已经显示*/
而(countNo,而不是“C”中的“由语言指定”

C语言不关心东西存储在哪里,它没有指定特定地址上RAM的存在

但是,编译器、汇编器和链接器形式的实际实现通常非常关心这一点

例如,对于gcc,您可以使用variable属性将变量强制放入特定部分

然后可以控制链接器将该部分映射到特定内存区域

更新

另一种方法是手动完成,不让编译器知道这个秘密,而是自己完成

比如:

int *external_array = (int *) 0x00140be0;
memcpy(external_array, x, sizeof x);
将所需的字节数复制到外部内存。然后可以通过交换
memcpy()
调用中的前两个参数将其读回

请注意,与让编译器/链接器动态二人组为您工作相比,这更为手动、低级和脆弱


此外,您似乎不太可能希望从ISR完成所有这些工作。

不是使用标准C,您需要查看特定实现的文档。该标准甚至根本不需要堆栈。您处于特定于实现的“详细信息”中这里。所以,如果我移除堆栈和堆,数组将只存储在处理器可以找到的任何内存中?我不是这么说的。你的问题标题是“标准C”。C标准没有详细说明实现的细节。它没有描述不同类型的物理内存,甚至没有描述芯片或处理器。因此,标准中没有允许您做您想做的事情,它完全超出了标准的范围。这是有意义的。感谢您的输入!您必须指定y外部RAM是直接连接到CPU的地址总线,还是连接到一些外围总线,如SPI或I2C。感谢您的回复。代码、堆栈和堆都是片上内存。我已经构建了一个内存控制器,与片外RAM接口,我只想将一些数据移到RAM,然后再移回来,以证明其工作正常。中断刚刚结束这是一个简单的地方。这对我来说很有意义。可能是因为我只使用硬件,所以越接近位,我就越容易理解它。谢谢suggestion@AShavedWookie是的。请注意,下一位软件工程师处理该代码很可能会感到意外(以一种糟糕的方式)。