在过去,我在8位AVR和MSP430的工作很多,其中RAM和闪存都直接存储在芯片上。当你编译和下载你的程序时,它在某种程度上是“工作的”,你不需要担心变量实际存储在哪里以及如何存储。
现在我正在开始一个项目,我希望能够在微控制器中添加一些外部存储器(如果有必要的话,可以使用TI Stellaris ),但我不完全确定如何让代码使用外部LM3S9D92。我可以看到你是如何配置外部总线的,就像其他外设一样,但让我困惑的是,处理器是如何跟踪何时与外部存储器通信以及何时与内部存储器通信的。
据我所知,外部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上又搜索了几个小时后找到了这个。结合这里的答案,它对我帮助很大。
https://stackoverflow.com/questions/9221550
复制相似问题