1、是的,但是必须打开总中断EA和定时器0中断ET0(即给中断寄存器赋值为0x82H),编写中断程序是需要从中断入口进入的,定时器0的中断入口地址是0x000B,可以在这个地址加一个跳转到你的中断服务程序。
2、定时器0的溢出标志是TF0,定时器1的溢出标志是TF1,你现在用的是中断方式,需要在中断服务程序结束之前,加上一句CLR
TF0即可,若你想不采用中断,需要等待查询该溢出标志,当为1时,再清零,就是你说的JBC了。
3、是的。他们是独立的,否则,单片机就不能做事了。单片机堆栈溢出后会根据其位置会对运行产生不同程度的影响,或者进入死循环,或者出现不可预料的结果,如果没有开看门狗的话,复位的可能性较小。
一、如果栈顶设置在低位,比如二FH,预想堆栈空间比如一陆个字节,如果溢出,那么如果四0H开始被用户在使用的话,可能改变用户寄存器的值,这个影响是双方面的,一是改变了用户的运行结果,二是,当堆栈保存的是子程序地址的话,将出现不可预料的结果,执行完后将回不去了。
二、如果栈顶设置在高位,比如陆FH,如果溢出的话,那么后面压入堆栈的值将保存在一个虚拟的空间中,也就是吧0H之后的RAM空间,这个RAM空间是不存在的,因此会造成结果不正确,保存的是地址的话,也会无法回到保存位置可以在连接命令文件中指定堆栈尺寸,并且用特定字符串初始化这些区域,比如初始化成"STACK";然后充分运行程序;用内存观察观察堆栈使用情况(“STACK”被冲掉的部分是使用过的栈区),大致可估算使用堆栈的最坏情况。
根据以上分析,可以设置最佳栈区尺寸,如果栈区使用过大,请优化程序:
-子程序中尽量不要开辟新的大尺寸变量;
-程序调用子程序尽量少使用传入的参数,使用全局变量;
-减少程序中switch语句和循环的嵌套。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)