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

时间:2014-05-27 12:17:25

标签: c stack embedded memory-address

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

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

启动时,代码从内存加载并由处理器执行。我的代码是汇编的,包含一些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]);
}
}

所以基本上Fibonacci系列的前1000个值被打印并存储在数组X中,然后在短暂的延迟后再次将数组中的值打印到屏幕上。

如果我错了,请纠正我,但是数组X中的值存储在堆栈中,因为它们是在for循环中计算的,并在从内存中读取数组时从堆栈中检索。

这是他系统的记忆图

  • 0x0000_0000到0x0000_0be0是代码
  • 0x0000_0be0到0x0010_0be0是1MB堆
  • 0x0010_0be0到0x0014_0be0是256KB堆栈
  • 0x0014_0be0至0x03F_FFFF是片内RAM

c中是否有一个函数允许我将数组X存储在片外RAM中以便以后检索?

如果您需要更多信息,请与我们联系

非常感谢您的帮助

- 含

1 个答案:

答案 0 :(得分:1)

不,不是“在C中”,如“由语言指定”。

C语言并不关心存储内容的位置,它没有指定特定地址的RAM存在。

但是,编译器,汇编器和链接器形式的实际实现通常会对此非常关注。

例如,使用gcc,您可以使用section变量属性将变量强制转换为特定部分。

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

<强>更新

另一种方法是手动执行,不要让编译器知道秘密并自己动手。

类似的东西:

int *external_array = (int *) 0x00140be0;
memcpy(external_array, x, sizeof x);

将所需的字节数复制到外部存储器。然后,您可以通过交换memcpy()调用中的两个第一个参数来回读它。

请注意,与让编译器/链接器动态组合“让它为您工作”相比,这种方式更加手动,低级且易碎。

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