gpt4 book ai didi

c - 嵌入式 C 中绝对值的有效阈值检查

转载 作者:行者123 更新时间:2023-12-03 03:30:44 25 4
gpt4 key购买 nike

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

要求/情况:

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

考虑到迟滞,应有不同的设置和复位值:例如对于过压情况,设定压力阈值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

替代方案:

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

  1. 像上面一样直接实现 -> 更大的代码大小/“重复”代码(特别是考虑到延迟)
  2. 比较相对值(减法和abs,需要引用压力)->减少代码大小,因为只需要一个if-elseif,但运行时负载更高例如:

    if (abs(pressure - REFRENCE_PRESSURE) > relSetThld){ // Threshold relative to reference and positive
    // Set over/under pressure error bit
    else 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com