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

[复制链接]
4821|14
 楼主| spming 发表于 2007-2-26 09:14 | 显示全部楼层 |阅读模式
1.我现在在使用MC68HC908JL8这款MCU现在我发现我的变量大于大概50个字节的时候编译是没有问题但是连接就不通过。<br />我后来在PRM文件中把RAM的地址修改了一下:<br />默认&nbsp;Z_RAM&nbsp;&nbsp;&nbsp;0x60-0xff<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x100-0x15F<br />我修改后&nbsp;&nbsp;Z_RAM&nbsp;&nbsp;&nbsp;0x60-0xff<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xb0-0x15F<br />这个时候我的连接就没有问题了,现在我想知道这样修改是不是可以的,可以的话这是为什么(也就是Z_RAM&nbsp;和RAM的区别&nbsp;)?&nbsp;&nbsp;<br />2.我想用内部的RC振荡怎么操作?<br />3.堆栈是从哪里开始的?可不可以改变堆栈的初始地址怎么改变呢?
张明峰 发表于 2007-2-26 16:05 | 显示全部楼层

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

Z_RAM和RAM肯定是有区别的,他们的地址分配一般不能重叠。象上面的改法,这两个区域在0xb0-0xff间就重叠了,很容易出问题。<br /><br />你的这个问题原因是没有充分利用0x00-0xffRAM空间。在small项目模式下,缺省变量都被放在RAM区。如果要将变量放到Z_RAM区,必须在定义前特别声明,例如:<br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;direct&nbsp;addressing&nbsp;area<br />//&nbsp;for&nbsp;fast&nbsp;access&nbsp;(address&nbsp;&lt&nbsp;0x100)<br />//==============================================================<br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;MY_ZEROPAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//direct&nbsp;addressing&nbsp;data&nbsp;segment<br />byte&nbsp;hour,&nbsp;minute,&nbsp;second,&nbsp;year,&nbsp;month,&nbsp;day;<br /><br />普通RAM区的变量声明如下:<br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;common&nbsp;data&nbsp;area<br />//&nbsp;(address&nbsp;&gt=&nbsp;0x100)<br />//==============================================================<br />#pragma&nbsp;DATA_SEG&nbsp;DEFALUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;data&nbsp;segment<br />volatile&nbsp;byte&nbsp;tempBuff[16];<br /><br />JL8只能运行在外部晶体振荡或外部RC振荡,不能运行在内部RC振荡模式下。其片内RC振荡时钟源只针对看门狗COP和SIM模块,不能拿来做程序运行的时钟源。<br /><br />堆栈的长度可以自由修改,在PRM文件中有一行“STACKSIZE&nbsp;0x??”,其中的??代表堆栈长度,按实际需要用户可以随意修改。堆栈具体的位置将被在内存RAM的最高端。
JerryBJ 发表于 2007-2-26 19:19 | 显示全部楼层

一点补充

“堆栈具体的位置将被在内存RAM的最高端。”<br /><br />——据我观察,栈的安排是这样的,从RAM_START开始,首先安排全局变量和静态变量,紧接着就是栈空间了。比如在small模式下,RAM的起始地址RAM_START=0x0100,程序中有16个全局变量,STACK_SIZE=0x30,则内存映射如下:<br />address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;<br />0x0100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10&nbsp;&nbsp;;&nbsp;global<br />0x0110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x30&nbsp;&nbsp;;&nbsp;stack<br />0x0140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;RAM_END&nbsp;&nbsp;;&nbsp;un-used<br /><br />而不是从RAM最高端倒着往前映射。<br />
 楼主| spming 发表于 2007-2-27 08:46 | 显示全部楼层

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

我发现在JL3E里面只有Z_RAM(因为它的RAM总共只有128字节),而没有RAM这一项,这个时候变量是不是就自动在Z_RAM中分配吗?不需要定义<br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;MY_ZEROPAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//direct&nbsp;addressing&nbsp;data&nbsp;segment<br />byte&nbsp;hour,&nbsp;minute,&nbsp;second,&nbsp;year,&nbsp;month,&nbsp;day;<br /><br /><br />利用一个定时器的两个通道的输出比较功能能不能产生两个频率不同的脉冲信号?<br /><br />
 楼主| spming 发表于 2007-2-27 08:57 | 显示全部楼层

small和tiny模式

张工:在small模式下缺省的变量默认的被放在RAM下,在什么模式下缺省变量默认的放在Z_RAM区?对于同一款MCU我选择tiny和small除了缺省变量的默认方式不同还有什么区别?<br />
JerryBJ 发表于 2007-2-27 09:02 | 显示全部楼层

对的

对于JL3,所有的变量,栈都在仅有的direct&nbsp;page&nbsp;RAM中映射。<br /><br />可以。只要设置不同的TCHx值就可以了。
mc9s08aw60 发表于 2007-2-27 09:15 | 显示全部楼层

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

是RAM分配吗?
JerryBJ 发表于 2007-2-27 09:59 | 显示全部楼层

我没有QQ,呵呵

有MSN,不过也经常不在线。sad_shylion@hotmail.com。<br /><br />Small和Tiny的区别其实就是RAM的分配。Small把全局变量和栈(局部变量)都放在0页以上,而tiny则相反。<br />还有一点区别特别值得注意:在Tiny模式下,指针的长度默认为8bit。在Small模式下,指针长度默认为16bit。&nbsp;
 楼主| spming 发表于 2007-2-27 11:13 | 显示全部楼层

大家看看

利用一个定时器的两个通道的输出比较功能能不能产生两个频率不同的脉冲信号?<br /><br /><br />Jerry你能告诉我为什么可以吗?我觉得好像不行呀,定时器只有一个通道的只不过是和定时器的值在比较但我的值当它的值和定时器的值一致的时候执行动作,但是它的频率是不好改变的(换句话说两个通道的频率取决于定时器的频率)。<br />
mc9s08aw60 发表于 2007-2-27 11:18 | 显示全部楼层

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

在C51BBS上看到过。
张明峰 发表于 2007-2-27 15:51 | 显示全部楼层

谢谢Jerry的指正

所有变量区间之外全部是堆栈空间。
sillboy 发表于 2007-3-13 13:23 | 显示全部楼层

学习了

  
totty.ning 发表于 2007-3-17 13:39 | 显示全部楼层

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

  
yongtree 发表于 2007-3-21 23:32 | 显示全部楼层

长见识了

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

36

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部