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.

[参考译文] TMS320F28375D:运行 CLA 代码时出现问题

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/650081/tms320f28375d-problems-with-running-cla-code

器件型号:TMS320F28375D

你好!

感谢您先前的帮助、我修复了我的链接器文件和所有存储器排列、简单程序在我的 CLA 中完美运行。

但是、然后我开始运行我编写的 FFT 代码、THR 问题就开始了。 代码在主内核上运行良好(通过 MATLAB 测试了正确性)。

当我第一次将代码传输到 CLA 时、它根本没有执行、在编译或调试期间没有显示错误。 然后我将 FFT 拆分为几个较小的子函数、代码奇迹般地开始执行、但输出与实际情况相关、就 DSP 而言、这种小精度是不可接受的。

以下是我的 FFT 尝试:United One 和 Split One。 CLA 代码由 Cla1ForceTask1andWait()从主函数触发;

#include "FFT_test1_cla.h"
#include "F28x_Project.h"


//FFT 变量:
int16_t n、nspan、submatrix、node;
int16_t N1;//= 8;//1< >1)/span; submatrix ++)
{
for (node=0;node >1; span; span>>=1) FFT 级上的//循环
{
基元_根=-(3.14159265359/span);
secondloop();
}
} 
_interrupt void Cla1Task1 (void)
{
N1=8;
span=8;
n=0;
for (span=N1>>1;span; span >>=1) FFT 级上的//循环
{
基元_根=-(3.14159265359/span);//在标头中定义 MIPPI
//secondloop();
//_mdebugstop ();
//#pragma MUST_ITERATE (loop2)
for (submatries=0;submatries<<(N1>>1)/span;submatries++)
{
//__mdebugstop ();

//#pragma MUST_ITERATE (loop3)
for (node=0;node 

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

    我今天没有机会查看您的代码。 明天我将查看并返回给您。

    C28x 和 CLA 之间的答案可能不同。 您是否在 C28x 内核上使用 FPU?

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

    您好 Sal、

    我尝试使用 FPU 和优化、无论是同时使用还是一次使用一个、使用 FPU 都不会导致任何明显的差异。

    此致、

    Konstantin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在理解这些问题时遇到了一些困难。 请您澄清一下吗?

    准确度是否足够?

    您是否看过 CLA 示例以了解如何正确配置和启动 CLA 任务?

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

    当然可以。

    我在一个简单的情况下测试我的 alrorythm:计算 sin (x)的8点实数 FFT。 MATLAB 和 C28x 在输出的虚部和实部中提供相同的结果(如随附的屏幕截图所示)

    在这里、我只得到两个重要字符:4i 和-4i、其他字符近似为0。

    当我将代码移动到 CLA 时、我得到 IM.output{0、0、0、0、0、0、0、2}和实际输出{-8e-08、-5e-08、-08、-5e-08、-5e-0.8、0、0、0}。 您可以看到、CLA 的计算方式有问题。 CLA 输出的实际部分具有大得多的顺序、但 e-08仍然可以视为零、但虚部分会变大。

    正如我说过的、代码在主内核上工作、因此它似乎不是问题的根源。

    此致、

    Konstantin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实数[]和 im[]数组是如何定义的?

    您能否单步执行代码并查看其开始出现的差异?

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

    它们在主.c 文件中定义、位于共享 RAM 中。
    只能在星期一访问硬件。

    在单步执行 CLA 反汇编时、在定义输入变量后、奇怪的东西从一开始就出现了(我的意思是从这一行开始:
    for (span =N1>1;span;span >=1)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可能是同步问题。 确保在任务开始执行时、C28x 或 CLA 正确初始化变量。 此外、请确保 C28x 在 CLA 对这些变量进行操作时不会修改这些变量。

    为此、您可以使用共享存储器或从 CLA 到 C28x 的中断线路来发出修改变量的安全信号。

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

    同步似乎不是问题。 所有数据都位于共享 RAM 中、从 C28x 加载到该 RAM 后、仅 CLA 使用。 标志正以正确的顺序发生变化、因此代码段有时间执行。

    这似乎有点奇怪、但 CLA 是否会在单个函数中编译/执行过多的代码行时出现问题? 因为当我的所有 FFT 都被放置在一个函数中时、根本没有输出、并且在将其拆分为3个"循环"后、输出上开始出现某种情况。 考虑到这一事实,这是什么?  

    我不知道该怎么做。 可能是 CLA 的一些硬件限制、例如执行时间限制、它会削减所有"额外"计算(这些只是扇出、不知道类似的东西)、或缺少程序存储器(不应该是、它已经是0x1000)或其他一些东西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不应因函数/任务过长而出现任何问题。 编译器没有受到任何限制。

    请确保所有程序和数据都位于您所使用器件上可用的 LS RAM 块中。

    为了找到问题并对其进行调试、您可以在不同的位置拆分任务以帮助确定问题、因为您说将问题拆分可以解决问题。 此外、我建议在您的 CLA 任务中设置一个 MDEBUGSTOP、以单步执行代码并查看问题所在。

    您还可以再次尝试将代码合并为一个函数、并在代码中放置一些 MNOP、以查看这是否能够解决问题、而不是分解函数。 您能否尝试一下、告诉我您是否能够使用 MNOP 解决问题、而不是中断函数? 我想知道、在某个地方是否存在竞争条件、并且编译器由于 CLA 的未受保护的流水线而无法正确发布指令。 可能会发生一些读取/写入争用。

    请告诉我您的发现。

    此致、
    SAL