TI中文支持网
TI专业的中文技术问题搜集分享网站

咨询有关XMC的问题

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 目前暂时没错

谢了!

赞(0)
未经允许不得转载:TI中文支持网 » 咨询有关XMC的问题
分享到: 更多 (0)