请问下C51是怎么分配工作寄存器区的,网上大部分都说0号寄存器区给了main函数,其余的是可以供给中断函数调用的,可是我的程序3个中断函数,1个是计时器,用了1号寄存器区,另外2个是外中断,分别用了2号、3号寄存器区,结果程序上芯片后就出错,计时器没事,一旦用了外中断立马出错,而且一旦我把2个外中断都去掉指定寄存器区设置而改用默认堆栈,立马就好了,为什么啊?重新整理下,我使用3个中断,计时器using 1,另外2个外中断用了using 2和using 3,结果运行中外中断出错。想一起探讨C51的同志也可以发消息给我大家一起学习,求高手回答&讨论,谢谢啊~~~
亲,如果不用using语句,那么就不会去调用空闲工作寄存器组,而用堆栈来保护当前现场然后重用当前工作寄存器,这样会使得8051单片机有限的RAM空间更加吃紧,我就是想问C51的编译方式main函数到底会用掉几个工作寄存器组,要是用汇编我就不这么纠结直接用了啊。。。。。
追答由 KEIL 编译系统来管理存储器空间,比编程者自己管理,肯定要合理的多。
程序着编译之后,它会提示使用了多少字节的各种的空间。
使用了 KEIL 编译软件,就要相信这个软件的智能水平。
它们的开发团队,可不是吃素的。
KEIL 编译软件,会协调使用工作寄存器、位寻址空间和寄存器间接寻址空间。
如果,编程者,非要强制的指定某部分空间用于某段程序,那么,
在执行其它程序时,这部分空间,显然就闲置了,这显然会造成空间更加吃紧。
如果要想自己管理存储空间,使用C语言来编程就是南辕北辙。
我刚才勉强算是看了一点汇编,确实使用工作寄存器会抢占8个字节的低地址RAM,但是使用了工作寄存器来为当前中断服务可以在中断函数调用时少进行好几次堆栈操作(保护、恢复主函数现场),在我浏览的C51转汇编中,RAM的低地址00H-1FH申明了4个工作寄存器,然后是正常的RAM,堆栈距离工作寄存器有一段距离(中间是几个不痛不痒的数组,顶多LED出乱码不会死机),应该不是堆栈的过限导致的程序状态错误,那么错误的根源到底是哪里?
追答对硬件、汇编尚不很了解,就使用 using 2 和 using 3 来干扰编译软件,这就是错误的根源。
水平,是需要逐步提高的,不要操之过急。