我用的是51,型号是80c32,外挂的rom和ram和can总线。
我在main函数里执行了一下某段初始化函数,在定时器中断里也执行了该段函数,如下:
init()//初始化函数
{
................
addr = addr_reg1;
*addr = 0x06;
................
}
timer1_isr() interrupt3 using2
{
init();//中断里运行
}
main()
{
init();//首次运行
while(1)
{
.........
}
}
硬件跑,出错,发现我指定的给某地址赋值06,结果是另一个变量变成了06了。
然后我用keil,软件仿了一下,也同样出错。
我用反汇编,单步调试,后来追查到,另一个被错赋值的变量,是在中断里被赋值的。
单片机有4组r0-r7,发现编译器在主程序中用的是第0组r0-r7(using0),在进入定时器中断时,确实是用我指定的第2组
(using0)。
但赋值出错的那几条语句,它读取的是固定的0x06地址的值(即第0组的r6),而不是用我指定的第2组的寄存器,使得指向地
址出错,导致0x06被赋值到其他地址上去了。
具体的错误语句是 MOV R4,0x06,0x06是第0组寄存器的R6地址;如果是生成 MOV R4,R6就不会有错,采用的是第2组
(using2)的寄存器。
我把定时器中断指定的using2字眼去掉,发现编译器自动分配了采用第0组寄存器去处理中断,这样就没出错了。但是,给定
时器指定using1,using2,using3都出错。都生成了MOV R4,0x06这一句汇编。
请教高手,何解?
一周热门 更多>