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.

[参考译文] CCS/TMS320F28379D:当 I#39;m 执行 CLA C 代码时、我遇到一些行为问题

Guru**** 2346220 points
Other Parts Discussed in Thread: CCSTUDIO, CONTROLSUITE, TMS320F28075
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/588349/ccs-tms320f28379d-i-have-some-behavioral-issue-while-i-m-executing-cla-c-code

器件型号:TMS320F28379D
Thread 中讨论的其他器件:CCStudiocontrolSUITETMS320F28075

工具/软件:Code Composer Studio

早上好。

在 CPU1配置后使用 CLA1时、我注意到一些问题。 我在 F28379D 目标上使用 CCStudio 7与 TI v6.4.2编译器[TI v16.9.1.LTS 会产生大量#2638错误:对齐
大于元素大小]。
无论如何、我的简单测试代码遵循 TI sketch、但它仅设置 CLA 上的 Task1、以便轻松更改本地 CLA 变量。 编译步骤是可以的;也是调试步骤
正确改进。
当我启动 CPU1代码时、在我在调试窗口 CPU1/CLA1中连接之后、CPU1执行自己的代码、直到在 Cla1ForceTask1andWait()函数:CPU1状态下等待
在焦点通过 CLA1时处于运行模式、CLA1处于挂起模式、没有为0x0000A000定义符号[我知道是由分配给 CLA1的原始 LS4-LS5 RAM
2837xD_RAM_CLA_lnk_CPU1.cmd]。 最后、当我在 CLA1上加载符号时、它会在'a = 1'的第一个 C 结构中停止。

接下来是通过 MSTOP 实现一个结构的汇编代码。

Cla1Task1()、c:
0000a000:78400000 MMOVIZ MR0、#0x0
0000a002:78800001 MMOVXI MR0、#0x1
0000a004:74C08900 MMOV32 @0x8900、MR0
43_mdebugstop();
0000a006:7FA00000 MNOP
0000a008:7FA00000 MNOP
0000a00a:7FA00000 MNOP
0000a00c:7F600000 MDEBUGSTOP
0000a00e:7FA00000 MNOP
0000a010:7FA00000 MNOP
0000a012:7FA00000 MNOP
0000a014:7FA00000 MNOP
52}
0000a016:7FA00000 MNOP
0000a018:7FA00000 MNOP
0000a01a:7FA00000 MNOP
0000a01c:7F800000 MSTOP
27kft = 16384;// 1) E 2)调试 KF Fisso
OSC_TEST():
0000a01e:40008F00 MMPYF32 MR0、MR0、MR0 || MMOV32 @0x8f00、MR0

这些问题与以下事件有关:

1) 1)如果我执行一个单步执行、MPC 到达0x000a006、而蓝色箭头指向__mdebugstop()函数。 MR0寄存器将被改变为1、然后它将被改变
加载到为'A'变量分配的 CLA1数据 RAM 中的0x8900中。 如果我在"Variable"窗口和0x8900 RAM 位置中选中 MR0、'A'、则看不到任何正确的值[它
保留0值]。 但是、如果我在"Variable"窗口或"Memory"中手动更改值、则会正确更改值。 CLA 的存储器似乎存在一些问题
但也具有自己的 MR0寄存器[???];
2) 2)如果我继续执行两个步骤、则 MPC 会超限 MSTOP CLA 结构并达到0x000a01e 程序位置、该程序位置将分配给 CPU1代码[????]。

是否有人澄清这种行为? 非常感谢。

迭戈。

