在过去,我已经使用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找到了这个.结合答案,这对我帮助很大.
我最近在工作中发现,由于存在编译器错误的风险,不为硬实时嵌入式系统使用编译器优化的策略是(我们主要使用 gcc,但该策略也扩展到其他编译器)。显然,这项政策的开始是因为过去有人被优化器的错误烧毁了。我的直觉是这过于偏执,所以我已经开始寻找关于这个问题的数据,但问题是我找不到任何关于这个的硬数据。
有谁知道实际获取此类数据的方法?可以使用 gcc bugzilla 页面生成一些错误与编译器优化级别的统计信息吗?甚至有可能获得这样的无偏见数据吗?