【问题标题】:Standard C: Storing arrays in off-chip RAM标准 C:将数组存储在片外 RAM 中
【发布时间】: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


【解决方案1】:

不,不是像“由语言指定”那样“在 C 中”。

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

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

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

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

更新

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

类似:

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

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

请注意,与让编译器/链接器动态二人组 Just Make it Work for you 相比,这更加手动、低级和脆弱。

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

【讨论】:

  • 感谢您的回复。代码、堆栈和堆位于片上存储器上。我已经构建了一个内存控制器来与片外 RAM 接口,我只想将一些数据移动到 ram 并返回以证明它有效。中断只是一个简单的地方。
  • 这对我来说很有意义。这可能是因为我只使用硬件,越接近我越容易理解它。感谢您的建议
  • @AShavedWookie 对。请注意,下一位处理该代码的软件工程师很可能会(以一种糟糕的方式)感到惊讶。
猜你喜欢
  • 2012-04-10
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多