我正在对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;
}
必须有一个比位移更好的解决方案吗?
答案 0 :(得分:2)
我认为你需要了解的一些事情。
如果我们要提供帮助,我们需要了解一些事情。
+
运算符,这些运算符在位操作中很少使用。为什么?在C代码中,代码通常最终会有一组宏和定义,以及一些小函数。它非常简单,生成良好的代码,并且无需太多努力即可快速运行。如果我们只知道你想要做什么。
答案 1 :(得分:2)
您似乎将单个位存储为单独的结构成员,然后将它们包装到动态的单词中以便能够应用掩码;但将它们打包成一个单词可能更有效,并在必要时使用掩码访问各个位。
成员i0
,i1
等可能是不必要的。将位直接打包到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 ) ;