【发布时间】:2012-03-02 13:18:33
【问题描述】:
过去,我使用 8 位 AVR 和 MSP430 进行了大量工作,其中 RAM 和闪存都直接存储在芯片上。当您编译和下载您的程序时,它有点“正常工作”,您无需担心变量的实际存储位置和方式。
现在我开始了一个项目,我希望能够将一些外部存储器添加到微控制器(如果重要的话,可以使用 TI Stellaris LM3S9D92),但我不完全确定你是如何让你的代码使用外部 RAM。我可以看到您配置外部总线的方式与任何其他外围设备非常相似,但令我困惑的是处理器如何跟踪何时与外部存储器通信以及何时与内部存储器通信。
据我所知,外部 RAM 映射到与内部 SRAM 相同的地址空间(内部从 0x20000000 开始,外部从 0x60000000 开始)。这是否意味着如果我写了这样的东西:
int* x= 0x20000000;
int* y= 0x60000000;
x 和 y 会分别指向内部和外部 RAM 的前 4 个字节(假设为 32 位整数)吗?如果是这样,如果我做了这样的事情会怎样:
int x[999999999999]; //some super big array that uses all the internal ram
int y[999999999999]; //this would have to be in external ram or it wouldn't fit
我想我需要告诉一些事情关于每种内存类型的边界,还是我都错了,硬件自己解决了?链接器脚本是否处理此问题?我知道它们与内存映射有关,但我不知道究竟是什么。在阅读了如何设置 ARM 交叉编译器之后,我觉得像 winavr (avr-gcc) 这样的东西在幕后为我做了很多这样的事情,所以我不必处理它。
抱歉有点啰嗦,但如果有人能告诉我我是否在这些东西上走在正确的轨道上,我将不胜感激。
更新
对于任何未来的读者,我在谷歌搜索 http://www.bravegnu.org/gnu-eprog/index.html 几个小时后发现了这一点。结合这里的答案,它对我帮助很大。
【问题讨论】:
-
您可能想在electronics.stackexchange.com 上提问。您可能还想查看Stellaris data sheet。
标签: c microcontroller