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/RM57L843:无法在连续刷新模式下获取全局变量的值- CCS 7.1调试

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/600515/ccs-rm57l843-can-not-get-the-value-of-global-variable-in-continuous-refresh-mode---ccs-7-1-debug

器件型号:RM57L843
主题中讨论的其他器件:LAUNCHXL2-RM57LLAUNCHXL2-570LC43HALCOGEN

工具/软件:Code Composer Studio

尊敬的专家:

我尝试调试 在 LAUNCHXL2-RM57L 套件上运行的代码。 但我无法在 CCS 7.1调试窗口中获取"temp"全局变量的值。

我还看到我们论坛上描述相同问题的主题:

https://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/413892?tisearch=e2e-sitesearch&keymatch=continuous%20refresh%20ccs%206.1

但我看到这个问题还没有解决。 是否有人可以帮助我解决或解决此问题?

非常感谢。

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

    您指向的帖子中也发布了包含已验证答案的相关工作。 该问题的原始海报也表明在实施相关工作时取得了成功。

    尽管如此、RM57的行为可能与它采用缓存存储器的行为稍有不同。 为了使全局变量更加一致和可用、您可能希望将存储器配置为通过存储器写入。 此外、如果您使用全局或静态关键字声明变量、以确保它们在应用程序中的所有上下文中都被保留、这可能会有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chuck 先生:

    我已经制作了 test.gel 文件并添加到 CCS 7.1中。 但我得到以下错误:

    CortexR5:GEL:加载文件时遇到问题:Blinky.out 无法打开文件
    LoadSymbolsForDAP()无法计算。
    加载文件 Blinky.out 时遇到问题
    无法打开文件
    在 GEL_SymbolLoad ("blinky.out")[test.gel:2]
    在 LoadSymbolsForDAP()上

    test.gel 文件包含以下代码:

    MenuItem "DAP_Access";
    Hotmenu LoadSymbolsForDAP(){GEL_SymbolLoad("blinky.out");

    您能向我展示一下将.gel 文件添加到 CCS7.1的进度吗?
    非常感谢。

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

    [引用 user="hung ">我尝试调试 在 LAUNCHXL2-RM57Lkit 上运行的代码。 但我无法在 CCS 7.1调试窗口中获取"temp"全局变量的值。使用 CCS 7.2.0.00012时发现、当使用 LAUNCHXL2-570LC43时、CCS 调试器可以在程序运行时从器件读取。 例如、当程序正在运行时、表达式视图可以持续刷新 正在运行的程序正在更新的 GioB_dout GPIO 外设寄存器的值。

    但是、当正在运行的程序在 SRAM 存储器区域上启用缓存并进行回写操作时、运行程序更新的全局变量的值在程序运行时未正确显示、 在中、表达式视图在程序运行时将值显示为零。 当程序被暂停时、全局变量被正确显示。

    这是因为当程序正在运行时、DAP 被用来执行读取、而当程序被暂停时、CPU 被用来执行读取。 从 CPU 读取可以从高速缓存获取数据、从 DAP 读取只能访问内存。 因此、如果 CPU 正在更新高速缓存中的变量、DAP 将无法在程序运行时看到更新的值。

    可能的选项包括:

    1) 1)更新程序运行时需要观察的变量后、执行缓存清理操作、以将更新后的值写入内存。

    2) 2)放置程序在缓存禁用存储器中运行时需要观察/更改的变量。

    3) 3)更改 SRAM 存储器区域的 MPU 设置、以将缓存配置为通过写而不是回写。

    4) 4)禁用高速缓存。

    选项1)对正在运行的程序的性能影响最小。 例如 、在 LAUNCHXL2-570LC43上运行的程序中具有以下全局变量、其中 HALCoGen 已配置为启用缓存:

    unsigned int num_interrupts; 

    初始程序只是在中断例程中递增 num_interrupts 变量:

    void rtiNotification (rtibase_t * rtiREG、uint32通知)
    {
    //在用户代码开始和用户代码结束之间输入用户代码。 *
    gioToggleBit (gioPORTB、6);
    gioToggleBit (gioPORTB、7);
    num_interrupts++;
    } 

    在程序运行时使用上述代码、CortexR5的 CCS 调试器表达式视图报告 num_interrupts 的值为零、因为仅在 CPU 缓存中更新。

    然后、中断例程被修改为执行缓存清理、以便在每次更新后将 num_interrupts 变量写回存储器:

    void rtiNotification (rtibase_t * rtiREG、uint32通知)
    {
    //在用户代码开始和用户代码结束之间输入用户代码。 *
    gioToggleBit (gioPORTB、6);
    gioToggleBit (gioPORTB、7);
    num_interrupts++;
    
    /*在包含 num_interrupts 的高速缓存行上执行"通过 MVA 到 PoC"清理数据高速缓存行
    *将修改后的高速缓存行写回内存的变量。 这允许更改 num_interrupts 变量
    由于 DAP 仅访问存储器、因此在程序继续运行时由 DAP 监控
    *并且没有硬件高速缓存一致性。
    *
    *由于 num_interrupts 是一个32位整数、因此它不会占用一个32字节 Cortex-R5高速缓存行、
    *因此一个操作就足够了。
    *
    _mcr (15、0、(无符号整型)&num_interrupts、7、10、 1);
    } 

    在进行上述修改的情况下、当程序运行 针对 CortexR5的 CCS 调试器表达式视图时、显示了对 num_interrupts 变量的更新。

    从 HALCoGen 04.06.00开始、似乎没有任何函数可执行缓存管理操作、因此使用 TI ARM _MCR 编译器内在函数来访问协处理器寄存器以执行 ARM Cortex-R5缓存操作

    随附了示例 CCS 工程  

    e2e.ti.com/.../1738.TMS570LC4357_5F00_rtiblinky.zip

    编辑:澄清了对 SRAM 存储器区域的缓存集进行了写回测试。

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

    您能否确认 Chester 的非常详细和准确的帖子确实解决了您在运行时访问全局变量的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chuck 先生和 Chester 先生:

    非常感谢您的大力支持。 我已经解决了我的问题。

    Hung Dang。