问题:
想把MSMC配置为不需要cache的一块区域,目前是通过配置XMPAXH、XMPAXL、MAR寄存器实现,现在有个问题,我能否在paltform中建一个段
MSMC_SRAM_NOCACHE,start=0x50000000, len=0x00400000,我在.cfg文件中可以指定变量到这个段中吗?我现在指定之后程序直接跑不起来。
代码如下:
/* 配置XMP */
#define MAR_BASE_ADDR (0x01848000)
void Cache_MSMC_initial(Uint32 index,Uint32 bAddr,Uint8 segSize,Uint32 rAddr)
{
CSL_XMC_XMPAXH mpaxh; // 存储保护和地址扩展寄存器(H)
CSL_XMC_XMPAXL mpaxl; // 存储保护和地址扩展寄存器(L)
/******************** 地址重映射 *********************/
mpaxh.bAddr = bAddr; // 基地址(匹配逻辑地址的高位地址)
mpaxh.segSize = segSize; // 重映射区段大小
// 设置XMPAXH寄存器. Writes:XMC_XMPAXH_SEGSZ,XMC_XMPAXH_BADDR.
CSL_XMC_setXMPAXH (index, &mpaxh);
// 设置该区段地址的访问权限
mpaxl.ux = 1;
mpaxl.uw = 1;
mpaxl.ur = 1;
mpaxl.sx = 1;
mpaxl.sw = 1;
mpaxl.sr = 1;
mpaxl.rAddr = rAddr;
// 设置XMPAXL寄存器.
CSL_XMC_setXMPAXL (index, &mpaxl);
// 读取XMPAXL寄存器.
CSL_XMC_getXMPAXL (index, &mpaxl);
/******************** 地址重映射 *********************/
*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0; //关闭重映射地址处cache
}
/* 在evm_init中调用 */
void EVM_init()
{
….
Cache_MSMC_initial(3, 0x50000, 21, 0xc000);
}
/* cnf文件中指定段 */
Program.sectMap[".alg_data_core0"] = "MSMC_SRAM_NOCACHE";
Shine:
可以在cfg文件中指定变量到这个段中。请跟踪一下代码具体怎么跑不起来?
Nancy Wang:
0x50000000是reserved memory地址,您是尝试remap这段地址了吗?
kun kun:
我现在的做法是直接将变量的地址幅值为0x50000000+offset,可以访问。但是我用EDMACC1把SRC地址DST都设置为MSMC内部地址时,搬运失败;我把SRC选择为MSMC内部地址,DST为DDR3地址,搬运失败;把SRC、DST都设置为DDR3地址,搬运成功,不知道是什么问题导致的,麻烦帮忙看看,谢谢
kun kun:
回复 Nancy Wang:
是的,我是remap了这段地址,不map的话会被强制cache,但我由不需要cache,所以remap了一下,然后配置map设置cache属性。
kun kun:
回复 kun kun:
但是如果我不映射,直接使用0xc000000,这个msmc地址的话,EDMA的SRC、DST都设置在MSMC内部,是可以搬运成功的。现在就是不知道映射到了新的地址使用EDMA会有问题吗?
kun kun:
回复 Shine:
我是在EVM_init中映射MSMC地址,这样会不会比较晚了?
Nancy Wang:
回复 kun kun:
You can't access or run the program on the "Reserved memory location" and you would get unexpected behavior CPU hung,Emulator hung etc.,
您访问这段地址有提示错误吗?
这个帖子参考一下。
e2e.ti.com/…/669400
Shine:
回复 kun kun:
EVM_init代码不放在MSMC里吧?
kun kun:
回复 Shine:
谢谢您的回答:
EVM_init的代码没有放在MSMC里,我的意思是MSMC重映射的代码是放在EVM_init里面的。我的错误类似您上面说的那个问题,帖子的内容是说不能映射到保留区域?0x50000000也不行?谢谢
Shine:
回复 kun kun:
通过MPAX映射的0x50000000这个地址是逻辑地址,可以映射。您跟一下代码,看运行到哪里出错了?