Board logo

标题: [讨论]ram不够用 [打印本页]

作者: 流浪远方百合    时间: 2006-2-27 16:15     标题: [讨论]ram不够用

请各位帮忙,我用MC68HC908JB16芯片,它的RAM只有384byte,我现在要用一个算法,用C语言做,光算法的变量就占了350byte最少,现在有什么办法,在不换芯片的前提下实现


作者: strongchen    时间: 2006-2-27 17:09

1.优化算法。
2.将中间变量存储于FLASH中。
3.外加EEPROM。
作者: 流浪远方百合    时间: 2006-2-27 21:22

多谢版主,我在main()写了简单的小程序测了一下 ,怎么最多只能申请200byte变量。那其它剩余的空间干吗了,
我测试时候没有变量被优化的,当申请到380byte时debug初步可以看见给变量分配空间,但程序运行结果不正确,
作者: strongchen    时间: 2006-2-28 10:23

怎么“申请”变量?
作者: 流浪远方百合    时间: 2006-2-28 10:28

就是定义了局部变量,比如:unsigned char a[300];
还有请教版主:start08.c具体干什么工作?会不会占用RAM空间?
作者: strongchen    时间: 2006-2-28 10:34

start08.c应该不会占用RAM。其余的RAM应该是被其他的全局变量和堆栈占用了。你可以试着调整一下堆栈的大小。
作者: 流浪远方百合    时间: 2006-2-28 10:46

我的程序里面没有全局变量的,而且只有main(),在里面定义的变量,
我不明白堆栈大小在那可以调整?在prm看不出哪有,多谢!!!!
作者: strongchen    时间: 2006-2-28 11:17

就是在PRM文件中呀,仔细看看...
作者: 流浪远方百合    时间: 2006-2-28 21:23

恩,版主有个不明白的,Z_RAM和RAM在数据寻找方式不同,一 是编译器自动完成的吗?
二 那么定义数据要不要用修饰符区别?
三 局部变量如果没有固定地址可以放到堆栈,那么我可不可以把堆栈大小设置位 384,这样测试,
四 我在申请变量空间大于200时候,在truetime窗口看见数组分配的位置怎么到了I/O register空间的位置,但是CW编译不报错,
作者: strongchen    时间: 2006-3-1 10:53

局部变量本身就没有固定的地址,是放到堆栈中的。所以CW编译时可能不报错。你必须注意栈底的位置以及堆栈的大小,不然确实可能出现堆栈溢出的问题。
作者: 流浪远方百合    时间: 2006-3-6 15:16

哎呀,版主,,我在 PRM文件看见stack 的是这样:
.stack 80 R/W 0x100 0x14F RAM
起始地址是 0x0100,在程序truetime'窗口看见 SP 指针复位 FF
怎么越看越感觉不对了,当单步调试程序看见 SP 是递减的,嵌入函数内部时候,SP 的范围会指向 00DB,sp 应该是堆栈指针吧,这样不是跑到栈外的空间了吗?
但是程序解果是正确的。

作者: strongchen    时间: 2006-3-7 11:51

你的PRM文件很奇怪呵,哪里来的?标准的PRM文件应该是这样的:

/* This is a linker parameter file for the JB16 */

NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
ROM = READ_ONLY 0xBA00 TO 0xF9FF;
Z_RAM = READ_WRITE 0x0080 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x01FF;
END

PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
DEFAULT_RAM INTO RAM;
DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM; /* In case you want to use as well, be sure the option -OnB=b is passed to the compiler. */
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
END


STACKSIZE 0x50

VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */

作者: 流浪远方百合    时间: 2006-3-7 13:56

是啊,我的prm就是这样的和标准的一样,编译自动生成的,我是在分配文件看见的,为什么sp出栈了,结果还正确啊!
作者: seuafu2005    时间: 2006-3-8 11:04

SP是应该递减的,你默认的mode是tiny,所以堆栈会放在zero page的空间内,从0x100地址开始递减。默认分配给堆栈的空间是0x50。
作者: 流浪远方百合    时间: 2006-3-8 11:27

不是啊,我得堆栈看了是从0x14f开始,然后递减的,到100满了,但是就继续减,咋不报错?、
作者: 流浪远方百合    时间: 2006-3-16 13:34

大家过来帮我分析一下,
我的ram空间现在基本刚好够用了,我在调试程序时候,堆栈开了0x90,我要将一组数据进行算法转换,如果我得该组数据直接用for赋值,结果是正确的,但是我从键盘按键取值放入缓冲,只能取一个数据,多了取值不对,键盘取值是没有问题的,这会是什么原因,查了好久,感觉是ram的问题,但是我直接赋值占用的还是那些空间啊!!!

[此贴子已经被作者于2006-3-16 13:34:06编辑过]


作者: seuafu2005    时间: 2006-3-16 13:51

键盘取值肯定是需要调用一些函数,这会占用堆栈空间RAM的空间
直接赋值的话不占用堆栈的空间
缓冲的是开在函数内还是在函数外?函数内等于局部变量,访问的话也占用堆栈空间




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0