您的位置:首页 > 其它

Keil的片外RAM区支持设置

2015-08-08 16:31 323 查看
转自http://blog.mcuol.com/User/jaywei518/Article/57014_1.htm

还没看会 先转过来收藏一下

最近对ucosii很感兴趣,主要是看linux一头雾水,只知道怎么去用linux,至于里面的机理完全是不懂,任务如何调度,消息如何传递。这些在linux隐藏的很深有时经过层层剥茧才能最终找到实现的代码,这样使我找来找去就失去了信心,但ucosii主要是针对8位16位低端单片机,代码量当然和linux没法比,但是我想说的是有时候我们只知道去追求最火的最流行的,但往往却学不到什么本质的东西。ARM+LINUX固然高端固然牛逼,但有些场合完全用不上这么高端的东西,比如前一阵子在网上看到一个电动牙刷,里面就嵌入了一个51的芯片,话说一个牙刷用ARM用LINUX不是有点小题大做了吗,况且成本那么高,又有谁会去用呢?最近我在做一项工作,就是在51上实现ucosii操作系统,并且加上之前学过的ZNFAT文件系统,这样一个小型的系统就成型了。目前已略有小成(相关代码和解释会在我的其他文章里说明哈哈),话说多了,我们言归正传,今天说的这个问题是我在做ucosii+znfat时遇到的。因为ucosii的代码量很大(相对其他裸跑代码)加上一个文件系统,这样导致我的ram和rom区都不够了,在KEIL编译的时候就出现了如下的错误。



错误提示说是pdata段不够了,显然这里涉及到了几个概念,即data pdata idata 和xdata 这里特地百度了一下 如图



以上的概念乱七八糟的,其实说白了就是我的芯片ram不够了需要扩展。

这里有的人说可以通过设置使用片外ram,的确,KEIL支持选择片外RAM,如图



在设置里面我们可以通过选择Large模式,即变量都存在xdata外部,注意如果选择这个模式,那么即使有片内RAM keil也是不用的,也就是说直接选择使用外部扩展的ram,如果选择small模式,如图



并不是说所有变量只能存在data区,我们仍可以通过xdata如unsigned xdata num来把变量num放到外部存储ram中。我用的芯片是宏晶公司的stc12c5a60s2,除了和一般51自带的256字节外,还外扩了1024字节的外部ram就是通过xdata声明访问的。但是很可惜我的RAM区编译出来的结果是如图



是1419字节,显然超过了256+1024字节,所以即使有芯片自带的外部RAM 也是无济于事,还好我做的这块51板子(在我之前的文章有介绍),有62256外部扩展的RAM,多达64K,显然够了,至于62256的原理我就不多说了,即是通过外部16位总线(P0口和P2口)的方式访问,同时P0口是复用的,在先发送16位地址后又发送8位数据,由于62256的片选信号在P2^7,所以只要最高位为0即可,即62256理论上的地址范围为0x0000-0xFFFF,但0x000开始的256+1024个字节是芯片自带的ram为了怕冲突所以我地址范围定位0x2000-0xffff当然我们用不到这么大的空间,可以根据实际情况设置使用的空间大小,那么在哪里设置呢,如图



Off-chip Xdata memory 即片外的Xdata Ram区,start表示起始地址,size表示大小,这里我使用的是从0x3000开始总共0x8f00个字节的空间(这个空间只要设的足够大就行了).注意当我们设置这个地址后,片内的ram还是有效的,即在片内的ram不够用的情况下才会到0x3000这个地址开始去存放临时数据。这样我们就有了足够的ram空间去存放临时变量数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: