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.

咨询有关XMC的问题

Other Parts Discussed in Thread: SYSBIOS

大家好 问一下有关XMC的问题

在网上找到个有关XMC的例程:blog.csdn.net/.../108962336
实现了0x0c000000到0x20100000的4M内存映射

Cache_MSMC_initial(3,0x20000,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,0x20000,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 

  • 大家好 经过测试 实际是0x0c000000 对应到了   0x20000000 和 0x20100000   segSize是21 应该是4M 但好像没有映射成4M

                                          0x0c100000 也对应到了0x20000000 和 0x20100000 

  • 第二个 第三个问题 没明白
    *(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0 不执行这个 可以不???
  • 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
  • 谢谢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功能

  • bAddr定义的是32位的是0x20000000。
  • 嗯 定义的是32 那也应该是0x00020000 不应该是0x20000000 区别很大啊

    我用这种方法在裸机程序 貌似用着没问题

    但在sys/bios下 一执行完Cache_MSMC_initial(3,0x20000,19,0x00C000); 再执行下一句 sys/bios就会报异常 提示如下:

    [C66xx_0] 822ab8 B23=0xfffffffe
    B24=0x15000100 B25=0x10832ec0
    B26=0x4c1084a1 B27=0x10832ec0
    B28=0x0 B29=0x1
    B30=0x1000000 B31=0x2
    NTSR=0x1000c
    ITSR=0x0
    IRP=0x0
    SSR=0x0
    AMR=0x0
    RILC=0x0
    ILC=0x0
    Exception at 0x1080fa58
    EFR=0x40000000 NRP=0x1080fa58
    UMC Exception MPFAR=0x1848000 MPFSR=0x110
    Security violation, Local L1/L2 cache memory Fault
    Supervisor Write violation, Fault ID=0x0
    ti.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 给错了???

  • 不好意思,我搞错了,这么分析来看好像是有点问题,可以自己实现的。
    sys/bios下可通过Cache_setMar() 来实现 , CSL下可直接给MAR[i]赋值,目的就是关闭0x20000000的cache。
  • 嗯好的
    在裸机下*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>24))= 0x0用着暂时没出啥错

    在SYS/BIOS下改为*(unsigned int *)(MAR_BASE_ADDR+ 4*(bAddr>>12))= 0x0 目前暂时没错

    谢了!