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.

[参考译文] TMS570LC4357:启用高速缓存时进行调试

Guru**** 2468460 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1072497/tms570lc4357-debugging-while-cache-is-enabled

部件号:TMS570LC4357
“线程: HALCOGEN测试”中讨论的其它部件

早上好,

我正在尝试启用高速缓存的 TMS570LC4357。 调试期间,Expression 选项卡中的全局变量的所有实时值均为零。

软件停止后,变量的值将被可视化。

如果我尝试禁用缓存,我也可以实时可视化变量值。 但是,禁用高速缓存会导致更糟糕的执行时间。

如何执行实时调试以保持高速缓存处于活动状态?

亚历克斯

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

    亚历克斯:

    当程序运行时,DAP 用于执行读取,当程序挂起时,CPU 用于执行读取。 从 CPU 读取可以从高速缓存获取数据,从 DAP 读取只能访问内存。 因此,如果 CPU 正在更新缓存中的变量,则 DAP 将无法在程序运行时看到更新后的值。

    您可以更改内存区域的 MPU 设置,以配置缓存的直写而不是回写。

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

    应设置哪些寄存器来配置缓存以进行直写?

    我在数据表中找不到这些信息。

    谢谢

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

    亚历克斯:

    ARM TRM 中的 MPU 章节:

    https://developer.arm.com/documentation/ddi0460/d/Memory-Protection-Unit

    您可以通过 HALCOGEN MPU 配置更改它:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="496915" url="~ë/support/icls/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1072497/tms570lc4357-debugging-while cache-is -enabled /3970041#3970041"]应设置哪些寄存器来配置高速缓存[以进行写入]

    如果您只有几个需要监视的变量,并且没有高速更新,则可以选择插入代码,以便在每次更新后对全局变量的地址范围执行缓存清除。 请参阅  
    CCS/RM57L843:在连续刷新模式下无法获取全局变量的值- 例如 CCS 7.1调试。

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

    我按照您的建议配置 MPU,但仍有相同的问题

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

    亚历克斯:

    我做了类似的测试。  

    1.定义数据部分.sharedRAM:

    #pragma set_data_section (".sharedRAM")
    UINT16 myValue =0;
    #pragma set_data_section()

    2.将内存部分配置为直写:从0x0807c000到0x08080000

     

    3.将数据部分.sharedRAM 分配到0x0807C000

    内存

    矢量(X):原点=0x00000000长度=0x00000020
    FLASH0 (RX):Origal=0x00000020 Length=0x001FFFE0
    FLASH1 (RX):原点=0x00200000长度=0x00200000
    堆栈(RW):原点=0x08000000长度=0x00001500
    RAM (RW):原点=0x08001500长度=0x0007AB00
    SHAREDRAM (RW):原点=0x0807C000长度=0x00004000

    }

    /*用户码开始(4)*/
    /*用户代码结束*/


    /*----------------- *
    /*区段配置*/

    章节

    /*用户代码开始(5)*/
    /*用户代码结束*/
    .intvecs:{}>矢量
    文本对齐(32):{}> FLASH0 | FLASH1
    const align(32):{}> FLASH0 | FLASH1
    电影对齐(32):{}>电影 H0|电影 H1
    Pinit align(32):{}> FLASH0 | FLASH1
    .bss:{}>内存
    数据:{}>内存
    sysmem:{}>内存

    /*用户码开始(6)*/
    沙格拉姆:{}>沙雷德姆
    /*用户代码结束*/
    }

    4.运行 while ()时更新全局变量

    myValue +=12;
    While (1);

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

    你好,QJ,早上好,谢谢你的支持。

    当我执行建议的测试时 ,我的软件会在 b 预取条目行停止。

    如果我尝试在 ram 中执行函数,而不是在 flash 中执行函数,也会发生同样的情况。

    亚历克斯

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

    只需检查我的 MPU 设置。 很抱歉,我复制/通过了另一个 HAL 项目的 MPU 设置。 正确答案是:

    这是我的链接程序 cmd 文件:


    内存

    /*用户代码开始(2)*/
    /*用户代码结束*/
    矢量(X):原点=0x00000000长度=0x00000020
    FLASH0 (RX):Origal=0x00000020 Length=0x001FFFE0
    FLASH1 (RX):原点=0x00200000长度=0x00200000
    堆栈(RW):原点=0x08000000长度=0x00001500
    RAM (RW):原点=0x08001500长度=0x0007db00

    /*用户码开始(3)*/
    /*RAM (rw):Origy=0x08001500 length=0x0007db00*/
    SHAREDRAM (RW):原点=0x0807F000长度=0x0001000
    /*用户代码结束*/
    }

    /*用户码开始(4)*/
    /*用户代码结束*/


    /*----------------- *
    /*区段配置*/

    章节

    /*用户代码开始(5)*/
    /*用户代码结束*/
    .intvecs:{}>矢量
    文本对齐(32):{}> FLASH0 | FLASH1
    const align(32):{}> FLASH0 | FLASH1
    电影对齐(32):{}>电影 H0|电影 H1
    Pinit align(32):{}> FLASH0 | FLASH1
    .bss:{}>内存
    数据:{}>内存
    sysmem:{}>内存

    /*用户码开始(6)*/
    沙格拉姆:{}>沙雷德姆
    /*用户代码结束*/
    }

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

    好的,谢谢,现在我能够实时显示变量的状态!

    我还有一个相关问题:

    按照您的建议使用内存配置,如果我尝试移动 RAM 内存中的某个函数,软件流将在以下代码行中出现:

      

    当软件进入将在“sharedRAM”部分执行的功能时,我的流程就会停止,就像在上图中一样。

    我还报告了一个主要流程示例,以更好地解释我的问题

    谢谢

    亚历克斯

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

    亚历克斯:

    使用#pragma code_section 不会自动将代码复制到 RAM 中。 您必须将代码部分分配给 RAM,并手动将代码复制到 RAM。

    1.链接器 CMD 文件:

    将.sharedRAM 部分更改为:

    sharedRAM:run=SHAREDRAM, load = FLASH0|FLASH1,load_start (ulLoadStart), load_size (ulSize),run_start (ulRunStart)

    2.在 C 文件中,例如 startup.c

    将链接程序 cmd 文件中定义的以下变量添加为全局变量  

    外部 UINT32 ulLoadStart;
    外部 UINT32 ulSize;
    外部 UINT32 ulStartAddr;

    void _c_int00 (void)(无效)

       (笑声) (笑声)

       Memcpy (&ulRunStart,&ulLoadStart,(UINT32)等);

       (笑声) (笑声)

       main();

    }

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

    QJ 您好,

    我做了你上面提议的事情。

    当执行在 ram 中复制的函数的 trampoline 指令(我链接汇编程序指令的图像)时,软件仍会锁定在完美输入指令中。

    亚历克斯

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

    我解决了这个问题。

    将 RAM 扇区的区域权限配置为:PRIV_RW_USER_RW_EXEC 全部工作正常!

    谢谢