嵌入式C语言中绝对值的有效阈值检查

嵌入式C语言中绝对值的有效阈值检查,c,embedded,threshold,C,Embedded,Threshold,我正在考虑一种实现阈值检查的有效方法(可选滞后和延迟) 要求/情况: 我想对照上阈值和下阈值检查非负值(如绝对压力),分别导致过压错误位或欠压错误位。将有多个设置和重置阈值。(我想组织成一个数组) 考虑到磁滞,应具有不同的设置和重置值: e、 g.对于过压情况,压力设置阈值p_set(设置错误位)和重置阈值p_reset=p_set,这会导致比较运算符反转: // Over pressure detection if (pressure > overPressureSetThld){

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

要求/情况:

我想对照上阈值和下阈值检查非负值(如绝对压力),分别导致过压错误位或欠压错误位。将有多个设置和重置阈值。(我想组织成一个数组)

考虑到磁滞,应具有不同的设置和重置值: e、 g.对于过压情况,压力设置阈值
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
//过压检测
如果(压力>过压设定THLD){
//过压->设置错误位
否则,如果(压力<过压复位THLD){
//复位过压错误位
}
//欠压检测
if(压力<欠压setthld){//反向比较运算符
//欠压->设置错误位
否则,如果(压力>欠压重置thld){//反向比较运算符
//压力下复位错误位
备选方案:

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

  • 像上面那样向前执行->更大的代码大小/“重复”代码(特别是考虑延迟)
  • 比较相对值(减法和abs,需要参考压力)->减少代码大小,因为如果需要elseif,只需要一个,但运行时负载更高 e、 g:

    if(abs(压力-参考压力)>relSetThld){//相对于参考和正的阈值
    //设置过压/欠压错误位
    否则如果(abs(压力-参考压力)

  • 问题:

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

    最好的
    Christoph

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

    if(val < level_mid)
      if(val < level_low)
        // ...
      else
        // ...
    else
      if(val < level_high)
        // ...
      else
        // ...
    
    if(val
    就性能和分支而言,您无法真正击败上述因素。就可读性/维护而言,最佳代码应该是:

    if(val < level_lowest)
      // ...
    else if(val < level_low)
      // ...
    else if(val < level_mid)
      // ...
    else if(val < level_high)
      // ...
    
    if(val
    这段代码也相当有效,但比“二进制搜索”选项可读性/可维护性好得多

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

    如果针对代码大小进行优化,您应该考虑与分支数量完全不同的方面。摆脱臃肿的库调用是第一件事(我在看您,
    stdio.h


    仅仅为了减少代码大小而采取绝对值之类的做法是毫无意义的-它是否会减少代码大小一点也不明显。但是,它肯定会增加复杂性。这反过来又会导致更大的代码和更多的错误。应用。

    代码大小真的那么关键吗?我们正在讨论t+/-20字节或其他。这在99%的应用程序中都不重要。您启用了优化吗?启用更低的优化级别可能会产生比手动优化if语句更大的影响。@Lundin:有点像是,因为可能会有多个阈值加上多个压力。@user694733:您的权利但我想知道的是C代码本身滞后周期意味着保存触发状态,因此您只应用适当的级别比较,而不是对应于非触发状态。好的方面!考虑到二进制搜索,这将不适用于我的情况,因为将有多个阈值,例如过压恢复需要考虑4个独立阈值。范围2的重置阈值可能小于范围1的重置阈值。因此,您建议的级联在这里不起作用。关于接吻,您可能是对的^^^我认为这可能是“过度设计的”结果的差异可能并不显著。我只是好奇。@ElvisIsAlive那么,显然,您需要为范围1和范围2运行不同的代码。或者,如果适用,使用不同参数运行相同的代码。比较只有五种可能的结果。(如果允许中间三个树重叠,则为六种);这两个位只有三种可能的状态。枚举并构造一个操作表(八种可能的结果)[过度设计的?]