“线程: HALCOGEN, 测试”中讨论的其它部件
早上好,
我正在尝试启用高速缓存的 TMS570LC4357。 调试期间,Expression 选项卡中的全局变量的所有实时值均为零。
软件停止后,变量的值将被可视化。
如果我尝试禁用缓存,我也可以实时可视化变量值。 但是,禁用高速缓存会导致更糟糕的执行时间。
如何执行实时调试以保持高速缓存处于活动状态?
亚历克斯
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。 调试期间,Expression 选项卡中的全局变量的所有实时值均为零。
软件停止后,变量的值将被可视化。
如果我尝试禁用缓存,我也可以实时可视化变量值。 但是,禁用高速缓存会导致更糟糕的执行时间。
如何执行实时调试以保持高速缓存处于活动状态?
亚历克斯
亚历克斯:
ARM TRM 中的 MPU 章节:
https://developer.arm.com/documentation/ddi0460/d/Memory-Protection-Unit
您可以通过 HALCOGEN MPU 配置更改它:


如果您只有几个需要监视的变量,并且没有高速更新,则可以选择插入代码,以便在每次更新后对全局变量的地址范围执行缓存清除。 请参阅
CCS/RM57L843:在连续刷新模式下无法获取全局变量的值- 例如 CCS 7.1调试。
亚历克斯:
我做了类似的测试。
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);

只需检查我的 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)*/
沙格拉姆:{}>沙雷德姆
/*用户代码结束*/
}
亚历克斯:
使用#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();
}