我正在使用atmega328的AVR控制器。我需要检查两位的状态。我有两种方法,但不确定哪种方法最有效。在下面的代码的第一种情况下,我将使用PIND命令读取端口两次(两次进行PIND访问)。所以这是一个问题,还是我不得不考虑第二个if语句?
#define SW1 2
#define SW2 5
//check if both are high
if((PIND&(1<<SW1))&&(PIND&(1<<SW2)))
//Or
if((PIND&((1<<SW1)|(1<<SW2)))==((1<<SW1)|(1<<SW2)))
Run Code Online (Sandbox Code Playgroud)
我想PIND是一个外设寄存器(“命令”是什么意思?)。
第一次检查将读取一次或两次,具体取决于第一次比较。如果SW1在第一次读取和第二次读取之间发生变化,则可能会产生故障。
假定软件?是开关:通常,最好一次读取一次此类寄存器(可能是变量)并测试这些位。确保你得到所有输入位的快照在同一时间。
另外,seconde版本不一定会慢一些,因为它可以保护分支(IIRC AVR除了分支/跳转外没有其他条件指令)。