ARM DSP 中的 pSrc 和 pDst 函数参数可以指向同一个内存吗?

Can pSrc and pDst function arguments in ARM DSP point to same memory?

提问人:maestro 提问时间:6/26/2023 最后编辑:Christoph Rackwitzmaestro 更新时间:7/4/2023 访问量:54

问:

我使用 ARM DSP 库中的以下函数:

  • void arm_fir_f32(const arm_fir_instance_f32 *S, const float32_t *pSrc, float32_t *pDst, uint32_t blockSize);
  • void arm_biquad_cascade_df2T_f32(const arm_biquad_cascade_df2T_instance_f32 *S, const float32_t *pSrc, float32_t *pDst, uint32_t blockSize);
  • void arm_cmplx_mag_f32(const float32_t *pSrc, float32_t pDst, uint32_t numSamples);

问题是指针可以指向同一个内存吗?官方文档不包含此类信息。pSrcpDst

输入指针标有属性,因此这些函数不会在内部修改输入数组。但是,如果修改函数处理值时会发生什么?这似乎没问题,因为过滤器实例结构具有成员...constpSrc[k-1]pSrc[k]pState

此外,我可以说它没有标记属性,因此开发人员假设的功能可能等于......pSrcpDstrestrictpSrcpDst

这些函数的来源:

arm_biquad_cascade_df2T_f32

arm_fir_f32

arm_cmplx_mag_f32

C ARM 信号处理 就地 CMSIS

评论

1赞 David Grayson 6/26/2023
有人应该阅读源代码并找出答案。您是否有直接指向这 3 个函数源代码的链接?
0赞 maestro 6/26/2023
@DavidGrayson,我添加了指向来源的链接。
0赞 artless noise 6/26/2023
你的问题不清楚。如果不允许指针相同,则添加关键字是正常的。这将为编译器提供更多优化机会。该代码有一个注释:当前阶段的输出作为下一阶段的输入给出。所以,我认为答案取决于你链接过滤器的方式。restrict
0赞 dmedine 6/27/2023
正如你所说。 值不能因为关键字而更改。此外,这意味着编译器不允许您执行类似 .出于同样的原因,您无法修改(或,就此而言)。您可以在不更改指针寄存器的情况下丢弃 ness,但这样就无法将其传递给签名中带有的函数。API 很难违反其设计原则,这是一件好事。pSrcconstconst float_32* in; float_32* out = in;pSrc[k-1]pSrc[anything]constconst
0赞 dmedine 6/27/2023
哎呀,我收回来。您可以放弃指针,并使用 将其提供给签名。可能有一些编译器标志可以设置为至少在执行此操作时引发警告。所以,是的,你可以欺骗你的指针来做就地DSP。但是,似乎 API 设计者不希望你这样做。constconst <type>*

答:

0赞 maestro 7/4/2023 #1

是的,对于复数级函数,输出可以是输入

对于其他功能,开发人员必须查看并记录每个功能。