登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

单片机片内ram不够用,怎么办?

作者:alphal 栏目:嵌入式系统
单片机片内ram不够用,怎么办?
我现在有两个程序需要合并,每个程序片内ram的使用都是160字节以上,毫无疑问,合起来ram肯定会爆。

希望各位给点建议,可以从哪些方面入手来减少ram的使用。如果把变量定义放到片外是否可行,有什么要注意的?

ps:我们使用77e58的片子。



另外,很纳闷,那个程序keil编译结果显示code超过32k,77e58code大小也只有32k,可是烧片子居然,没事,程序还照样跑。
看来77e58果然超强啊!

2楼: >>参与讨论
squarelook
有问题的
 
3楼: >>参与讨论
alphal
有什么问题的?
 
4楼: >>参与讨论
hongjs
不妨试试
有两个建议:一是重新优化你的代码;二是条件允许的话外扩SRAM

5楼: >>参与讨论
后学
77e58片内有1280字节的RAM
 
6楼: >>参与讨论
alphal
我想问的就是可以从哪些方面进行优化?

不知道通常可以从哪些方面进行优化啊,有哪些技巧的啊?

7楼: >>参与讨论
renjie
我早年使过7758,但是你最后描述的现象是绝对不可能的!
我早年使过7758,但是你最后描述的现象是绝对不可能的!
那个时代使用7758仅仅因为她有2个串口!双dptr,片外ram多1千!

8楼: >>参与讨论
alphal
但是你最后描述的现象是绝对不可能的???
是说这个绝对不可能吗?
另外,很纳闷,那个程序keil编译结果显示code超过32k,77e58code大小也只有32k,可是烧片子居然,没事,程序还照样跑。
看来77e58果然超强啊!


但是,很不好意思,我说的是事实,情况就是这样。

9楼: >>参与讨论
leestrong
不可能的??
 
10楼: >>参与讨论
leestrong
不可能的??
我认为你程序中超出32k的 代码 刚巧没有被调用,所以幸运的运行起来了,

存在隐患的。

11楼: >>参与讨论
平常人
结果不可能,过程更蹊跷!
首先编译器、链接器要报错,其次烧录器也要报错,否则若没人注意到这个情况,产品卖出去后出事,麻烦就大了。所以说“过程更蹊跷”!

工具软件必须有这种监测能力,否则不能实用!

12楼: >>参与讨论
hqgboy
扩啊.不能扩,压缩啊.
 
13楼: >>参与讨论
mxh0506
不会是编译后输出的文件长度大于32K吧?
你看到的是真实的代码长度吗?

14楼: >>参与讨论
tianbi
我也遇到类似的问题
我也遇到类似的问题,我用的是AT89C51,最后提示rom=114,xdata=0,code=2410
但是把code rom size编译模式改成compact或者large就没有问题了,但是我烧到单片机里面不能正确执行,不知道为什么?
我用的keilC


15楼: >>参与讨论
alphal
两个问题
1、keil编译结果的code是不是就是烧写代码所占空间?我编译结果的确code是超过32k的。
2、我说的跑起来了只是一些常用操作没问题,没有做全面测试,所以说“未烧进去的代码没被执行”也对。
3、“首先编译器、链接器要报错” ?
   keil没有报错,烧录软件也没有报错。

16楼: >>参与讨论
prcxf
同意leestrong
我以前碰到过相同情况,不过超过32k的极少用到,因为是调试程序,产品成熟以后,连调试都不会用它

17楼: >>参与讨论
lyhui1976
呵呵
32K实际是32*102432768个字节,编译结果是以字节为单位的,可能是超过了32000,但还没有超过32768

18楼: >>参与讨论
lishuanghua
alphal不会是说编译出来的HEX文件超过32K了吧?
 
19楼: >>参与讨论
linwei1234
同一
同一leestrong,平常人.

20楼: >>参与讨论
liaopolar
LPC2103,8k的ram,才两个美金。
 
21楼: >>参与讨论
lcz01
优化吧
既然是2个程序,在定义变量的时候,一定有重复的,先定义一些必要的全局变量,其余的变量可以共用内部空间的,好好弄一下,一定可以解决的!

