[ZLG-ARM] 堆栈大小的设置

[复制链接]
3946|6
 楼主| xiuzhou 发表于 2008-1-16 16:59 | 显示全部楼层 |阅读模式
模板中设置向量中断堆栈大小为256<br />即:IRQ_STACK_LEGTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256<br />但是为什么我将其大小变为零,即:IRQ_STACK_LEGTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />也照样可以运行程序?程序中通过SPI中断收发数据。谢谢!
zlgarm 发表于 2008-1-17 08:44 | 显示全部楼层

xiuzhou,您好!

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已记录您的问题,我将将在2007年1月17日9:20之前,给出详尽答复,感谢您对广州周立功单片机发展有限公司的支持!<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;&nbsp;&nbsp;zlgarm_zxm
zlgarm 发表于 2008-1-17 09:08 | 显示全部楼层

xiuzhou,您好!

中断堆栈大小与能否进入中断是没有关系的,而是与中断程序切换需要保存的数据大小有关系的。你可以把中断服务程序写大一些,或者中断中调用其他函数试试,看看您的程序还能否正常运行。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_zxm
 楼主| xiuzhou 发表于 2008-1-17 10:34 | 显示全部楼层

zlgarm_zxm你好!

既然中断堆栈是为进入中断后局部变量和函数调用开辟的存储区,那如果将堆栈大小设为0,进入中断后也不可能进行其他处理。哪怕我只定义一个局部变量或调用一个函数,中断处理也不可能发生。例如:<br />void&nbsp;f1(void);<br /><br />void&nbsp;__irq&nbsp;SSP_IRQ(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;ch;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f1();<br />}<br />我按照你的方法,IRQ_STACK_LEGTH&nbsp;&nbsp;EQU&nbsp;&nbsp;0,在中断处理函数中调用了5个函数,增加了几个数组,仍然能够正常运行,好像跟堆栈大小没有关系。<br />怀疑是不是如果在IRQ_STACK_LEGTH&nbsp;&nbsp;EQU&nbsp;&nbsp;0的条件下,还有其他程序自动设置中断堆栈的大小?
zlgarm 发表于 2008-1-17 12:44 | 显示全部楼层

xiuzhou,您好!

当堆栈设置为0时,说明提供给IRQ堆栈专门使用的空间是0。但是当IRQ堆栈使用的空间没有被其他程序或数据使用时,程序还是可以正常运行的。而如果被其他程序或数据使用时,那么就可能会导致程序运行不正常。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;&nbsp;&nbsp;zlgarm_zxm
 楼主| xiuzhou 发表于 2008-1-17 14:37 | 显示全部楼层

zlgarm_zxm你好!

通过试验验证有以下结论,如有错误,万望各位指出:<br />在Startup.s中有<br />&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;&nbsp;&nbsp;&nbsp;Stacks,&nbsp;DATA,&nbsp;NOINIT<br />StackUsr&nbsp;&nbsp;&nbsp;<br />在mem_c.scf中有<br />STACKS&nbsp;0x40008000&nbsp;UNINIT&nbsp;&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Startup.o&nbsp;(Stacks)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />上面两段实际是将分配给RW,ZI和Heap后剩余的RAM全部设置为堆栈(Stacks)。<br />若IRQ专门使用的堆栈大小不足时,系统自动将Stacks作为堆栈使用。即使IRQ专门使用的堆栈为0,只要Stacks容量足够大,程序就可以正常运行。<br />若IRQ专门使用的堆栈+Stacks的总量小于IRQ实际需要的内存大小,程序就会出问题。<br />例如我的IRQ中断实际需要的堆栈大小约为1.5K,但是定义的IRQ专门堆栈为256*4=1K,以前程序运行正常是因为我的32K&nbsp;RAM只用了30K,余量足够大,IRQ实际可以使用的堆栈有1K+2k=3K。如果不满足1K+RAM余量&gt=1.5K,就会出错。<br />但是还有一个问题,应该按照什么原则来估算专用堆栈的大小呢?
zlgarm 发表于 2008-1-17 17:43 | 显示全部楼层

堆栈

xiuzhou&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;堆栈的大小与程序的变量和算法有直接关系。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_ljt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

33

帖子

1

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