PS:抱歉、我的英语不好。

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

    你(们)好

    [引用 USER="Diego Bellachioma"]如果我执行单步执行,MPC 到达0x000a006,而蓝色箭头指向__mdebugstop()函数。 MR0寄存器将被改变为1、然后它将被改变
    加载到为'A'变量分配的 CLA1数据 RAM 中的0x8900中。 如果我在"Variable"窗口和0x8900 RAM 位置中选中 MR0、'A'、则看不到任何正确的值[它
    保留0值]。 但是、如果我在"Variable"窗口或"Memory"中手动更改值、则会正确更改值。 CLA 的存储器似乎存在一些问题
    但也具有自己的 MR0寄存器[???];[/报价]

    我建议您在"Disassembly"窗口中单步执行。 当你在 CLA 上单步执行时、你将流水线向前推1个周期、它与 C28x 不同、在这里、如果你单步执行、它将清空流水线并只执行1条指令。 在反汇编窗口中、您需要单步执行几次、直到  MMOVXI MR0、#0x1指令进入其执行阶段、MR0实际加载1。 然后、对于 MMOV32 @0x8900、MR0进入其写入阶段、MR0中的值将写入地址0x8900、再执行两次

    [引用 user="Diego Bellachioma]2)如果我继续执行两个步骤,MPC 将超支 MSTOP CLA iassumt 并达到0x000a01e 程序位置,该程序将分配给 CPU1代码[???]。

    当 MSTOP 到达管线中的 D2 (解码2)阶段时、CLA 停止执行。 此时、CLA 将向 PIE 触发任务结束中断。

    我在一段时间前创建了一个有关 CLA 调试的视频、它更详细地介绍了流水线。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。 非常感谢您的帮助。

    有一天、我试图了解发生了什么。 我现在证明了您的建议、但不幸的是、它不起作用。 如果我使用"汇编步骤进入"按钮、我会看到 MPC 和"Disassembly"窗口的代码都是单步执行的、但是、尽管我介绍了以下汇编段代码、但寄存器或存储器中的任何更改都会发生(流水线是8级、如果我没有错、D2是第4级; 我尝试14个步骤...)。

    00009ffe:00000000 MMPYF32 MR0、MR0、MR0 || MMOV32 MR0、@0x0
    42. _mdebugstop();
    Cla1Task1()、c:
    0000a000:7FA00000 MNOP
    0000a002:7FA00000 MNOP
    0000a004:7FA00000 MNOP
    0000a006:7F600000 MDEBUGSTOP
    0000a008:7FA00000 MNOP
    0000a00a:7FA00000 MNOP
    0000a00c:7FA00000 MNOP
    0000a00e:7FA00000 MNOP
    44. _asm (" MMOVXI MR0、#0x1");
    0000a010:7FA00000 MNOP
    0000a012:78800001 MMOVXI MR0、#0x1
    0000a014:7FA00000 MNOP
    45. A = 1;
    0000a016:78400000 MMOVIZ MR0、#0x0
    0000a018:78800001 MMOVXI MR0、#0x1
    0000a01a:74C08900 MMOV32 @0x8900、MR0
    53}
    0000a01c:7FA00000 MNOP
    0000a01e:7FA00000 MNOP
    0000a020:7FA00000 MNOP
    0000a022:7F800000 MSTOP
    58}
    Cla1Task2()、c:
    0000a024:7FA00000 MNOP
    0000a026:7FA00000 MNOP
    0000a028:7FA00000 MNOP
    0000a02a:7F800000 MSTOP
    63}

    具体而言、如果我尝试更改 CLA 的 MRx 注册器、这也是调试寄存器窗口中的 R/W、则不会发生任何情况;此外、还使用汇编器结构! 我尝试更改代码文件夹中复制的 TI 2837xD_RAM_CLA_lnk_CPU1.cmd、但我找不到权变措施[ES.我使用 Cla1Prog 拆分 RAMLS4和5 :> RAMLS4,PAGE=0;CLA_暂 存盘_size = 0x100 -> 0x200,但没有任何变化。

    是否有某种测试可用于调试这种情况? CLA_logig_CPU1示例也会发生这种情况。

    此致、

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

    您好、Diego、

    我认为我遇到了非常类似的行为。 当我在反汇编中单步执行代码时、CLA 似乎继续通过 MSTOP 指令执行。 如果我继续单步执行代码、我们将考虑任务1、任务2、任务3。。。 任务8、然后完成任务8。

    我能够在 controlSUITE/DEVICE_SUPP支 架/F2807x/V210/F2807x_examples 中的示例项目"cla_divide_cpu01"上重现此问题。

    您是否找到了权变措施或解决方案?

    --

    我使用的是以下代码:

    • MCU:TMS320F28075 (F2807x)
    • TI-CGT-C2000_16.9.1.LTS (CGT 16.9.1 LTS)
    • controlSUITE 3.4.6
    • OS:macOS
    • 编译命令:
    cl2000 -v28 -ml -mt --float_support=fpu32 --tmu_support=tmu0
    --include_path="/ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.1.LTS/include
    --include_path="/ti/controlSUITE/device_support/F2807x/v210/F2807x_headers/include
    --include_path="/ti/controlSUITE/device_support/F2807x/v210/F2807x_common/include
    --include_path="/ti/controlSUITE/device_support/F2807x/v210/F2807x_examples_Cpu1/cla_divide/cpu01 --include_path="--g
    --define=cpu1 --display_error_number --diag_warning=100225 
    • 链接命令:
    cl2000 -v28 -ml -mt --float_support=fpu32 --tmu_support=tmu0 -g
    --define=cpU1 --display_error_number --diag_warning=225 --exag_suppress=10068 -z
    -m"cla_divid_cpu01.map"--stack_size=0x100 --express_express-xml_ip_express-link_ip_influ1.map"
    --/ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.1.LTS/lib
    /ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.1.LTS/include
    
    -link_inuat_express-link_express-/ti/controlSUITE/device_support/F2807x/v210/F2807x_headers/cmd -link_inu_inu1.htm#-link_zh-link_line_link_inese-express-link_inu_line_link_zh-link_inese-link_ines"./ti/controlSUITE/device_support/F2807x/v210/F2807x_common/cmd
    
    
    

    谢谢、

    Jairo

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

    您好、Diego、

    很抱歉、我没收到您的回复。 您是否在设置代码中为 CLA 所有权配置了 RAMLS4?

    //
    ////选择 LS4RAM 作为 CLA 的编程空间
    //首先将 CLA 配置为 LS4的主控方,然后
    //将该空间设置为程序块
    //
    MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM.LS4 = 1;MemCfgRegs.LS4 = 1; 

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

    您好、Vishal、

    您认为 controlSUITE 中的示例代码中存在错误吗? 粘贴相关器件。

    这位于 device_support/F2807x/V210/F2807x_examples_CPU1/CLA_divide/cpu01/cla_divide_cpu01.c)中。

    MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1;
    
    MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
    
    MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
    
    

    CCS 工程中使用的链接器命令是 F2807x_common/cmd/2807x_RAM_CLA_lnk.cpu1.cmd、具有以下 CLA 相关行:

    /* CLA 特定部分*/
    Cla1Prog :>RAMLS4_LS5,PAGE=0
    
    CLADataLS0:>RAMLS0,PAGE=1
    CLADataLS1:>RAMLS1,PAGE=1
    
    Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW,PAGE=1
    CpuToCla1MsgRAM:>CLA1_MSGRAMIGH,PAGE=1 

    此外:

    CLAscratch :
    {*。obj (CLAscratch)
    。 += CLA_ScratchPad_size;
    *。obj (CLAscratch_end)}> RAMLS1、page = 1
    
    .scratchpad :> RAMLS1、 PAGE = 1.bss_cla
    :> RAMLS1、 PAGE = 1.CONST_CLA
    :> RAMLS1、 PAGE = 1.
    

    谢谢、

    Jairo

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

    你(们)好,Jairo。

    不幸的是,在意大利(5月1日)是一个工人假期,所以我可以利用在那不勒斯旅行。 无论如何、我认为您的解决方案位于我链接的另一个主题中:

    e2e.ti.com/.../588757

    您还可以在其中找到 Vishal 的建议。 我希望这对您有所帮助。

    再见、Diego。