【问题标题】:Efficient bit checking in embedded C Program嵌入式 C 程序中的高效位检查
【发布时间】: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 次,看看哪个需要更长的时间,而不是一个万无一失的测试,但可能会倾向于其中一个。跨度>

标签: embedded avr


【解决方案1】:

我想PIND 是一个外围寄存器(“命令”是什么意思?)。

第一次检查将读取一次或两次,具体取决于第一次比较。如果 SW1 在第一次和第二次读取之间发生变化,这可能会产生故障。

假定 SW?是开关:通常,最好读取一次这样的寄存器(可能读取变量)并测试位。这可确保您同时获得所有输入位的快照。

此外,第二个版本不一定慢,因为它可以保护分支(IIRC AVR 除了分支/跳转之外没有条件指令)。

【讨论】:

  • switches: [reading such once] ensures you get a snapshot of all input bits at the same time - 防止“开关更改危险”。如果您要软件去弹跳(例如,使用按钮),请先执行。
  • 1. debounce 2. 将价值放在其他地方进行操纵 - 在选定的时间段内稳定之前不要一遍又一遍地评估某些复杂的条件。
  • @greybeard:对问题发表评论即可;它不符合我的回答,因为我什至没有在这里进行去抖动(但可能是对 OP 的一个很好的说明)。您仍然必须并行读取所有输入并将两个开关一起去抖动(即使用死区时间,如果任何输入发生变化,它会重新启动)。但是,上面的代码可能不需要去抖动,例如从配置开关重置后读取标志(无弹跳)。仍然高度投机。
【解决方案2】:

第一次读取 PIND 两次,因此效率较低且可能出错 - 如果中断或线程上下文切换干预,读取之间的时间可能很长。

第二个计算(1&lt;&lt;SW1)|(1&lt;&lt;SW2) 两次,但在这种情况下它是一个编译时间常数,所以应该不会影响性能。但老实说,您可能正在为这个级别的代码担心太多的小事情而烦恼。如果你真的需要知道;查看编译器生成的代码(在调试器反汇编中或通过让编译器输出汇编列表),但如果您打算像这样对每一行进行二次猜测,则编写代码将花费很长时间,

【讨论】:

    【解决方案3】:

    如果没有汇编器的输出,很难说以上 2 个中哪一个会更高效。不过我猜性能上的差异会很小。

    在情况 2 中,您避免读取寄存器两次,但您正在执行 2 个额外的操作。

    如果我猜测一下,我会说选项 1 很可能会更快,因为 PIND 是 AVR 注册器,而且阅读成本会更低。

    话虽如此,我还是建议使用第一个选项,因为它的可读性更高,即使没有发现它比选项 2 更快。

    【讨论】:

    • 一点也不难说。端口寄存器是易失的,因此在同一个表达式中读取它们两次是一个坏主意。在第二种情况下,一切都在端口读取之前在编译时进行评估。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多