首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在微控制器上使用外部存储器

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

Stack Overflow用户
提问于 2012-02-10 09:32:30
回答 2查看 19.7K关注 0票数 22

在过去,我在8位AVR和MSP430的工作很多,其中RAM和闪存都直接存储在芯片上。当你编译和下载你的程序时,它在某种程度上是“工作的”,你不需要担心变量实际存储在哪里以及如何存储。

现在我正在开始一个项目,我希望能够在微控制器中添加一些外部存储器(如果有必要的话,可以使用TI Stellaris ),但我不完全确定如何让代码使用外部LM3S9D92。我可以看到你是如何配置外部总线的,就像其他外设一样,但让我困惑的是,处理器是如何跟踪何时与外部存储器通信以及何时与内部存储器通信的。

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

代码语言:javascript
复制
int* x= 0x20000000;
int* y= 0x60000000;

X和y会分别指向内部和外部RAM的前4个字节(假设32位整数)吗?如果是这样,如果我这样做会怎么样:

代码语言:javascript
复制
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上又搜索了几个小时后找到了这个。结合这里的答案,它对我帮助很大。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-10 11:13:39

一般来说,这正是它的工作方式。您必须正确设置硬件和/或硬件可能已经在固定地址进行了硬编码。

您可能会问同样的问题,当我向地址0x21000010写入一个字节(这是我自己编造的)时,硬件如何知道这是uart传输保持寄存器,并且该写入意味着我想要将一个字节发送出uart?答案是因为它是以这种方式在逻辑中硬编码的。或者逻辑可能具有偏移量,则uart可能能够将其移动到一些其他控制寄存器内容加上0x10。将控制寄存器(其本身具有一些硬编码地址)从0x21000000更改为0x90000000,然后写入0x90000010,另一个字节从uart输出。

我将不得不考虑这一特定部分,但如果它确实支持外部存储器,那么在理论上,您需要做的就是知道处理器地址空间中的哪些地址映射到该外部存储器,并且读取和写入将导致外部存储器访问。

基于英特尔的计算机,PC,倾向于喜欢一个大的平面地址空间,在你的Linux机器(如果你有)上使用lspci命令,或者在windows或mac上使用一些其他命令,你会发现你的视频卡已经被分配了一块地址空间。如果您通过了cpu/操作系统的保护,并且要写入该空间中的某个地址,它将直接从处理器通过pcie控制器进入显卡,要么造成严重破坏,要么只是改变像素的颜色。你已经用你的avr和msp430s处理过这个问题了。地址空间中的一些地址是闪存,一些是ram,在cpu核心之外有一些逻辑来查看cpu核心地址总线,并决定将该访问发送到哪里。到目前为止,闪存存储体和ram存储体和逻辑都是自包含在芯片的边界内,这并不是太远的延伸,超出了逻辑对地址的响应,并由此创建了一个外部存储器周期,当它完成或读取结果返回时,它完成了内部存储器周期,您继续下一件事。

这有什么意义吗?还是我把事情搞得更糟了?

票数 11
EN

Stack Overflow用户

发布于 2012-02-10 13:09:09

您可以使用保留字register来建议编译器将该变量放入内部内存位置: register int iInside;请小心;编译器知道有多少字节的寄存器存储空间可用,当所有可用空间用完时,这都无关紧要。

只将寄存器变量用于将要非常、非常频繁地使用的东西,例如计数器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9221550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档