首页 > 解决方案 > 逐元素从较小的数组转移到较大的数组

问题描述

我正在 Arduino 框架中编写 ESP32。对于我的应用程序,我需要创建一个缓冲区来存储当前和上次访问时的信息。这是我正在尝试做的事情。

//first buffer
char buffer1[4];

//second buffer
char buffer2[8];

void setup {
    //setup
}

//buffer1 values will change with each iteration of loop from external inputs
//buffer2 must store most recent values of buffer1 plus values of buffer1 from when loop last ran

for example:

**loop first iteration**
void loop {
    buffer1[0] = {1};
    buffer1[1] = {2};
    buffer1[2] = {3};
    buffer1[3] = {1};

    saveold(); //this is the function I'm trying to implement to save values to buffer2 in an element-wise way
}
//value of buffer2 should now be: buffer2 = {1,2,3,1,0,0,0,0}

**loop second iteration**
void loop {
    buffer1[0] = {2};
    buffer1[1] = {3};
    buffer1[2] = {4};
    buffer1[3] = {2};

    saveold();
}

//value of buffer2 should now be: buffer2 = {2,3,4,2,1,2,3,1}

从我通过在线搜索了解到的情况来看,我正在尝试制作的“saveold”函数应该为这些数组操作实现某种形式的 memmove

我试图将它拼凑起来,但我总是覆盖 buffer2 的值,而不是以某种方式将新值移入,同时保留旧值

这就是我所拥有的:

void saveold() {
  memmove(&buffer2[0], &buffer1[0], (sizeof(buffer1[0]) * 4));
}

据我了解,这会将 buffer1 从索引位置 0 开始复制到 buffer2,从索引位置 0 开始,共 4 个字节(其中 1 个字符 = 1 个字节)。

计算机科学不是我的背景,所以也许我缺少一些基本的解决方案或策略。任何指针将不胜感激。

标签: c++arduinoembeddedarduino-c++

解决方案


正确的方法是使用缓冲区指针,而不是进行硬拷贝备份。使用 memcpy 进行硬拷贝在慢速传统微控制器(如 AVR)上尤其糟糕。不太清楚这个 ESP32 得到了什么 MCU,似乎是来自 Tensilica 的一些奇怪的 MCU。无论如何,这个答案普遍适用于任何数据多于 CPU 数据字长的处理器。

也许我缺少一些基本的解决方案或策略。

确实 - 听起来您正在寻找的是一个环形缓冲区。也就是说,一个固定大小的数组,它有一个指向有效数据开头的指针,另一个指向数据末尾的指针。您移动的是指针,而不是数据。与使用memcpy.


推荐阅读