我们正在读取一些引脚的信号,并根据这些读数设置更多的事件。
为了保险起见,我想对引脚进行3次采样,比较这三个值并使用最常见的值(例如,如果样本A是1,B是3和C是1,则我想使用1;如果A、B和C都是2,则使用2,但如果A是1,B是2和C是3,则我想再次获取三个样本)。
目前我正在使用:
为了保险起见,我想对引脚进行3次采样,比较这三个值并使用最常见的值(例如,如果样本A是1,B是3和C是1,则我想使用1;如果A、B和C都是2,则使用2,但如果A是1,B是2和C是3,则我想再次获取三个样本)。
目前我正在使用:
int getCAPValues (void)
{
// Get three samples to check CAP signals are stable:
uint32_t x = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // First set of CAP values
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t y = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // second set
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t z = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // third set
if (x == y) || (x == z)
{
//use the x value
}
else if (y == z)
{
// use the y value
x = y;
}
else
{
x = -1;
}
return x;
}
但是这种方法似乎不太高效,有更好的方法吗?
这是在C语言中使用SAMD21 Xplained Pro开发板时的情况。
编辑:
根据答案,我已经改变了代码,只有在需要读取“z”值时才会读取,并使用delay_us()代替虚假循环:
int getCAPValues (void)
{
// Get three samples to check CAP signals are stable:
uint32_t x = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // First set of CAP values
delay_us(1);
//for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t y = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // second set
// Using most common value, or error code of -1 if all different
if (!(x == y))
{
delay_us(1);
//for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t z = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // third set
if (x == z)
{
// use the x/z value
return x;
}
else if (y == z)
{
// use the y/z value
return y;
}
else
{
return -1;
}
}
return x;
}
for (uint32_t i = 0; i < 7; i++) dummy = i;
优化掉,因为它是一个无操作。建议使用 sleep 替代。 - Bathshebax == y
,测试z
就没有意义了,但除此之外,它看起来对我来说相当优化。也许 OP 希望函数在每次迭代中大致花费相同的时间。不过,你需要修复那个“延迟”循环。 - Bathsheba