【发布时间】:2014-07-16 08:31:46
【问题描述】:
我想知道是否可以在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]);
}
}
所以基本上斐波那契数列的前 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 中以供以后检索?
如果您需要更多信息,请告诉我
非常感谢您的帮助
--W
【问题讨论】:
-
不使用标准 C,您需要查看该特定实现的文档。标准甚至根本不需要堆栈。您在此处了解特定于实现的“详细信息”。
-
所以如果我删除堆栈并堆,数组将存储在处理器可以找到的任何内存中?
-
我不是这么说的。您的问题标题是指“标准 C”。 C 标准没有详细说明实现的细节。它没有描述不同类型的物理内存,甚至芯片或处理器。所以标准中没有任何内容可以让你做你想做的事,它完全超出了标准的范围。
-
有道理。感谢您的意见!
-
您必须指定外部 RAM 是直接连接到 CPU 的地址总线,还是连接到某些外围总线,例如 SPI 或 I2C。
标签: c stack embedded memory-address