C 用数据填充缓冲区后,出现奇怪的数据

C After filling buffers with data, strange data appear

在STM32F746NG上通过SWD购买调试,并将断点放在下面代码的最后一行:

uint16_t data[128];
q15_t ref[64];
q15_t in[64];
.
.
.
for(uint16_t ii=0;ii!=63;ii++)
  {
    ref[ii]=data[ii*2+1];
    in[ii]=data[ii*2+1];
  }


  // 3.LMS processing
    arm_lms_q15(
            &myLMS,
            in,
            ref,
            dummyOut,
            error,
            nsamples
            );

  // 4.Visualizing errors
for(uint16_t bytecount=0;bytecount!=64;bytecount++)

显然 refin 的所有元素必须相同,但最后一个元素不相同。 data 的最后一个元素是 2617,bu 在 ref 上是 -15581,在 in 上是 2409。 问题是如何消除最后一个元素中的数据损坏?

总是尽可能简单地编写循环。 for(uint16_t ii=0;ii!=63;ii++) 无缘无故起了个奇怪的名字 iii代表迭代器,ii代表什么?它还会无缘无故地检查 != 63

一个惯用的 for 循环被写成 for(uint16_t i=0; i<n; i++) 并且偏离该形式通常是“代码味道”。

你应该

#define REF_MAX 64  // replace this with some meaningful name.
...

// remove magic numbers:
uint16_t data[REF_MAX*2];
q15_t ref [REF_MAX];
q15_t in  [REF_MAX];

// idiomatic for loop without magic numbers:
for(uint16_t i=0; i<REF_MAX; i++)
{
  ref[i] = data[i*2+1];
  in[i]  = data[i*2+1];
}

现在 refin 的最高索引访问将是 63(第 64 项)并且 data 的最高索引访问将是 63*2 + 1 = 127(第第128项).


与您的问题无关,在为微控制器嵌入式系统编码时,在堆栈上分配这样的大型数组不是一个好主意。当调用此函数时,您将获得 >256 字节的堆栈峰值使用,这是非常危险的。将这些缓冲区声明为 static,以便它们最终进入 .bss 而不是堆栈。