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.

[参考译文] CODECOMPOSER:用于多核器件的 CCS 脚本解决方案 (C28x_CPU1、C28x_CPU2 和 CLA1)、1 个探头

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1590699/codecomposer-ccs-scripting-solution-for-multicore-device-c28x_cpu1-c28x_cpu2-cla1-1-probe

部件号: CODECOMPOSER
主题: CCSTUDIO 中讨论的其他器件

您好、

我正在为上述设置使用 CCS 脚本。 我成功连接到 CPU1 和 CPU2(作为 CPU1 的子项)、并可以加载两个 CPU 的.out 文件。 但是、我认为在为 CPU2 加载文件后、CPU1 的上下文会丢失。 例如、下面是一个我正在努力处理的场景:

  1. 为 CPU1 创建会话并进行连接

  2. 加载程序

  3. 为 CPU2 创建会话(作为 CPU1 的子项)并进行连接

  4. 加载程序

  5. 为 CPU2 添加行断点

程序似乎会运行并且遇到断点,但在读取特定变量时,其值不是我预期的值 — 初始值没有改变,即使在 GUI 中手动运行相同流程时初始值确实会发生变化。

另外、如果我为 CPU1 添加一个断点、然后加载 CPU2 的.out 文件并运行 CPU1、该断点似乎不再有效。

CCS 脚本是否支持上述方案? 设置或 CCS 版本是否会引起任何限制? 我使用的是 CCS 12.6.0 版。

此致、

