嵌入式C:在列表中添加值,抛出las值

嵌入式C:在列表中添加值,抛出las值,c,embedded,C,Embedded,我想收集250个浮点值,当收集器已满时,我将抛出最后一个元素并将新元素添加到顶部。我不能在stm32微控制器中使用malloc 如何在C语言中解决这个问题?使用250个浮点数组,并将其作为循环缓冲区运行 以下伪代码显示了如何执行此操作: def array as float[250] def count = 0 def position = 0 while x = getNextValue: if count < 250: count++ array[pos

我想收集250个浮点值,当收集器已满时,我将抛出最后一个元素并将新元素添加到顶部。我不能在stm32微控制器中使用malloc


如何在C语言中解决这个问题?

使用250个浮点数组,并将其作为循环缓冲区运行

以下伪代码显示了如何执行此操作:

def array as float[250]
def count = 0
def position = 0
while x = getNextValue:
    if count < 250:
        count++
    array[position] = x
    position = (position + 1) % 250
def数组作为浮点[250]
def计数=0
def位置=0
当x=getNextValue时:
如果计数小于250:
计数++
数组[位置]=x
位置=(位置+1)%250
这段代码只需将每个值写入数组中的一个位置。在数组已满(
count<250
)之前,您可以使用
count
计算填充了哪些值(索引0到
count-1,包括索引0)


一旦填满,位置=(位置+1)%250将回滚到零,有效地设置它,以便下一次写入擦除当前最早的值。

只需使用循环缓冲区(一个数组和当前位置的索引)实现一个简单的FIFO队列即可:

如果将
SIZE
定义为256(或任何其他2的幂),则它将通过避免
%SIZE
中涉及的除法来提高索引递增操作的运行时性能:

#define SIZE 256

float array[SIZE] = {0};
unsigned int index = 0;

float insert(float newVal)
{
    float oldVal = array[index&(SIZE-1)];
    array[index&(SIZE-1)] = newVal;
    index++;
    return oldVal; // In case you wanna do something with it...
}

请注意,如果有多个线程插入值,则需要使用一些操作系统资源(如互斥量或信号量)来保护
array
index

+1。了解一点背景知识:。这是一个非常有用的数据结构,每个开发人员都需要知道,IMHO。为什么
(索引+大小)%SIZE
?此外,当
索引
溢出且
大小
不是2的倍数时,增加索引无边界也有一个缺点,即您将得到一个错误的“跳转”到零。相反,只需执行
array[index]
然后执行
index++;指数%=大小以递增和滚动。正确;在
(索引+大小)%SIZE
中没有点,因为它可以是
索引%SIZE
。但是,这两种方法都允许您无需增加
索引
,它们与上面的建议相同。仍然存在溢出错误:假设
unsigned int
将是一个16位的值。现在
65535%250==35
,但如果增加该值,它将溢出,得到
0%250==0
。哎哟,你的指数从35跳到了0,而不是36:-)哦,是的,你完全正确,我站在更正。我想我已经习惯了“2次方”的缓冲区大小,这使得索引的递增更加有效。我会修改我的答案;谢谢。它不起作用,你需要删除index+,如果我添加两个新值,只有第二个值会添加到新位置(你的第二个解决方案)。
#define SIZE 256

float array[SIZE] = {0};
unsigned int index = 0;

float insert(float newVal)
{
    float oldVal = array[index&(SIZE-1)];
    array[index&(SIZE-1)] = newVal;
    index++;
    return oldVal; // In case you wanna do something with it...
}