STC89C52工作寄存器区,事后高分悬赏,不懂的乱刷的我会举报,要是都不能解答,答案靠谱的我也选择满意

请问下C51是怎么分配工作寄存器区的,网上大部分都说0号寄存器区给了main函数,其余的是可以供给中断函数调用的,可是我的程序3个中断函数,1个是计时器,用了1号寄存器区,另外2个是外中断,分别用了2号、3号寄存器区,结果程序上芯片后就出错,计时器没事,一旦用了外中断立马出错,而且一旦我把2个外中断都去掉指定寄存器区设置而改用默认堆栈,立马就好了,为什么啊?重新整理下,我使用3个中断,计时器using 1,另外2个外中断用了using 2和using 3,结果运行中外中断出错。想一起探讨C51的同志也可以发消息给我大家一起学习,求高手回答&讨论,谢谢啊~~~

0号工作寄存器区其实C51已经分配给了main函数使用,保存了main函数的工作状态寄存器,而中间调用的函数比如Delay或者其它函数调用了using 1的通用寄存器组,也就是说C51编译器自己管理了,如果使用using 0 using 1将导致工作寄存器组被重写,中断函数返回后使用了中断函数的工作状态寄存器,结果就是死机,对于栈,其实C51对于与人交互的程序反应速度已经够了,入栈出栈对人机交互没有影响,而对于要求速度较高的应用,如示波、私服电机控制,可以选用STM32或者其他ARM内核的MCU,毕竟51单片机的内核对于数据的处理现在的数据已经不够了,8位的字处理能力以及内存管理能力只能应付简单的外设需求。而ARM内核的微控制器内存寻址能力大大提高(32位),此外ARM的内核外围设计由制造商自己定制,集成了硬件中断处理能力(不再是软件查找中断向量表而是硬件选择电路)另外还包含了DMA控制器,能够做到一边替换内存的同时内存其它地方的程序正常执行,所以对于C51的编程,无需担心中断响应速度,直接交付给堆栈压栈出栈就行了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-20
C语言是高级语言,并不用编程者关心存储器,编译系统自然会管理的。
如果,非要强行对存储器方面的硬件进行管理,编译系统,却未必会认真的听从命令。

楼主提出的为什么,只能从汇编语言的层次来寻找答案。

keil 软件,可以看到C程序的汇编语言以及机器码,看懂了这些,问题就没了。追问

亲,如果不用using语句,那么就不会去调用空闲工作寄存器组,而用堆栈来保护当前现场然后重用当前工作寄存器,这样会使得8051单片机有限的RAM空间更加吃紧,我就是想问C51的编译方式main函数到底会用掉几个工作寄存器组,要是用汇编我就不这么纠结直接用了啊。。。。。

追答

由 KEIL 编译系统来管理存储器空间,比编程者自己管理,肯定要合理的多。
程序着编译之后,它会提示使用了多少字节的各种的空间。

使用了 KEIL 编译软件,就要相信这个软件的智能水平。
它们的开发团队,可不是吃素的。

KEIL 编译软件,会协调使用工作寄存器、位寻址空间和寄存器间接寻址空间。

如果,编程者,非要强制的指定某部分空间用于某段程序,那么,
在执行其它程序时,这部分空间,显然就闲置了,这显然会造成空间更加吃紧。

如果要想自己管理存储空间,使用C语言来编程就是南辕北辙。

追问

我刚才勉强算是看了一点汇编,确实使用工作寄存器会抢占8个字节的低地址RAM,但是使用了工作寄存器来为当前中断服务可以在中断函数调用时少进行好几次堆栈操作(保护、恢复主函数现场),在我浏览的C51转汇编中,RAM的低地址00H-1FH申明了4个工作寄存器,然后是正常的RAM,堆栈距离工作寄存器有一段距离(中间是几个不痛不痒的数组,顶多LED出乱码不会死机),应该不是堆栈的过限导致的程序状态错误,那么错误的根源到底是哪里?

追答

对硬件、汇编尚不很了解,就使用 using 2 和 using 3 来干扰编译软件,这就是错误的根源。

水平,是需要逐步提高的,不要操之过急。

相似回答