如何在微控制器上使用外部内存?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

过去,我在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)在幕后为我做了很多这样的事情,所以我不必处理它。

提问于
用户回答回答于

通常这就是它的工作原理。你必须正确设置硬件和/或硬件可能已经在固定地址硬编码。

你可能会问同样的问题,硬件如何知道,当我写一个字节地址0x21000010(我刚刚提出)那是uart发送保持寄存器,写意味着我想发送一个字节出uart?答案是因为它在逻辑上被硬编码。或者逻辑可能有一个偏移量,uart可能会移动它可能在一些其他控制寄存器内容加0x10。将该控制寄存器(本身具有一些硬编码地址)从0x21000000更改为0x90000000,然后写入0x90000010,并将另一个字节从uart中删除。

我不得不看看那个特定的部分,但是如果它确实支持外部存储器,那么从理论上讲,你所要做的就是知道处理器地址空间中的哪些地址映射到这个外部存储器,读写操作会导致外部存储器访问。

基于英特尔的计算机,个人电脑,往往喜欢一个大的平面地址空间,在你的Linux机器上使用lspci命令(如果有的话)或其他命令(如果是Windows或Mac),并且你会发现你的显卡已经给出一大块地址空间。如果你通过了cpu /操作系统的保护,并且要写入该空间的地址,它将通过pcie控制器直接进入处理器,进入视频卡,造成严重破坏或者只是改变像素。你已经用你的avr和msp430s处理过这个问题。地址空间中的一些地址是闪存,其中一些是ram,在cpu核心之外有一些逻辑查看CPU核心地址总线,并决定在哪里发送该访问。

用户回答回答于

你可以使用保留字寄存器向编译器建议将该变量放入内部存储器位置:register int iInside; 谨慎使用; 编译器知道有多少个字节的寄存器存储空间可用,并且当所有可用空间消失时都无关紧要。

使用寄存器变量仅适用于非常频繁使用的事物,例如计数器。

扫码关注云+社区