我想知道我是否可以在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循环中计算的,并在从内存中读取数组时从堆栈中检索。
这是他系统的记忆图
c中是否有一个函数允许我将数组X存储在片外RAM中以便以后检索?
如果您需要更多信息,请与我们联系
非常感谢您的帮助
- 含
答案 0 :(得分:1)
不,不是“在C中”,如“由语言指定”。
C语言并不关心存储内容的位置,它没有指定特定地址的RAM存在。
但是,编译器,汇编器和链接器形式的实际实现通常会对此非常关注。
例如,使用gcc,您可以使用section
变量属性将变量强制转换为特定部分。
然后,您可以控制链接器将该部分映射到特定的内存区域。
<强>更新强>:
另一种方法是手动执行,不要让编译器知道秘密并自己动手。
类似的东西:
int *external_array = (int *) 0x00140be0;
memcpy(external_array, x, sizeof x);
将所需的字节数复制到外部存储器。然后,您可以通过交换memcpy()
调用中的两个第一个参数来回读它。
请注意,与让编译器/链接器动态组合“让它为您工作”相比,这种方式更加手动,低级且易碎。
此外,您似乎不太可能希望从ISR完成所有这些工作。