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++)
显然 ref
和 in
的所有元素必须相同,但最后一个元素不相同。 data
的最后一个元素是 2617,bu 在 ref
上是 -15581,在 in
上是 2409。
问题是如何消除最后一个元素中的数据损坏?
总是尽可能简单地编写循环。 for(uint16_t ii=0;ii!=63;ii++)
无缘无故起了个奇怪的名字 ii
。 i
代表迭代器,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];
}
现在 ref
和 in
的最高索引访问将是 63(第 64 项)并且 data
的最高索引访问将是 63*2 + 1 = 127
(第第128项).
与您的问题无关,在为微控制器嵌入式系统编码时,在堆栈上分配这样的大型数组不是一个好主意。当调用此函数时,您将获得 >256 字节的堆栈峰值使用,这是非常危险的。将这些缓冲区声明为 static
,以便它们最终进入 .bss
而不是堆栈。
在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++)
显然 ref
和 in
的所有元素必须相同,但最后一个元素不相同。 data
的最后一个元素是 2617,bu 在 ref
上是 -15581,在 in
上是 2409。
问题是如何消除最后一个元素中的数据损坏?
总是尽可能简单地编写循环。 for(uint16_t ii=0;ii!=63;ii++)
无缘无故起了个奇怪的名字 ii
。 i
代表迭代器,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];
}
现在 ref
和 in
的最高索引访问将是 63(第 64 项)并且 data
的最高索引访问将是 63*2 + 1 = 127
(第第128项).
与您的问题无关,在为微控制器嵌入式系统编码时,在堆栈上分配这样的大型数组不是一个好主意。当调用此函数时,您将获得 >256 字节的堆栈峰值使用,这是非常危险的。将这些缓冲区声明为 static
,以便它们最终进入 .bss
而不是堆栈。