我有一个函数,它将接收缓冲区和大小,并将该缓冲区(缓冲区A)复制到更大的缓冲区(缓冲区b)。如果缓冲区B的当前大小加上缓冲区A的大小太大,我们将缓冲区A分成一些进入当前缓冲区B,其余部分在我们处理完全缓冲区b后插入。
像这样:
#define MAX_SIZE 1400
int WriteIndex = 0;
u8 buffer_b[2500];
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
if ((WriteIndex + bufferSize) <= MAX_SIZE) {
memcpy(&(buffer_b[WriteIndex]), &buffer_a, bufferSize);
WriteIndex += bufferSize;
} else {
u16 bytesAddedToCurrentBuffer = (MAX_SIZE - WriteIndex);
u16 bytesAddedToNextBuffer = (bufferSize - bytesAddedToCurrentBuffer);
memcpy(&(buffer_b[WriteIndex]), &buffer_a, bytesAddedToCurrentBuffer);
// calls another function, process data, resets writer index to 0
doSomething();
AddToBuffer(&buffer_a[bytesAddedToCurrentBuffer], bytesAddedToNextBuffer];
}
}
int main() {
...
u8 buff[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
for (;;) {
AddToBuffer(buff, 7);
}
...
}
现在,上面的函数除了递归调用之外还有效。我相信我只想传入索引bytesAddedToCurrentBuffer的数组地址。如果我注释掉它的递归调用,如果我用与前一个if语句的逻辑(第4和第5行)相同的逻辑替换递归调用,它的效果很好。我希望它是一个递归调用,以便该函数能够处理大于MAX_SIZE的缓冲区。
提前致谢。
编辑: WriteIndex从0开始。它会明显增加,直到达到MAX_SIZE,然后它将落入其他情况,填充buffer_b,处理buffer_b,然后用WriteIndex返回0开始一个新的缓冲区。
传入的缓冲区大小也无关紧要。它可以是2个字节,可以是10个字节,也可以是1000个字节。它会处理它一样。
EDIT2: 我的问题是,递归调用最终会在内存中写入,而不是在内存中,并且我的FPGA会锁定。
EDIT3: 一个更“完整”的例子。
答案 0 :(得分:4)
您的代码中存在多个问题。
AddToBuffer
应该有返回类型。
您传递memcpy
指针buffer_a
的地址而不是其值。
您忘记按照复制的块的大小递增WriteIndex
您使用u16
变量进行块大小计算,这与原型不一致:unsigned int
可能大于u16
并且传递的实际缓冲区大小可能更大超过64K。 编辑你改变了问题,所以这一点没有实际意义。
这是一个更简单的版本:
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
while (WriteIndex + bufferSize >= MAX_SIZE) {
unsigned int bytesAddedToCurrentBuffer = MAX_SIZE - WriteIndex;
memcpy(&buffer_b[WriteIndex], buffer_a, bytesAddedToCurrentBuffer);
writeIndex += bytesAddedToCurrentBuffer;
// calls another function, process data, resets WriteIndex to 0
doSomething();
buffer_a += bytesAddedToCurrentBuffer;
bufferSize -= bytesAddedToCurrentBuffer;
}
memcpy(&buffer_b[WriteIndex], buffer_a, bufferSize);
WriteIndex += bufferSize;
}
如果你绝对坚持编写递归函数,只需解决上面提到的3个问题:
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
if ((WriteIndex + bufferSize) <= MAX_SIZE) {
memcpy(&(buffer_b[WriteIndex]), buffer_a, bufferSize);
WriteIndex += bufferSize;
} else {
u16 bytesAddedToCurrentBuffer = (MAX_SIZE - WriteIndex);
u16 bytesAddedToNextBuffer = (bufferSize - bytesAddedToCurrentBuffer);
memcpy(&(buffer_b[WriteIndex]), buffer_a, bytesAddedToCurrentBuffer);
WriteIndex += bytesAddedToCurrentBuffer;
// calls another function, process data, resets writer index to 0
doSomething();
AddToBuffer(&buffer_a[bytesAddedToCurrentBuffer], bytesAddedToNextBuffer);
}
}