将输入值存储在结构中以便以后进行最快的比较

时间:2014-07-21 07:49:25

标签: c embedded pic microprocessors

我正在对8个输入端口进行采样,并将这些值每秒进行十次比较。

这些输入将针对类似字段进行异或,指示哪些信号设置为“低电平有效”,然后进行AND操作以屏蔽不会被比较的输入信号(尽管所有信号都被采样,是否比较与否。)

所以这是抽样的一个例子。我创建了一个结构,信号将被存储,然后保存在内存中。此结构包含许多其他值,因此无法替换整个结构。无论如何,这些输入值需要以有效的方式保存,以便稍后我可以使用我的掩码执行快速XOR和AND操作。

void SampleData(){
   // These are not all values o be sampled, only inputs
   currentSample.i0       = RD13_bit;
   currentSample.i1       = RD12;
   currentSample.i2       = RD11;
   currentSample.i3       = RD10;
   currentSample.i4       = RE12;
   currentSample.i5       = RE13;
   currentSample.i6       = RF8;
   currentSample.i7       = RF9;
}

这是我需要比较的一个例子

checkInputSignals(){
  activated = ((inputValues ^ activeLowInputs) & activeInputsMask);  

  if(activated ){
    importantMethod();
  }

 }

我尝试了一个位域,但是我无法让操作员工作,而且我不了解使用位域的效率。这个项目的效率不是关注记忆,而是速度和舒适度。我应该如何存储我的三个字段?如果有帮助,我使用的是dsPic33EP微处理器。

如果使用'char'或'uint_8',我的示例方法看起来像这样,对吧?这似乎不是最优雅的解决方案。

    unsigned char inputValues;

    void SampleData(){
       currentSample.i0       = RD13_bit;
       currentSample.i1       = RD12;
       currentSample.i2       = RD11;
       currentSample.i3       = RD10;
       currentSample.i4       = RE12;
       currentSample.i5       = RE13;
       currentSample.i6       = RF8;
       currentSample.i7       = RF9;
       // For the masking
       inputValues += currentSample.i7;
       inputValues  = (inputValues << 1) + currentSample.i6;
       inputValues  = (inputValues << 1) + currentSample.i5;
       inputValues  = (inputValues << 1) + currentSample.i4;
       inputValues  = (inputValues << 1) + currentSample.i3;
       inputValues  = (inputValues << 1) + currentSample.i2;
       inputValues  = (inputValues << 1) + currentSample.i1;
       inputValues  = (inputValues << 1) + currentSample.i0;
    }

例如,我必须为我的面具做同样的事情。

void ConfigureActiveLowInputs(){
  activeLowInputs += currentCalibration->I0_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I1_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I2_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I3_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I4_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I5_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I6_activeLow;
  activeLowInputs  = (activeLowInputs << 1) + currentCalibration->I7_activeLow;
}

必须有一个比位移更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我认为你需要了解的一些事情。

  1. 不要使用位字段。除了不便携之外,它们使这种苦涩更难,更容易。
  2. 不要使用运行时轮班。让编译器完成你的工作。
  3. 阅读代码,学习和练习。学习苦苦挣扎可能很难,而且从你的代码中我不认为你还在那里。
  4. 如果我们要提供帮助,我们需要了解一些事情。

    • 你提到8个端口。它们是单比特端口,还是具有多个比特的单个端口?
    • 你提到3个字段。它们是什么?
    • 您的示例代码使用+运算符,这些运算符在位操作中很少使用。为什么?

    在C代码中,代码通常最终会有一组宏和定义,以及一些小函数。它非常简单,生成良好的代码,并且无需太多努力即可快速运行。如果我们只知道你想要做什么。

答案 1 :(得分:2)

您似乎将单个位存储为单独的结构成员,然后将它们包装到动态的单词中以便能够应用掩码;但将它们打包成一个单词可能更有效,并在必要时使用掩码访问各个位。

成员i0i1等可能是不必要的。将位直接打包到uint8_t成员,然后编写函数或宏以在必要时返回单个位将更简单。

uint8_t void SampleData()
{
    return (RD13_bit << 7 ) |
           (RD12 << 6) |
           (RD11 << 5) |
           (RD10 << 4) |
           (RE12 << 3) |
           (RE13 << 2) |
           (RF8 << 1) |
           RF9 ;
}

然后:

currentSample.i = SampleData() ;

然后你可以直接对它应用蒙版。如果您需要访问单个位(如果不需要,为什么在第一种情况下再单独成员?),例如:

#include <stdbool.h>
#define GETBIT( word, bit ) (((word) & (1<<bit) != 0)


bool i6 = GETBIT( currentSample.i, 6 ) ;