我正在使用atmega328的AVR Controller 。
我需要检查两位的状态。我有两种方法,但不确定哪种方法最有效。在下面的代码的第一种情况下,我使用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)))
最佳答案
我认为PIND
是外围寄存器(“命令”是什么意思?)。
第一次检查将读取一次或两次,具体取决于第一次比较。如果SW1在第一次读取和第二次读取之间发生变化,则可能会产生故障。
假设软件?是开关:通常,最好一次读取一次此类寄存器(可能是变量)并测试这些位。这样可以确保您同时获得所有输入位的快照。
另外,seconde版本不一定会慢一些,因为它可以保护分支(IIRC AVR除了分支/跳转外没有其他条件指令)。
关于embedded - 嵌入式C程序中的高效位检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31054819/