单片机内存不够的问题!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机内存不够的问题!相关的知识,希望对你有一定的参考价值。

我用的单片机STC11F32XE。内部RAM是256个字节,外部RAM有1024个字节。我应用需要接收最大512个字节长度的数据,然后把这些数据填充到EEPROM,EEPROM一个扇区是512个字节,现在我使用外部RAM的512个字节作为接收缓存,用外部RAM的512个字节作为读取EEPROM的缓存,这两个缓存都用完我的外部RAM了,我还需要512个字节的发送缓存和全局变量用到的内存就没有了。对于我这个问题,各位大侠有什么好的办法减少RAM的使用吗?重谢!

解决方案:
一、在原有的单片机上改动。
1、优化程序,有效果,但效果其实不大。
2 、自己扩展片外的RAM,一来是费硬件的钱,二来是电路要不停的飞线。
二、换一大内存的单片机。比如STC32F103C8T6,三个串口,16K的RAM。
三、减少串口对数据的接收量,比如只检查$GPRMC信息,提取到坐标后就把其他信息丢弃了。
参考技术A 外部与内部可以共用512字节的缓存,使用不同的中断就可以,即当接收或发送断到来时,先对512字节的缓存清零,然后读入或接收数据再填充就行了。也可以在填充或发送完后清零,这样在发送或接收时就不需要先清零了。中断到后可直接使用缓存 参考技术B 发送的是读取EEPROM的数据的话,这两个缓存可以共用呀,还有你可以选取STC含有内部扩展RAM大点的单片机呀,就我所知,好像最大有4K的扩展RAM吧。 参考技术C 接收缓存和发送缓存如果不需用同时使用可以共用一个缓存区 参考技术D 接收缓存、读取EEPROM的缓存、发送缓存三者的在时间上是否会同时使用(三者的关系),如否,可考虑不同时间段共享内存追问

我用的开发环境为KEIL4.12,请问如何共享这段内存呢。我的应用是这样的:首先把从网口接收到的42+512=554个字节进行累积和校验,然后用这些数据去修改EEPROM中的数据,因为一个扇区为512字节,所以我定义一个512字节的数组(局部变量)做为缓存,网口接收缓存是定义一个554字节的全局变量数组,结果编译的时候XDATA已超过1024字节了,编译都通不过!

51单片机ram不够用,怎么优化程序

用的是AT89C51SND1芯片,概况如下
• 8-bit MCU C51 Core Based (FMAX = 20 MHz)
• 2304 Bytes of Internal RAM
• 64K Bytes of Code Memory
– AT89C51SND1C: Flash (100K Erase/Write Cycles)
– AT83SND1C: ROM
• 4K Bytes of Boot Flash Memory (AT89C51SND1C)
– ISP: Download from USB (standard) or UART (option)
• External Code Memory
– AT80C51SND1C: ROMless

我编译下来的结果是data=17.0 xdata=579 code=3099,

全局变量
extern unsigned char PageBuf[512];
extern unsigned char FAT_TYPE;
extern unsigned char Keyflag=0;

我请教下,
1.嵌套的越多是不是占用ram越多啊?
2.要是优化一个变量,我听说使用查表的方法,是不是把可以建一个固定值的数组到code程序里面,然后用的时候是不是占用ram就少了?
3.有人用过这个芯片没?
4.我data怎么才17啊,是不是XATA转换到data里面就好些了啊,因为目前状况是xata用的太多了

1.肯定的,嵌套越多,要压栈保存的信息就越多,占用的RAM就越多了,对51来说,最多就是CPU内256字节的RAM。

2.是的。

3.没用过这芯片……我用的最多的是AVR

4因为你定义了一个pagebuf[512],512字节啊!51单片机的data撑死才256字节(还没算压栈保存数据需要的RAM),所以编译器自动将这个数组放在了XDATA中。追问

我编译的结果是data=17.0 xdata=579 code=3099
datasheet里面是• 2304 Bytes of Internal RAM
这里2304 Bytes就是2K字节?定义了一个pagebuf[512],512字节放不到data(128B)里面,然后就放到xdata里面,那2304 Byte是data还是哪个啊?xdata(64KB)是Code Memory,在里面数组不是定义了给了值不好变么?
c51中的存储类型
code :程序存储区64KB
data :可直接寻址的内部数据存储区128B
xdata:外部数据存储区64KB

追答

2304=2048+256,就是说这单片机是增强型的52单片机,基本有256字节RAM,使用直接或间接寻址访问的,还有2048字节的扩展RAM,称为XRAM,就像给单片机外部接6116、6264或者62256这样的SRAM。

xdata(64KB)是指的Data memory,就是RAM。单片机内部已经有64KB的code memory了,即ROM。

参考技术A 从结果上看,存储器并没有超出,怎么会不够用,不够用的话应该出编译错误的吧。追问

这是我修改后是够用了,不过在主函数中嵌套了函数就不够了

参考技术B 如果是汇编,就好办,寄存器内容可以分时公用的。
如果是c,只有减少变量,特别是全局变量的使用。
或者选用大ram的片子,成本更低,例如STC的,不要外扩。追问

对不起,我的问题还没来得及补充,你抢楼抢的真快,谢谢你的回答

追答

定义变量的时候,xdata是指放在多的那部分ram的,你的这片子有2k,还不够?汇编用查表好,可以节省ram,但c的查表还是要定义数组,你试试。

参考技术C 你这片子信息明显是除了正常的256的IDATA(其中128的data),还有2K的XDATA,这个编译的结果应该不会出现错误的。
我没有用过AT的,用的都是STC的,STC的XDATA直接就可以用,不知道你这个具体怎么回事,要说子程序循环嵌套而造成堆栈不够用的话,这个编译器不一定能报错,而是实际跑程序的时候会出错。
你应该把编译器的报错信息发出来,或者自己查一下。追问

我是嵌套了,我删除了我需要串口显示的程序,现在功能实现,勉强够用,不过我还有两个功能函数没加上去,看来我的程序还是比较笨重

以上是关于单片机内存不够的问题!的主要内容,如果未能解决你的问题,请参考以下文章

在stm32单片机使用到内部RAM的时候报RAM空间不够

怎么解决单片机数组占用太多内存的问题

51单片机中C语言int能转换为字符串类型吗?怎么转换?

如何巧妙利用4个IO口驱动12个LED灯

stm32网联丢包跟内存分配有关吗

MCS-51系列单片机系统功能的扩展