22楼: >>参与讨论
yvexf126
建议
重新布局数据结构,你的应是ROM不是RAM,你说错了吧
如果不行,外加外储ROM 

23楼: >>参与讨论
zhuyongbo
用动态的
尽量用动态RAM,在不行就用片外的RAM

24楼: >>参与讨论
Joyce9_9
我也有类似的问题
        我使用的单片机是C8051F020,需要外扩存储器,请问哪种静态RAM芯片比较好啊?哪种Data FLASH芯片较常用啊?

25楼: >>参与讨论
TragicJun
顶一个~!
 
26楼: >>参与讨论
struct
注意函数间调用的问题,很多RAM是可以复用
 
27楼: >>参与讨论
tylnyys
我用51也遇到过
看编译后的代码在烧写器里其实没有超过片子的ROM空间,估计是文件系统原因

28楼: >>参与讨论
erl1982
复用一部分寄存器变量试试
复用一部分寄存器变量试试。具体怎么分配的也不知道

29楼: >>参与讨论
liuwei_69
XKS
完全可以采用外扩RAM,只是在数据读/写时采用MOVX指令即可!!!!

30楼: >>参与讨论
yxhyxh
他说的那个现像在SYMOS的芯片上倒是有可能出现
比如有些4K容量的片子,实际容量为8K,因为他们用的是52封装为51的。

31楼: >>参与讨论
lwg
W77E516,64k,足够你用了
 
32楼: >>参与讨论
linwei1234
何必外扩呢!大RAM,ROM的51核的大把!
何必外扩呢!大RAM,ROM的51核的大把!WINBOND,ST,NXP,STC等也不少啊!

33楼: >>参与讨论
mxinfa
可能是hex与bin大小的问题
我们说的单片机的代码容量一般是指能存储的二进制文件也就是bin文件的大小,keil生成的16进制文件一般转换为bin文件只有原来一半大小,所以对77E58如果烧写hex文件的话一般64k都没有问题的

34楼: >>参与讨论
verver
呵呵
HEX文件超过32K是很正常的啊!
如果CODE超过32K,那你可以在映象文件中看下那些代码超出范围啊!然后再执行下看正常不!

35楼: >>参与讨论
soney
为什么用动态RAM比较号那?
 
36楼: >>参与讨论
linwei1234
不占内存三!
 
37楼: >>参与讨论
jimmydz
考虑用6264外部ram
6264的使用
微处理器通过数据总线、地址总线及控制总线与存储器连接,如下图所示:









    地址总线为地址信号,用来指明选中的存储单元地址。
    数据总线为数据信号,它是微处理器送往存储器的信息或存储器送往微处理器的信息。它包括指令和数据。
    控制总线发出存储器读写信号,以便从ROM、RAM中读出指令或数据,或者向RAM写入数据。
    在微机系统中,常用的静态RAM有6116626462256等。在本实验中使用的是62646264为8K╳8位的静态RAM,其逻辑图如下:











    其中A0~12为13根地址线,I/O0~7为8根数据线,CS1 、CS2为两个片选端,OE为数据输出选通端,WR为写信号端。其工作方式见下表:



控制信号    CS1    CS2    OE    WR    数据线
读    L    H    L    H    输出
写    L    H    ╳    L    输入
非选    H    ╳    ╳    ╳    高阻态
非选    ╳    L    ╳    ╳    高阻态
输出禁止    L    H    H    H    高阻态

【实验内容】
    在FD-SJ8088A实验板上的6264芯片内写入一些数据,然后读出显示在屏幕上以验证正确与否。
【实验连线】
6264的地址线JJ9(A0~A12)接总线上的地址线A0~A12。
6264的数据线JJ7(D0~D7)接总线上的数据线D0~D7。
6264的OE(JJ19.OE)接总线上的MEMR。
6264的WE(JJ19.WE)接总线上的MEMW。
6264的CS2(JJ19.CS2)接总线上的+5V。
    6264的CS1(JJ19.CS1)接JJ8.1(地址高位译码10000H)。
