1

我想读取 MCU GPIO 引脚状态并将其重复存储到 10 个数字的数组中。当数组已满时,它应该将值左移并将新值存储到第 [9] 个下标位置并继续。

我如何在 Embedded C 中将其实现为代码?

4

3 回答 3

2

鉴于您每次只存储 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。

于 2015-08-11T09:51:48.143 回答
0

如果我理解得很好,它应该看起来像这样:

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。不确定这是否是您想要的。

于 2015-08-11T07:04:44.673 回答
0

不确定您所说的“嵌入式 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;
}
于 2015-08-11T07:09:30.123 回答