打印

堆栈从什么地方开始怎么堆?

[复制链接]
3756|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
spming|  楼主 | 2007-2-26 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.我现在在使用MC68HC908JL8这款MCU现在我发现我的变量大于大概50个字节的时候编译是没有问题但是连接就不通过。
我后来在PRM文件中把RAM的地址修改了一下:
默认 Z_RAM   0x60-0xff
         RAM     0x100-0x15F
我修改后  Z_RAM   0x60-0xff
         RAM     0xb0-0x15F
这个时候我的连接就没有问题了,现在我想知道这样修改是不是可以的,可以的话这是为什么(也就是Z_RAM 和RAM的区别 )?  
2.我想用内部的RC振荡怎么操作?
3.堆栈是从哪里开始的?可不可以改变堆栈的初始地址怎么改变呢?

相关帖子

沙发
张明峰| | 2007-2-26 16:05 | 只看该作者

PRM文件可以修改但不能乱改

Z_RAM和RAM肯定是有区别的,他们的地址分配一般不能重叠。象上面的改法,这两个区域在0xb0-0xff间就重叠了,很容易出问题。

你的这个问题原因是没有充分利用0x00-0xffRAM空间。在small项目模式下,缺省变量都被放在RAM区。如果要将变量放到Z_RAM区,必须在定义前特别声明,例如:
//==============================================================
// Following data are declared in the direct addressing area
// for fast access (address < 0x100)
//==============================================================
#pragma DATA_SEG SHORT MY_ZEROPAGE      //direct addressing data segment
byte hour, minute, second, year, month, day;

普通RAM区的变量声明如下:
//==============================================================
// Following data are declared in the common data area
// (address >= 0x100)
//==============================================================
#pragma DATA_SEG DEFALUT        //default data segment
volatile byte tempBuff[16];

JL8只能运行在外部晶体振荡或外部RC振荡,不能运行在内部RC振荡模式下。其片内RC振荡时钟源只针对看门狗COP和SIM模块,不能拿来做程序运行的时钟源。

堆栈的长度可以自由修改,在PRM文件中有一行“STACKSIZE 0x??”,其中的??代表堆栈长度,按实际需要用户可以随意修改。堆栈具体的位置将被在内存RAM的最高端。

使用特权

评论回复
板凳
JerryBJ| | 2007-2-26 19:19 | 只看该作者

一点补充

“堆栈具体的位置将被在内存RAM的最高端。”

——据我观察,栈的安排是这样的,从RAM_START开始,首先安排全局变量和静态变量,紧接着就是栈空间了。比如在small模式下,RAM的起始地址RAM_START=0x0100,程序中有16个全局变量,STACK_SIZE=0x30,则内存映射如下:
address           size  
0x0100            0x10  ; global
0x0110            0x30  ; stack
0x0140      to RAM_END  ; un-used

而不是从RAM最高端倒着往前映射。

使用特权

评论回复
地板
spming|  楼主 | 2007-2-27 08:46 | 只看该作者

谢谢张工和JerryBJ不过还有一个问题

我发现在JL3E里面只有Z_RAM(因为它的RAM总共只有128字节),而没有RAM这一项,这个时候变量是不是就自动在Z_RAM中分配吗?不需要定义
#pragma DATA_SEG SHORT MY_ZEROPAGE      //direct addressing data segment
byte hour, minute, second, year, month, day;


利用一个定时器的两个通道的输出比较功能能不能产生两个频率不同的脉冲信号?

使用特权

评论回复
5
spming|  楼主 | 2007-2-27 08:57 | 只看该作者

small和tiny模式

张工:在small模式下缺省的变量默认的被放在RAM下,在什么模式下缺省变量默认的放在Z_RAM区?对于同一款MCU我选择tiny和small除了缺省变量的默认方式不同还有什么区别?

使用特权

评论回复
6
JerryBJ| | 2007-2-27 09:02 | 只看该作者

对的

对于JL3,所有的变量,栈都在仅有的direct page RAM中映射。

可以。只要设置不同的TCHx值就可以了。

使用特权

评论回复
7
mc9s08aw60| | 2007-2-27 09:15 | 只看该作者

small和tiny在那些方面不同呢?

是RAM分配吗?

使用特权

评论回复
8
JerryBJ| | 2007-2-27 09:59 | 只看该作者

我没有QQ,呵呵

有MSN,不过也经常不在线。sad_shylion@hotmail.com。

Small和Tiny的区别其实就是RAM的分配。Small把全局变量和栈(局部变量)都放在0页以上,而tiny则相反。
还有一点区别特别值得注意:在Tiny模式下,指针的长度默认为8bit。在Small模式下,指针长度默认为16bit。 

使用特权

评论回复
9
spming|  楼主 | 2007-2-27 11:13 | 只看该作者

大家看看

利用一个定时器的两个通道的输出比较功能能不能产生两个频率不同的脉冲信号?


Jerry你能告诉我为什么可以吗?我觉得好像不行呀,定时器只有一个通道的只不过是和定时器的值在比较但我的值当它的值和定时器的值一致的时候执行动作,但是它的频率是不好改变的(换句话说两个通道的频率取决于定时器的频率)。

使用特权

评论回复
10
mc9s08aw60| | 2007-2-27 11:18 | 只看该作者

JerryBJ是不是以前经常上C51BBS???

在C51BBS上看到过。

使用特权

评论回复
11
张明峰| | 2007-2-27 15:51 | 只看该作者

谢谢Jerry的指正

所有变量区间之外全部是堆栈空间。

使用特权

评论回复
12
sillboy| | 2007-3-13 13:23 | 只看该作者

学习了

使用特权

评论回复
13
totty.ning| | 2007-3-17 13:39 | 只看该作者

堆栈地址默认是从$0ff开始,在程序中自己可以另外设定栈底

使用特权

评论回复
14
yongtree| | 2007-3-21 23:32 | 只看该作者

长见识了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

36

帖子

1

粉丝