我想读取 MCU GPIO 引脚状态并将其重复存储到 10 个数字的数组中。当数组已满时,它应该将值左移并将新值存储到第 [9] 个下标位置并继续。
我如何在 Embedded C 中将其实现为代码?
我想读取 MCU GPIO 引脚状态并将其重复存储到 10 个数字的数组中。当数组已满时,它应该将值左移并将新值存储到第 [9] 个下标位置并继续。
我如何在 Embedded C 中将其实现为代码?
鉴于您每次只存储 1 位,数组并不是唯一的解决方案:
static uint16_t buffer = 0;
void gpio_add(bool pin_value)
{
buffer >>= 1;
if(pin_value) {buffer |= 0x0200;}
}
bool gpio_get_entry(uint8_t index)
{
return !!(buffer & (1 << index));
}
请注意,如果您采用这种方法,您也可以存储 8 或 16 个值。
如果这样做的目的是实现一个简单的去抖动器(即确定引脚电平是否保持稳定一段时间),那么我们可以简单地查看buffer
是零还是 0x3FF。
如果我理解得很好,它应该看起来像这样:
void insert(int* arr, int size, int value){
int i = 0;
for(int i=0; i < size-1; i++){
arr[i] = arr[i+1];
}
arr[size-1] = value;
}
使用大小,您的大小是数组(为您提供 10 个)。你应该用 0 或 -1 来初始化你的数组。但是我不知道 ansi C 和嵌入式 C 之间的区别。也许“for(int i = ;...)”不起作用,您必须在之前创建变量 i。不确定这是否是您想要的。
不确定您所说的“嵌入式 C”到底是什么意思,但我为嵌入式系统编写 C,我会使用类似以下的内容。(该GpioPrint()
功能实际上仅用于(我的)调试。)
#include <stdio.h>
#include <string.h>
// Returns the size of a[].
#define ARRAY_SZ(a) (sizeof a / sizeof a[0])
// Holds MCU-GPIO pin values.
typedef struct
{
unsigned a[10]; // replace unsigned with your 'pin value' type
unsigned n; // values are in a[0..n-1]
} Gpio_t;
// Initialise the pin value store.
static void GpioInit(Gpio_t *gpio)
{
gpio->n = 0;
}
// Add the new value to the pin store, removing the oldest if the store
// is full.
static void GpioAdd(Gpio_t *gpio, unsigned newVal)
{
if (gpio->n < ARRAY_SZ(gpio->a))
{
gpio->a[gpio->n++] = newVal;
}
else
{
memmove(&gpio->a[0], &gpio->a[1], (gpio->n - 1) * sizeof gpio->a[0]);
gpio->a[gpio->n - 1] = newVal;
}
}
// Output the pin store contents.
static void GpioPrint(const Gpio_t *gpio)
{
unsigned i;
for (i = 0; i < gpio->n; i++)
{
printf("%2u: %10u\n", i, gpio->a[i]);
}
}
// Test the functions.
int main(void)
{
Gpio_t gpio;
unsigned newVal;
GpioInit(&gpio);
// Add 20 values to the pin store, checking the contents after each
// addition.
for (newVal = 0; newVal < 20; newVal++)
{
printf("add %u:\n", newVal);
GpioAdd(&gpio, newVal);
GpioPrint(&gpio);
}
return 0;
}