我正在考虑一种实现阈值检查的有效方法(具有可选的滞后和延迟)。

要求/情况:

我想检查例如相对于上阈值和下阈值的非负值(例如绝对压力)分别导致过压误差位或负压误差位。将有多个设置和重置阈值。 (我想组织一个数组)

考虑到磁滞,应设置和重置不同的状态:
例如对于过压情况,设置的压力阈值p_set(设置错误位)和重置阈值p_reset <= p_set
同样适用于不定压力,但此处为p_reset >= p_set,这会使比较运算符求反:

// Over pressure detection
if (pressure > overPressureSetThld){
  // Over pressure -> set error bit
else if (pressure < overPressureResetThld){
  // Reset over pressure error bit
}

// Under pressure detection
if (pressure < underPressureSetThld){              // Inverted comparison operator
  // Under pressure -> set error bit
else if (pressure > underPressureResetThld){       // Inverted comparison operator
  // Reset under pressure error bit


备择方案:

考虑到这一点,我看到了两种选择:


像上面一样向前实现->更大的代码大小/“重复”代码(尤其是考虑到延迟)
比较相对值(减法和绝对值,需要一个参考压力)->减少代码大小,因为仅需要一个if-elseif,但运行时负载更高
例如。:

if (abs(pressure - REFRENCE_PRESSURE) > relSetThld){ // Threshold relative to reference and positive // Set over/under pressure error bitelse if (abs(pressure - REFRENCE_PRESSURE) < relResetThld){ // Threshold relative to reference and positive // Reset over/under pressure error bit


题:

我倾向于使用替代2,但是我问自己(和您)是否有更好的方法来做到这一点。
建议欢迎!

最好
克里斯多夫

最佳答案

考虑到执行速度,实现诸如检查几个级别的东西的最有效方法是在各个级别中形成“二进制搜索” / BST。实际上这意味着编写if-else链:

if(val < level_mid)
  if(val < level_low)
    // ...
  else
    // ...
else
  if(val < level_high)
    // ...
  else
    // ...


在性能和分支方面,您无法真正超越以上条件。在可读性/可维护性方面,最佳代码应如下所示:

if(val < level_lowest)
  // ...
else if(val < level_low)
  // ...
else if(val < level_mid)
  // ...
else if(val < level_high)
  // ...


该代码也相当有效,但是比“二进制搜索”替代方案更具可读性/可维护性。与往常一样,拆卸并亲自观察。

但是,当然,在不考虑特定系统的情况下手动优化代码不是很明智。例如,假设您使用的是8位或16位CPU。在这种情况下,与性能有关的只是所涉及的整数类型的大小。同样,在没有FPU的MCU上使用浮点类型将导致代码效率极低。

如果要优化代码大小,则应该关注与分支数量完全不同的方面。摆脱肿的库调用是第一要务(我在看着你,stdio.h)。

仅仅为了减小代码大小而做诸如获取绝对值之类的事情是没有意义的-显然不会减小代码大小。但是,它肯定会增加复杂性。反过来,这往往会导致更大的代码和更多的错误。应用KISS principle

关于c - 嵌入式C中绝对值的有效阈值检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58130031/

10-13 08:46