- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
过去,我经常使用 8 位 AVR 和 MSP430,其中 RAM 和闪存都直接存储在芯片上。当您编译和下载您的程序时,它有点“正常工作”,您无需担心变量实际存储在何处以及如何存储。
现在我开始一个项目,我希望能够将一些外部存储器添加到微 Controller (如果重要的话,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
我想我需要告诉一些事情关于每种类型内存位置的边界,或者我是否完全错了并且硬件自己解决了?链接描述文件处理这个吗?我知道它们与内存映射有关,但我不知 Prop 体是什么。在阅读了如何设置 ARM 交叉编译器之后,我觉得像 winavr (avr-gcc) 这样的东西在幕后为我做了很多这样的事情,所以我不必处理它。
抱歉有点啰嗦,但如果有人能告诉我我是否在正确的轨道上处理这些东西,我将非常感激。
更新
对于任何 future 的读者,我在谷歌搜索了几个小时后发现了这个 http://www.bravegnu.org/gnu-eprog/index.html .结合这里的答案对我帮助很大。
最佳答案
通常这就是它的工作原理。您必须正确设置硬件和/或硬件可能已经在固定地址处进行了硬编码。
你可能会问同样的问题,当我向地址 0x21000010 写入一个字节(我刚刚编造的)时,硬件如何知道那是 uart 传输保持寄存器并且写入意味着我想发送一个字节串口?答案是因为它以这种方式硬编码在逻辑中。或者逻辑可能有一个偏移量,uart 可能能够移动它可能在一些其他控制寄存器内容加上 0x10。将控制寄存器(它本身有一些硬编码地址)从 0x21000000 更改为 0x90000000,然后写入 0x90000010,另一个字节从 uart 输出。
我必须查看那个特定部分,但如果它确实支持外部存储器,那么从理论上讲,这就是您要做的全部事情,知道处理器地址空间中的哪些地址映射到该外部存储器,并且读写将导致外部存储器访问。
基于 Intel 的计算机,PC,倾向于喜欢一个大的平面地址空间,在你的 Linux 机器上使用 lspci 命令(如果你有的话)或者在 Windows 或 Mac 上使用一些其他命令,你会发现你的视频卡已经被赋予了一大块地址空间。如果您通过了 cpu/操作系统的保护,并且要写入该空间中的地址,它将通过 pcie Controller 直接从处理器输出并进入视频卡,要么造成严重破坏,要么可能只是改变像素。你已经用你的 avr 和 msp430s 处理过这个问题。地址空间中的一些地址是 flash,一些是 ram,在 cpu 内核之外有一些逻辑查看 cpu 内核地址总线并决定将访问发送到哪里。到目前为止,flash bank 和 ram bank 以及逻辑都包含在芯片的边界内,这并没有超出逻辑响应地址的范围,并从中创建一个外部存储周期,当它是完成或结果在读取时返回,它完成了内部存储周期,您可以继续下一件事。
这有意义吗?还是我让事情变得更糟了?
关于c - 如何在微 Controller 上使用外部存储器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9221550/
我是一名优秀的程序员,十分优秀!