Other Parts Discussed in Thread:SYSBIOS
大家好 问一下有关XMC的问题
在网上找到个有关XMC的例程:blog.csdn.net/…/108962336
实现了0x0c000000到0x20100000的4M内存映射
Cache_MSMC_initial(3,0×20000,21,0x00C000);
#include <ti/csl/csl_xmc.h>
#include <ti/csl/csl_xmcAux.h>
#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
}
现在有几个问题就是:
1 Cache_MSMC_initial(3,0×20000,21,0x00C000);里的0x20000如何对应上0x20100000 0x00C000如何对应上0x0c000000?
2 #define MAR_BASE_ADDR (0x01848000) 这个地址是什么意思 在手册里查不到?
3 最后的*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0; 关闭的是谁的cache?我算了下MAR_BASE_ADDR+ 4*(bAddr>>24)还等于0x01848000
skysteed:
大家好 经过测试 实际是0x0c000000 对应到了 0x20000000 和 0x20100000 segSize是21 应该是4M 但好像没有映射成4M
0x0c100000 也对应到了0x20000000 和 0x20100000
,
skysteed:
第二个 第三个问题 没明白*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0 不执行这个 可以不???
,
Nancy Wang:
1.BADDR对应是将32位的逻辑地址的高20位,RADDR对应的是36位物理地址的高24位,再根据段大小可在Table 2-1 MPAX Segment Size Encoding中找到SEGSZ对应的值。
应该是0x0c000000到0x20000000的映射吧。
2、MAR_BASE_ADDR基地址请查看 4.4.4 Memory Attribute Registers (MARn)
3.根据Table 4-20 Memory Attribute Registers (Part 1 of 6)查对应的地址范围。
MAR_BASE_ADDR+ 4*(bAddr>>24)应该是基地址+80
www.ti.com.cn/…/tms320c6657.pdf
,
skysteed:
谢谢Nancy Wang
大体上明白了 实际对应的是0x0c000000到0x20000000 segSize是21 就是4M segSize是20 就是2M segSize是19 就是1M
MAR_BASE_ADD如下:
*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0;在程序里bAddr是0x20000 应该用0x20000000?
程序写错了难道是*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>12))= 0x0;
这个作用是关闭新映射的地址0x20000000的cache功能
,
Nancy Wang:
bAddr定义的是32位的是0x20000000。
,
skysteed:
嗯 定义的是32 那也应该是0x00020000 不应该是0x20000000 区别很大啊
我用这种方法在裸机程序 貌似用着没问题
但在sys/bios下 一执行完Cache_MSMC_initial(3,0×20000,19,0x00C000); 再执行下一句 sys/bios就会报异常 提示如下:
[C66xx_0] 822ab8 B23=0xfffffffeB24=0x15000100 B25=0x10832ec0B26=0x4c1084a1 B27=0x10832ec0B28=0x0 B29=0x1B30=0x1000000 B31=0x2NTSR=0x1000cITSR=0x0IRP=0x0SSR=0x0AMR=0x0RILC=0x0ILC=0x0Exception at 0x1080fa58EFR=0x40000000 NRP=0x1080fa58UMC Exception MPFAR=0x1848000 MPFSR=0x110Security violation, Local L1/L2 cache memory FaultSupervisor Write violation, Fault ID=0x0ti.sysbios.family.c64p.Exception: line 256: E_exceptionMax: pc = 0x10832ec0, sp = 0x108288c2.xdc.runtime.Error.raise: terminating execution
所以是不是*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0 给错了???
,
Nancy Wang:
不好意思,我搞错了,这么分析来看好像是有点问题,可以自己实现的。
sys/bios下可通过Cache_setMar() 来实现 , CSL下可直接给MAR[i]赋值,目的就是关闭0x20000000的cache。
,
skysteed:
嗯好的
在裸机下*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0用着暂时没出啥错在SYS/BIOS下改为*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>12))= 0x0 目前暂时没错
谢了!