【发布时间】:2015-06-25 15:37:18
【问题描述】:
我正在使用 AVR 控制器 atmega328。 我需要检查两位的状态。我有两种方法,但不确定哪一种最有效。在下面代码的第一种情况下,我使用 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)))
【问题讨论】:
-
请注意这两种情况下的程序内存是相同的。我在 Atmel Studio 中检查了输出
-
你的两个预处理器都是
SW1,它不会给你预期的结果 -
抱歉,应该是 SW2。没有注意到错误。谢谢你把它拿出来。更正它。
-
为什么担心这个操作的效率?无论哪种方式,它应该只有大约 4-6 条指令。如果这个速度会影响或破坏您的整体系统性能,那么您做错了什么......
-
如果存在差异,我也怀疑这是由于两次读取外围设备,我预计这比 ram 读取的周期更长。假设两个读取一个需要更多指令,那么闪存的速度有多慢(获取)。我认为总体而言,后者需要更少的指令和更少的时间......尽管尝试每个循环 100000 次,看看哪个需要更长的时间,而不是一个万无一失的测试,但可能会倾向于其中一个。跨度>