This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377S:FPU FIR 函数在另一个函数内不工作

Guru**** 2483995 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/734794/tms320f28377s-fpu-fir-function-not-working-when-inside-another-function

器件型号:TMS320F28377S

您好!

我正在使用 FPU DSP 库在 LAUNCHXL-F28377S 上实现希尔伯特变压器作为 FIR 函数。 从 FIR 示例开始、我使用了一个希尔伯特变换。 但是、我需要4个 Hilbert 变压器(4个缓冲器、4个处理程序)、为了使代码更简单、我尝试创建一个函数来初始化滤波器、然后创建另一个函数来应用它、在接收到一个输入和一个指向处理程序的指针后返回一个浮点值。 基本上、只需对已经在两个不同函数中工作的代码进行分组即可。 初始化工作正常、但我在应用滤波器时发现了一个奇怪的问题。  当我尝试应用滤波器阶值变为零、指向缓冲区的指针和指向系数数组的指针时、包含有关滤波器数据的结构(阶数、指向系数数组的指针、输入、输出等)会发生变化。 到 calc 函数的指针不变。

在调试过程中、我发现 fitler 的结构在 FIR 函数期间发生了变化、更确切地说是在  

按 XAR1
按 XAR2
按 XAR3 

它似乎是将缺失的值从寄存器推送到堆栈。 但是、通过观察寄存器、我可以看到它们的值始终为0x0000FFFF 或0x00000000、这些值会替换缺失的值。 由于我真的不知道很多汇编语言、我不确定我是否正确解释了这一点。   

由于这个问题只在使用另一个函数内部的 FPU 函数时出现、而不是 main()、我可以想象它与作用域有什么关系、但我没有弄清楚确切的是什么、因为我在函数内部使用观察表达式正常查看滤波器结构。 另一个可能的原因是缓冲区对齐、如文档所要求。 我使用了#data_section 并对齐了链接器脚本中的系数变量、如示例所示。

这里是我对 FPU 库中的其他 FIR 函数进行分组的函数

float Hilbert_tiler (float input_data、FIR_FP_handle hilb_handle){
hilb_handle->input = input_data;
hilb_handle->calc (hilb_handle);
返回 hilb_handle->输出;
} 

这似乎是一个简单的示波器问题、但在使用调试器并查看值的确切变化位置后、我再也不确定了。 感谢您的任何帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Lucas、

    计算的输出是什么? 您刚才提到的一些寄存器不正确、等等。 您是否检查了输出?  

    谢谢

    Aravindhan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉,我应该提到这一点。 输出全部为零、与输入无关。 关于寄存器、不是因为它们是错误的值、而是在将一些寄存器压入堆栈时、它会覆盖结构的一些重要字段、但始终覆盖相同的字段、始终保持为相同的值、但不会覆盖结构的所有字段。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    解决了问题。 一个简单的变量范围问题、伪装成一个奇怪的汇编错误。  对局部变量的指针引用已经不存在、因为指针归属是在函数内部进行的、并返回该指针以用于主程序。 我将指针属性移到函数外部、并传递函数的指针以更改滤波器的参数、现在它可以正常工作。  

    由于局部变量值位于堆栈内的存储器地址中、我仍然可以手动看到它、并且认为它正被汇编滤波器函数覆盖。 这只是巧合、该函数是第一个将足够的变量推入栈以覆盖旧的局部变量值的函数。 在 init()函数前后看到变量地址,我可以找到问题。