【实验程序一】
CODE SEGMENT 'CODE'
        ASSUME CS:CODE
START:  MOV AX,1000H
        MOV DS,AX
        MOV BX,0000H
        MOV DL,40H
REP1:   INC DL
        MOV DS:[BX],DL
        INC BX
        CMP DL,5AH
        JNZ REP1
        MOV DL,0
        MOV [BX],DL
        MOV AX,DS
        MOV ES,AX
        MOV BP,0
        MOV AH,4
        INT 14H
        XOR CX,CX
        LOOP $
        INT 20H
CODE ENDS
END START
【实验程序二】
CODE SEGMENT 'CODE'
        ASSUME CS:CODE
START:  MOV AX,1000H
        MOV DS,AX
        MOV BX,0000H
        MOV DL,40H
WRITE:  INC DL
        MOV DS:[BX],DL
        INC BX
        CMP DL,5AH
        JNZ WRITE
        MOV BX,0000H
        MOV CX,26
READ:   MOV DL,DS:[BX]
        MOV AH,2
        INT 21H
        INC BX
        LOOP READ
        MOV AH,4CH
        INT 21H
CODE ENDS
END START


38楼: >>参与讨论
lixun00
试试...
函数间用全局变量通信.用stc的芯片可以没有这个困扰,还可多送4个IO口

39楼: >>参与讨论
moyihua
解决提示
单片机RAM不够:
1、硬件解决:在电路上加一块62256(3元一片)和一片74HC373
定义变量时用 xdata 就可以了。
2、软件解决:请楼主用汇编重新写程序,包你够。
3、变量定义上解决:尽可能使用bit和unsigned CHAR 变量.把人能够先计算
的自己都计算好,当做常量用定义在CODE段,就可以多出点RAM,但要点经验的。
4、改用大容量单片机如:AVR,羚羊。
注意:不管怎么样定义变量,单片机的RAM,最后都得留20 byte左右,否则,程序会跑飞的,特别是中断会不执行的。

40楼: >>参与讨论
121385438
你用的都是全局变量?
合适的利用局部变量。



41楼: >>参与讨论
xihulu_r
不明白
每个程序片内ram的使用都是160字节以上,毫无疑问,合起来ram肯定会爆
---------------------------------
为什么?77e58片内有1280的ram,你最多也就用了不到350啊

42楼: >>参与讨论
jxhzsq
fddfd
keil c 编译后提示的是16进制大小文件,而非二进制大小的文件,而我们烧进去的是二进制,

43楼: >>参与讨论
lanfanglee
自己协调RAM变量哈
例如:
    设置10个buf byte(声明为全局变量)然后将所有不重要的局部变量都转变为这几个全局变量即可。这样可以节约很多总体RAM用量。
只是程序可读性变差了。

44楼: >>参与讨论
cuitzsk
有点难
最好外扩RAM

45楼: >>参与讨论
wudeyi
压缩啊.
靠,还是把俩程序读懂,重新写一个吧。而且还可以调整程序的结构,肯定比你合起来的好。依葫芦画瓢还不是小儿科。

46楼: >>参与讨论
linqing171
和起来不一定会爆
如果你不都是全局变量的,编译器会给重复使用的.
以前用ccsc 在PIC16F877上,我用汇编做了近80%的RAM使用,也就是快用光了.可是用C重新做之后发现只用了14%左右.
局部变量能复用的还是复用.

47楼: >>参与讨论
东山客
见过高手优化
我一个同事,上次优化的不错,我帮你问问

48楼: >>参与讨论
zzlking
windows的问题
你从windows系统下看的文件大小是有字节出入的 华邦的还是什么别人的片子
32就是32不会大只能小.

参与讨论
昵称:
讨论内容:
 
 
相关帖子
NiosII下UCOS和移植Linux教程
ADS1。2中怎么嵌入汇编语言呢?
问一下65536色液晶如何对应到RGB颜色
推荐一款优秀的代码浏览器(source insight)
有正在进行SDIO开发的同志吗?可以一起交流
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号