DANA

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

    尊敬的 Dana:

    [quote userid=“677066" url="“ url="~“~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1590699/codecomposer-ccs-scripting-solution-for-multicore-device-c28x_cpu1-c28x_cpu2-cla1-1-probe
    • 为 CPU1 创建会话并进行连接

    • 加载程序

    • 为 CPU2 创建会话(作为 CPU1 的子项)并进行连接

    • 加载程序

    • 为 CPU2 添加行断点

    [/报价]

    是支持此方案。 我可以看到您的脚本(或者至少是上面步骤的部分)吗?

    谢谢

    Ki

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

    您使用的是 CCS 12.6

    DS = wait initScripting();

    但看起来您在使用 CCS Scripting、这仅适用于 CCS 20.x 及更高版本。

    如果您希望使用 CCS 12.x、则需要改用 DSS。 CCS 12.x 不支持 CCS 脚本编写

    https://software-dl.ti.com/ccs/esd/documents/users_guide_12.8.0/sdto_dss_handbook.html

    谢谢

    Ki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid=“677066" url="“ url="~“~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1590699/codecomposer-ccs-scripting-solution-for-multicore-device-c28x_cpu1-c28x_cpu2-cla1-1-probe/6134358

    严重级别:C28xx_CPU2:闪存编程器:擦除组 0 FMSTAT(某些器件上的 STATCMD)值= 65 时出错。 操作已取消 (0)。

    严重级别:C28xx_CPU2:文件加载程序:内存写入失败:未知错误

    严重级别:C28xx_CPU2:GEL:文件:C:\Data\EXAM5_2\UserData\dropins\DDS_BRIDGE\SSP50A_SPC_Reg_CPU2.out:加载失败。

    [/报价]

    这看起来是闪存编程器的一些配置问题。

    使用 CCS IDE 时、您是否能够手动成功完成所有操作?

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

    您好、

    我 与测试团队联系过、他们能够 启动调试配置、这也 涉及加载 CPU2 的.out 文件。 我将附上一个文档 、其中包含屏幕截图、其中包含他们为调试配置选择的选项。  默认情况下选中了 Target 部分中的设置、它们不会对其进行任何更改。

    e2e.ti.com/.../CCS-Screenshots.docx

    另一条可能有用的信息是、“内核 2 无法独立运行、并且依赖于内核 1、因为内核 2 是从内核 1 配置的“。

    在启动 CPU2 的加载之前、我们是否需要发送任何命令?

    请注意、我们还尝试在未 选择 CPU1_CLA1 的情况下启动调试配置、该配置可以正常运行。

    再次感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将附上一个包含 屏幕截图的文档、其中包含他们为调试配置选择的选项。

    啊、是的、此器件需要一些特定的闪存设置。

    您将需要在 DSS 脚本中执行相同的操作。

    它与下一节中提到的设置调试器选项类似:

    https://software-dl.ti.com/ccs/esd/documents/users_guide_12.8.0/sdto_dss_handbook.html#debugger-properties

    但您需要对 Flash 选项执行此操作:

    https://software-dl.ti.com/ccs/esd/documents/scripting_api/ccs_12.8.0/dss/docs/DS_API/com/ti/debug/engine/scripting/Flash.html

    谢谢

    Ki

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

    感谢您的答复。 我们尝试了各种方法、还将 CCS 版本升级到 20.4.0 以使用 CCS 脚本、但我们遇到了相同的问题。  

    1) 我们 只能 在以子会话形式打开相关会话(如 Wait DS.openSession(“C28xx_CPU1",“,"C28xx_CPU2"、"C28xx_CPU2")“)时“ 时为 CPU2 加载一个文件

    2) 我们可以添加 符号断点、运行并命中断点(对于 CPU2)。 但在检查 CPU2 的变量值时、该值仍然是初始值、不是预期值。

    请您告知、我们似乎已经到达了阻塞点。

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

    请注意、对于 CCS 20.4.0、您不需要对脚本 API 使用“wait"关键“关键字。 请参阅以下部分中的警告说明:

    https://software-dl.ti.com/ccs/esd/documents/users_guide_ccs/ccs_debug-scripting.html#scripting

    1)  如果我们以子会话的形式打开相关会话(类似 wait DS.openSession(“C28xx_CPU1",“,"C28xx_CPU2"、"C28xx_CPU2")“))“)、我们只能为 CPU2 加载一个文件

    您应该能够为每个核心创建一个会话、并使用与该核心关联的会话来指定该核心的操作

    sessionCPU1 = DS.openSession(“XDS110 Texas Instruments 调试探针/C28xx_CPU1“);
    sessionCPU2 = DS.openSession(“XDS110 Texas Instruments USB 调试探针/C28xx_CPU2“);

    //连接到内核
    sessionCPU1.target.connect ();
    sessionCPU2.target.connect ();

     //加载程序  
    sessionCPU1.memory.loadProgram(“C:/project_cpu1/Debug/cpu1.out“);
    sessionCPU2.memory.loadProgram(“C:/project_CPU2/Debug/CPU2.out“);

    2) 我们可以添加 符号断点、运行并触发断点(对于 CPU2)。 但在检查 CPU2 变量的值时、该值仍然是初始值、不是预期值。

    您指的是执行前的初始值? 您能否确认变量值确实发生了变化? 您如何读取该值?

    谢谢

    Ki

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

    您好、Ki

    1) 我们尝试了您的建议,但当会话 2 不是作为一个孩子创建时,我们无法加载 CPU2 的文件。 以下是输出、末尾有误差:

    初始化脚本完成
    超时设置...
    C:\Data\EXAM5_2\UserData\dropins\ccs\
    C:\Data\EXAM5_2\UserData\dropins\ccs\TMS320F28P650DK8.ccxml
    配置集
    会话已打开...
    GEL:C28xx_CPU1:GEL 输出:
    存储器映射初始化完成

     

    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化开始...

     

    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化完成...

     

    GEL:C28xx_CPU1:GEL 输出:
    CPU2 退出复位并配置为等待引导。
    (如果之前已连接,可能必须恢复 CPU2 才能到达等待引导循环。)

     

    信息:C28xx_CPU1:如果在一个内核上完成擦除/编程 (E/P) 操作、则另一个内核不应从共享 RAM (SR) 执行、因为它们用于 E/P 代码。 对选定的闪存组进行编程后、可以从 SR 开始执行用户代码。

     

    信息:C28xx_CPU1:只有 CPU1 片上闪存插件可以为 CPU1 和 CPU2 闪存操作配置时钟。 调用 CPU1 闪存操作时插件会自动配置 PLL。 但是、如果用户想要仅执行 CPU2 闪存操作而无需在当前会话中执行 CPU1 操作、则应在调用 CPU2 闪存操作之前点击 CPU1 的片上闪存插件中的“配置时钟“按钮。 使用该按钮时、闪存插件将使用 INTOSC 作为时钟源、在 200MHz 处配置 CPU1/CPU2 的时钟。 插件将保留这样的 PLL 配置、用户应用程序应根据应用程序的要求配置 PLL。

     

    信息:C28xx_CPU1:在使用闪存插件执行任何闪存操作之前、(a) 请选择应映射到哪个 CPU (CPU1 与 CPU2) 的闪存存储体 — 该选择应在 CPU1 闪存插件 GUI 中完成。 (b) 请选择用户希望闪存插件擦除的闪存组(在 CPU1 闪存插件 GUI 和 CPU2 闪存插件 GUI 中)

     

    GEL:C28xx_CPU2:GEL 输出:

     

    RAM 初始化完成

     

     

    GEL:C28xx_CPU2:GEL 输出:
    存储器映射初始化完成

     

    信息:C28xx_CPU2:如果在一个内核上完成擦除/编程 (E/P) 操作、则不应从共享 RAM (SR) 执行、因为这些内核用于 E/P 代码。 对选定的闪存组进行编程后、可以从 SR 开始执行用户代码。

     

    信息:C28xx_CPU2:只有 CPU1 片上闪存插件可以为 CPU1 和 CPU2 闪存操作配置时钟。 调用 CPU1 闪存操作时插件会自动配置 PLL。 但是、如果用户想要仅执行 CPU2 闪存操作而无需在当前会话中执行 CPU1 操作、则应在调用 CPU2 闪存操作之前点击 CPU1 的片上闪存插件中的“配置时钟“按钮。 使用该按钮时、闪存插件将使用 INTOSC 作为时钟源、在 200MHz 处配置 CPU1/CPU2 的时钟。 插件将保留这样的 PLL 配置、用户应用程序应根据应用程序的要求配置 PLL。

     

    信息:C28xx_CPU2:在使用闪存插件执行任何闪存操作之前、(a) 请选择应映射到哪个 CPU (CPU1 与 CPU2) 的闪存存储体 — 应在 CPU1 闪存插件 GUI 中完成此选择。 (b) 请选择用户希望闪存插件擦除的闪存组(在 CPU1 闪存插件 GUI 和 CPU2 闪存插件 GUI 中)

     

    已建立连接
    正在加载程序。 。
    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化开始...

     

    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化完成...

     

    GEL:C28xx_CPU1:GEL 输出:
    CPU2 退出复位并配置为等待引导。
    (如果之前已连接,可能必须恢复 CPU2 才能到达等待引导循环。)

     

    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化开始...

     

    GEL:C28xx_CPU1:GEL 输出:... DCSM 初始化完成...

     

    GEL:C28xx_CPU1:GEL 输出:
    CPU2 退出复位并配置为等待引导。
    (如果之前已连接,可能必须恢复 CPU2 才能到达等待引导循环。)

     

    信息:C28xx_CPU1:GSxMSEL 寄存器配置正确

     

    信息:C28xx_CPU1:BankMuxSel 寄存器配置正确

     

    信息:C28xx_CPU2:GSxMSEL 寄存器配置正确

     

    错误:C28xx_CPU2:闪存编程器:擦除组 0 FMSTAT(某些器件上为 STATCMD)值= 65(十进制)时出错。 操作已取消 (0)。

     

    错误:C28xx_CPU2:文件加载程序:内存写入失败:未知错误

     

    错误:C28xx_CPU2:GEL:文件:C:\Data\EXAM5_2\UserData\dropins\ccs\奥迪_SSP50A_SPC_Reg_CPU2.out:加载失败。

     

    C:\ti\ccs2040\ccs\scripting\node_modules\script\SyncAgent.js:518
                               const error = new Error (err.message);
                                             ^μ s

     

    错误:文件:C:\Data\EXAM5_2\UserData\dropins\ccs\奥迪_SSP50A_SPC_Reg_CPU2.out:加载失败。
       at execCommand (C:\ti\ccs2040\ccs\scripting\node_modules\script\SyncAgent.js:518:43)
       在 Object.loadProgram (C:\ti\ccs2040\ccs\scripting\node_modules\script\SyncAgent.js:557:48)
       at file:///C:/Data/EXAM5_2/userData/dropins/CCS/test.mjs:53:23

    2) 我与测试团队确认, 读取的值是执行前的值,当变量到达该特定断点时,该变量应具有不同的值。  

    3) 如果我向您发送了 ccxml 文件,会有帮助吗?

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 我们尝试了您的建议、但如果会话 2 不是作为子会话创建的、则无法为 CPU2 加载该文件。 [/报价]

    我仍然不明白这一点,因为:

    (类似 wait DS.openSession(“C28xx_CPU1",“,"C28xx_CPU2"、"C28xx_CPU2")“))“)

    看起来与该 API 的有效语法不同。

    3) 如果我向您发送 ccxml 文件、会有帮助吗?

    实际上、更有用的是“子会话“场景的实际脚本、您可以在其中加载第二个 DSP。 还提供不起作用的脚本(为每个 CPU 创建会话实例)。

    谢谢

    Ki

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

    您好、

    感谢您的建议和帮助。 我们设法连接到 2 个内核 并加载文件(您可能会在其中看到一些等待,看起来它们是操作正常工作所需的)。

    主要问题仍然存在 — 为指定变量读取的值不正确。  

    下面是脚本:

    const {联接}=需要(“path");</s>“

    console.log (`联接---------------------------------------------------------------------------- `ć);

    //初始化脚本并获取主调试器脚本接口
    const DS = initScripting();

    console.log (`sScript init---------------------------------------------------------------------------- `ć);

    //为所有操作配置 30 秒超时
    ds.setScriptingTimeout(30000);

    console.log (`set timeout---------------------------------------------------------------- `ć);

    let {核心, nonDebugCores }= DS.listCores ();

    console.log (JSON.Stringify (ds.listCores ()、null、2));

    //配置调试器并打开到 cortex M 内核的调试会话
    DS.configure(“C:\\Data\\EXAM5_2\\UserData\\dropins\\ccs\\TMS320F28P650DK8.ccxml“);

    console.log (`ccxml Configured ------------------------------------ `ć);

    //sessionCPU1 = DS.openSession(“USB XDS2xx Texas Instruments 调试探针/C28xx_CPU1“);
    sessionCPU1 = DS.openSession(“C28xx_CPU1")“);

    console.log(`打开的会话 1----------------------------------------------------------------------------- `ć);

    仅 sessionCPU1.settings.set(“FlashEraseSelection","Selected 银行“ 银行"“")“);
    sessionCPU1.settings.set(“FlashMapC28Bank0",0);</s>“
    sessionCPU1.settings.set(“FlashMapC28Bank1",0);</s>“
    sessionCPU1.settings.set(“FlashMapC28Bank2",0);</s>“
    sessionCPU1.settings.set(“FlashMapC28Bank3",1);</s>“
    sessionCPU1.settings.set(“FlashMapC28Bank4",1);</s>“

    sessionCPU1.settings.set(“FlashC28Bank0",true);</s>“
    sessionCPU1.settings.set(“FlashC28Bank1",true);</s>“
    sessionCPU1.settings.set(“FlashC28Bank2",true);</s>“
    sessionCPU1.settings.set(“FlashC28Bank3",false);</s>“
    sessionCPU1.settings.set(“FlashC28Bank4",false);</s>“

    sessionCPU1.target.connect ();
    blockWait(5000);

    //sessionCPU2 = DS.openSession(“USB XDS2xx Texas Instruments 调试探针/C28xx_CPU2“);
    sessionCPU2 = DS.openSession(“C28xx_CPU2")“);
    console.log(`打开的会话 2------------------------------------------------------------------------- `ć);

    仅 sessionCPU2.settings.set(“FlashEraseSelection","Selected 银行“ 银行"“")“);
    sessionCPU2.settings.set(“FlashMapC28Bank0",0);</s>“
    sessionCPU2.settings.set(“FlashMapC28Bank1",0);</s>“
    sessionCPU2.settings.set(“FlashMapC28Bank2",0);</s>“
    sessionCPU2.settings.set(“FlashMapC28Bank3",0);</s>“
    sessionCPU2.settings.set(“FlashMapC28Bank4",0);</s>“

    sessionCPU2.settings.set(“FlashC28Bank0",false);</s>“
    sessionCPU2.settings.set(“FlashC28Bank1",false);</s>“
    sessionCPU2.settings.set(“FlashC28Bank2",false);</s>“
    sessionCPU2.settings.set(“FlashC28Bank3",true);</s>“
    sessionCPU2.settings.set(“FlashC28Bank4",true);</s>“


    sessionCPU2.target.connect ();
    blockWait(5000);

    console.log(`连接到两个 CPU ---------------------------------------------------------------------------- `ć);

    //加载程序
    sessionCPU1.memory.loadProgram(“C:\\Data\\EXAM5_2\\UserData\\dropins\\CCS\\SSP50A_SPC_Reg_cpu1.out“);
    console.log (`负载 1----------------------------------------------------------------------------- `ć);
    blockWait(5000);
    sessionCPU1.target.run(false);
    blockWait(6000);
    sessionCPU2.memory.loadProgram(“C:\\Data\\EXAM5_2\\UserData\\dropins\\CCS\\SSP50A_SPC_Reg_CPU2.out“);
    blockWait(5000);
    console.log (`负载 2----------------------------------------------------------------------------- `ć);

    console.log (`已加载的程序---------------------------------------------------------------------------------------- `ć);

    console.log(`添加断点-------------------------------------------------------------------------------- `ć);
    sessionCPU2.breakpoints.add(“SelfDiag_CPU2.c",532);</s>“
    BlockWait(2000);
    const connected = sessionCPU2.target.isconnected ();
    const 已暂停= sessionCPU2.target.isHalted ();
    console.log (`连接状态→已连接:${Connected}、已停止:${Halted}\n`);
    console.log (`S无符号运行的调试程序---------------------------------------------------------------------------- `ć);
    sessionCPU2.target.run();
    console.log(`S已开始运行但没有符号)------------------------------------------------------------------------ `ć);
    blockWait(5000);
    const value1 = sessionCPU2.Expressions.evaluate(“SelfDiag_CPU2_HV_DiagActive_U16")“);
    console.log (`变量读取${value1}\n`);
    blockWait(500);
    sessionCPU2.target.stepOver ();
    blockWait(1000);
    const value2 = sessionCPU2.Expressions.evaluate(“SelfDiag_CPU2_HV_DiagActive_U16")“);
    console.log (`变量读取${value2}\n`);
    sessionCPU2.target.StepInto();
    sessionCPU2.target.StepInto();
    const value3 = sessionCPU2.Expressions.evaluate(“ADC_CPU2_Sys_SI_values_1ms_st.U_DC_Link_Total_F32")“);
    console.log (`变量读取${value3}\n`);

    //关闭调试器
    ds.shutdown ();

    函数 blockWait(ms){
    const end = Date.now()+ ms;
    while (Date.now()< end){/*有意阻止*/}
    }

    读取的 3 个值为 0、它们应该为非零值。

    原因可能是什么?

    另外,我不确定我已经提到过的内容 — 对于 CPU1、读取似乎可以正常使用。

    此致、

    DANA

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

    而不是:

    const value1 = sessionCPU2.Expressions.evaluate(“SelfDiag_CPU2_HV_DiagActive_U16")“);

    我想:

    LET ADDRESS = sessionCPU2.symbols.getAddress(“SelfDiag_CPU2_HV_DiagActive_U16")“);

    令值= Session.memory.readOne (address);

    您能尝试一下吗?

    此外、还涉及:

    blockWait (5000);

    为什么代码中有这些调用? 请注意、CCS Scripting API 应该是同步(阻止)调用。

    谢谢

    Ki

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

    再次感谢您的及时答复。 我们尝试了您的建议并更新了获取变量值的方式、但没有任何区别。

    是否 需要配置任何可能错过的 CPU2 选项?

    谢谢、

    DANA

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

    Dana,

    我建议或许使用 IDE 调试可见性来调试脚本。 请参阅用户指南中的以下部分“

    https://software-dl.ti.com/ccs/esd/documents/users_guide_ccs/ccs_debug-scripting.html#debugging-a-script

    特别是“IDE 可见性“小节。 当您逐步执行脚本时、您可以看到 CCS IDE 实例使用脚本中的操作进行更新。 当您进入脚本中读取变量的部分时、您可以看到变量值在 CCS IDE 中是多少、并与 API 返回的值进行比较。

    希望这有所帮助

    Ki

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

    谢谢你。 我们将尝试这样做、并希望它能对正在发生的事情带来一些澄清。