这两天在调试一个项目的时候,一台主机与两台从机通信,但是有一台从机的报文收不到,仔细阅读代码,发现寄存器等配置都正常,自信阅读代码发现在清接收完成寄存器的时候用到了位域,猜想这就是问题所在,于是修改了程序,下载后一切正常。在单片机中一般的标志寄存器都是写1清0,好多中断标志等都是这样设计的,这时候就要注意在清除标志的时候不能用位域,因为好多单片机不不支持位操作的。
比如要清除IrqReg寄存器的BIT5,IrqReg.bit5 = 1;在没有位操作的单片机中会编译成
IrqReg |= BIT5;这条语句分三步执行,先读IrqReg寄存器,进行位或操作,最后把位或的结果写入该寄存器,这样问题就产生了,如果这句操作之前IrqReg中BIT5和BIT6都是置位的,那么写的时候本来是清除BIT5的现在BIT6也清除了,正确的操作应该是IrqReg=BIT5
这个问题在最开始学习AVR单片机的时候在AVR的技术手册中看到过,所以这次解决这个问题没有费太大的周折,要不然真是很难想到这里会出问题。