|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
单片机片内ram不够用,怎么办? |
作者:alphal 栏目:嵌入式系统 |
我现在有两个程序需要合并,每个程序片内ram的使用都是160字节以上,毫无疑问,合起来ram肯定会爆。 希望各位给点建议,可以从哪些方面入手来减少ram的使用。如果把变量定义放到片外是否可行,有什么要注意的? ps:我们使用77e58的片子。 另外,很纳闷,那个程序keil编译结果显示code超过32k,77e58code大小也只有32k,可是烧片子居然,没事,程序还照样跑。 看来77e58果然超强啊! |
2楼: | >>参与讨论 |
作者: squarelook 于 2006/9/4 10:25:00 发布:
有问题的 |
3楼: | >>参与讨论 |
作者: alphal 于 2006/9/4 11:29:00 发布:
有什么问题的? |
4楼: | >>参与讨论 |
作者: hongjs 于 2006/9/4 21:43:00 发布:
不妨试试 有两个建议:一是重新优化你的代码;二是条件允许的话外扩SRAM。 |
5楼: | >>参与讨论 |
作者: 后学 于 2006/9/5 8:51:00 发布:
77e58片内有1280字节的RAM |
6楼: | >>参与讨论 |
作者: alphal 于 2006/9/5 11:05:00 发布:
我想问的就是可以从哪些方面进行优化? 不知道通常可以从哪些方面进行优化啊,有哪些技巧的啊? |
7楼: | >>参与讨论 |
作者: renjie 于 2006/9/5 20:44:00 发布:
我早年使过7758,但是你最后描述的现象是绝对不可能的! 我早年使过7758,但是你最后描述的现象是绝对不可能的! 那个时代使用7758仅仅因为她有2个串口!双dptr,片外ram多1千! |
8楼: | >>参与讨论 |
作者: alphal 于 2006/9/6 9:04:00 发布:
但是你最后描述的现象是绝对不可能的??? 是说这个绝对不可能吗? 另外,很纳闷,那个程序keil编译结果显示code超过32k,77e58code大小也只有32k,可是烧片子居然,没事,程序还照样跑。 看来77e58果然超强啊! 但是,很不好意思,我说的是事实,情况就是这样。 |
9楼: | >>参与讨论 |
作者: leestrong 于 2006/9/6 11:16:00 发布:
不可能的?? |
10楼: | >>参与讨论 |
作者: leestrong 于 2006/9/6 11:18:00 发布:
不可能的?? 我认为你程序中超出32k的 代码 刚巧没有被调用,所以幸运的运行起来了, 存在隐患的。 |
11楼: | >>参与讨论 |
作者: 平常人 于 2006/9/6 11:24:00 发布:
结果不可能,过程更蹊跷! 首先编译器、链接器要报错,其次烧录器也要报错,否则若没人注意到这个情况,产品卖出去后出事,麻烦就大了。所以说“过程更蹊跷”! 工具软件必须有这种监测能力,否则不能实用! |
12楼: | >>参与讨论 |
作者: hqgboy 于 2006/9/6 11:43:00 发布:
扩啊.不能扩,压缩啊. |
13楼: | >>参与讨论 |
作者: mxh0506 于 2006/9/7 10:58:00 发布:
不会是编译后输出的文件长度大于32K吧? 你看到的是真实的代码长度吗? |
14楼: | >>参与讨论 |
作者: tianbi 于 2006/9/8 9:04:00 发布:
我也遇到类似的问题 我也遇到类似的问题,我用的是AT89C51,最后提示rom=114,xdata=0,code=2410, 但是把code rom size编译模式改成compact或者large就没有问题了,但是我烧到单片机里面不能正确执行,不知道为什么? 我用的keilC |
15楼: | >>参与讨论 |
作者: alphal 于 2006/9/8 9:41:00 发布:
两个问题 1、keil编译结果的code是不是就是烧写代码所占空间?我编译结果的确code是超过32k的。 2、我说的跑起来了只是一些常用操作没问题,没有做全面测试,所以说“未烧进去的代码没被执行”也对。 3、“首先编译器、链接器要报错” ? keil没有报错,烧录软件也没有报错。 |
16楼: | >>参与讨论 |
作者: prcxf 于 2006/9/8 17:21:00 发布:
同意leestrong 我以前碰到过相同情况,不过超过32k的极少用到,因为是调试程序,产品成熟以后,连调试都不会用它 |
17楼: | >>参与讨论 |
作者: lyhui1976 于 2006/9/9 7:17:00 发布:
呵呵 32K实际是32*1024=32768个字节,编译结果是以字节为单位的,可能是超过了32000,但还没有超过32768。 |
18楼: | >>参与讨论 |
作者: lishuanghua 于 2006/9/9 8:25:00 发布:
alphal不会是说编译出来的HEX文件超过32K了吧? |
19楼: | >>参与讨论 |
作者: linwei1234 于 2006/9/9 9:51:00 发布:
同一 同一leestrong,平常人. |
20楼: | >>参与讨论 |
作者: liaopolar 于 2006/9/9 18:31:00 发布:
用LPC2103,8k的ram,才两个美金。 |
21楼: | >>参与讨论 |
作者: lcz01 于 2006/9/10 6:33:00 发布:
优化吧 既然是2个程序,在定义变量的时候,一定有重复的,先定义一些必要的全局变量,其余的变量可以共用内部空间的,好好弄一下,一定可以解决的! |
22楼: | >>参与讨论 |
作者: yvexf126 于 2006/9/10 20:47:00 发布:
建议 重新布局数据结构,你的应是ROM不是RAM,你说错了吧 如果不行,外加外储ROM |
23楼: | >>参与讨论 |
作者: zhuyongbo 于 2006/9/11 15:50:00 发布:
用动态的 尽量用动态RAM,在不行就用片外的RAM |
24楼: | >>参与讨论 |
作者: Joyce9_9 于 2006/9/11 16:25:00 发布:
我也有类似的问题 我使用的单片机是C8051F020,需要外扩存储器,请问哪种静态RAM芯片比较好啊?哪种Data FLASH芯片较常用啊? |
25楼: | >>参与讨论 |
作者: TragicJun 于 2006/9/12 8:43:00 发布:
顶一个~! |
26楼: | >>参与讨论 |
作者: struct 于 2006/9/12 9:04:00 发布:
注意函数间调用的问题,很多RAM是可以复用 |
27楼: | >>参与讨论 |
作者: tylnyys 于 2006/9/12 9:37:00 发布:
我用51也遇到过 看编译后的代码在烧写器里其实没有超过片子的ROM空间,估计是文件系统原因 |
28楼: | >>参与讨论 |
作者: erl1982 于 2006/9/12 17:28:00 发布:
复用一部分寄存器变量试试 复用一部分寄存器变量试试。具体怎么分配的也不知道 |
29楼: | >>参与讨论 |
作者: liuwei_69 于 2006/9/12 21:01:00 发布:
XKS 完全可以采用外扩RAM,只是在数据读/写时采用MOVX指令即可!!!! |
30楼: | >>参与讨论 |
作者: yxhyxh 于 2006/9/13 8:39:00 发布:
他说的那个现像在SYMOS的芯片上倒是有可能出现 比如有些4K容量的片子,实际容量为8K,因为他们用的是52封装为51的。 |
31楼: | >>参与讨论 |
作者: lwg 于 2006/9/13 12:59:00 发布:
换W77E516,64k,足够你用了 |
32楼: | >>参与讨论 |
作者: linwei1234 于 2006/9/14 0:07:00 发布:
何必外扩呢!大RAM,ROM的51核的大把! 何必外扩呢!大RAM,ROM的51核的大把!WINBOND,ST,NXP,STC等也不少啊! |
33楼: | >>参与讨论 |
作者: mxinfa 于 2006/9/14 7:58:00 发布:
可能是hex与bin大小的问题 我们说的单片机的代码容量一般是指能存储的二进制文件也就是bin文件的大小,keil生成的16进制文件一般转换为bin文件只有原来一半大小,所以对77E58如果烧写hex文件的话一般64k都没有问题的 |
34楼: | >>参与讨论 |
作者: verver 于 2006/9/14 9:20:00 发布:
呵呵 HEX文件超过32K是很正常的啊! 如果CODE超过32K,那你可以在映象文件中看下那些代码超出范围啊!然后再执行下看正常不! |
35楼: | >>参与讨论 |
作者: soney 于 2006/9/14 12:57:00 发布:
为什么用动态RAM比较号那? |
36楼: | >>参与讨论 |
作者: linwei1234 于 2006/9/14 18:10:00 发布:
不占内存三! |
37楼: | >>参与讨论 |
作者: jimmydz 于 2006/9/14 18:58:00 发布:
考虑用6264外部ram 6264的使用 微处理器通过数据总线、地址总线及控制总线与存储器连接,如下图所示: 地址总线为地址信号,用来指明选中的存储单元地址。 数据总线为数据信号,它是微处理器送往存储器的信息或存储器送往微处理器的信息。它包括指令和数据。 控制总线发出存储器读写信号,以便从ROM、RAM中读出指令或数据,或者向RAM写入数据。 在微机系统中,常用的静态RAM有6116、6264、62256等。在本实验中使用的是6264。6264为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 于 2006/9/15 14:01:00 发布:
试试... 函数间用全局变量通信.用stc的芯片可以没有这个困扰,还可多送4个IO口 |
39楼: | >>参与讨论 |
作者: moyihua 于 2006/9/17 22:28:00 发布:
解决提示 单片机RAM不够: 1、硬件解决:在电路上加一块62256(3元一片)和一片74HC373, 定义变量时用 xdata 就可以了。 2、软件解决:请楼主用汇编重新写程序,包你够。 3、变量定义上解决:尽可能使用bit和unsigned CHAR 变量.把人能够先计算 的自己都计算好,当做常量用定义在CODE段,就可以多出点RAM,但要点经验的。 4、改用大容量单片机如:AVR,羚羊。 注意:不管怎么样定义变量,单片机的RAM,最后都得留20 byte左右,否则,程序会跑飞的,特别是中断会不执行的。 |
40楼: | >>参与讨论 |
作者: 121385438 于 2006/9/27 15:19:00 发布:
你用的都是全局变量? 合适的利用局部变量。 |
41楼: | >>参与讨论 |
作者: xihulu_r 于 2006/9/28 11:32:00 发布:
不明白 每个程序片内ram的使用都是160字节以上,毫无疑问,合起来ram肯定会爆 --------------------------------- 为什么?77e58片内有1280的ram,你最多也就用了不到350啊 |
42楼: | >>参与讨论 |
作者: jxhzsq 于 2006/9/30 14:58:00 发布:
fddfd keil c 编译后提示的是16进制大小文件,而非二进制大小的文件,而我们烧进去的是二进制, |
43楼: | >>参与讨论 |
作者: lanfanglee 于 2006/10/6 10:13:00 发布:
自己协调RAM变量哈 例如: 设置10个buf byte(声明为全局变量)然后将所有不重要的局部变量都转变为这几个全局变量即可。这样可以节约很多总体RAM用量。 只是程序可读性变差了。 |
44楼: | >>参与讨论 |
作者: cuitzsk 于 2006/10/8 10:58:00 发布:
有点难 最好外扩RAM |
45楼: | >>参与讨论 |
作者: wudeyi 于 2006/10/9 9:19:00 发布:
压缩啊. 靠,还是把俩程序读懂,重新写一个吧。而且还可以调整程序的结构,肯定比你合起来的好。依葫芦画瓢还不是小儿科。 |
46楼: | >>参与讨论 |
作者: linqing171 于 2006/10/10 12:59:00 发布:
和起来不一定会爆 如果你不都是全局变量的,编译器会给重复使用的. 以前用ccsc 在PIC16F877上,我用汇编做了近80%的RAM使用,也就是快用光了.可是用C重新做之后发现只用了14%左右. 局部变量能复用的还是复用. |
47楼: | >>参与讨论 |
作者: 东山客 于 2006/10/11 21:14:00 发布:
见过高手优化 我一个同事,上次优化的不错,我帮你问问 |
48楼: | >>参与讨论 |
作者: zzlking 于 2006/10/18 7:50:00 发布:
windows的问题 你从windows系统下看的文件大小是有字节出入的 华邦的还是什么别人的片子 32就是32不会大只能小. |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |