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

nig*_*ain 20 c microcontroller

在过去,我已经使用8位AVR和MSP430进行了大量工作,其中RAM和闪存都直接存储在芯片上.当你编译和下载你的程序时,它有点"正常",你不必担心变量的实际存储位置和方式.

现在我开始一个项目,我希望能够为微控制器添加一些外部存储器(如果重要的话,可以使用TI Stellaris LM3S9D92),但我不完全确定如何使用外部RAM.我可以看到你如何配置外部总线与其他外围设备非常相似,但令我困惑的是处理器如何跟踪何时与外部存储器通信以及何时与内部存储器通信.

据我所知,外部RAM映射到与内部SRAM相同的地址空间(内部从0x20000000开始,外部从0x60000000开始).这是否意味着我写了这样的东西:

int* x= 0x20000000;
int* y= 0x60000000;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想我需要讲一些关于每种类型存储器的界限或者我是否完全错误并且硬件自己解决的问题?链接器脚本是否处理此问题?我知道他们与内存映射有关,但我不知道到底是什么.在阅读了有关如何设置ARM交叉编译器之后,我感觉像winavr(avr-gcc)之类的东西在幕后为我做了很多这样的事情,所以我不必处理它.

很抱歉有点乱,但如果有人能告诉我,如果我在这条东西的正确轨道上,我真的很感激.

更新

对于任何未来的读者,我在另外几个小时的谷歌搜索http://www.bravegnu.org/gnu-eprog/index.html找到了这个.结合答案,这对我帮助很大.

old*_*mer 11

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

您可以问同样的问题,当我写一个字节到地址0x21000010(我刚刚提到那个)时,硬件是如何知道的那样是uart发送保持寄存器,而写入意味着我想从uart发送一个字节?答案是因为它以逻辑方式硬编码.或逻辑可能有一个偏移量,UART也许能够移动它可能是一些其他的控制寄存器的内容加上0x10的.将该控制寄存器(其本身具有一些硬编码地址)从0x21000000更改为0x90000000,然后写入0x90000010,另一个字节输出uart.

我必须看看那个特定的部分,但是如果它确实支持外部存储器,那么理论上你只需要知道处理器地址空间中的哪些地址被映射到那个外部存储器而读写将导致外部存储器访问.

基于英特尔的计算机,PC,往往喜欢一个大的扁平地址空间,在你的Linux机器上使用lspci命令(如果你有的话)或者其他一些命令(如果是windows或者mac),你会发现你的视频卡已被给出一大块地址空间.如果你通过cpu /操作系统的保护并写入该空间的地址,它将通过pcie控制器直接进入处理器并进入视频卡,造成严重破坏或者只是改变颜色像素.您已经使用avr和msp430处理了这个问题.地址空间中的一些地址是闪存,有些是ram,cpu核心外部有一些逻辑,它们查看cpu核心地址总线并决定发送该访问的位置.到目前为止,闪存库和RAM存储库和逻辑都是自包含在芯片边界内的,这远远超出逻辑响应地址的范围,并且从中创建外部存储器周期,当它是完成或结果返回读取它完成内部存储器周期,然后继续下一步.

这有什么意义还是让我变得更糟?