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.

TMS320C6657: L1D配置为SRAM,并在L1D中定义了大小为32KB的数组,且在代码中进行读写时,系统运行不正常

Part Number: TMS320C6657


我在初始化中将L1D的缓存大小设置成0,即不适用缓存,全部配置成SRAM,代码如下:

void drv_cache_init(void)
{
CACHE_setL1DSize(CACHE_L1_0KCACHE);
CACHE_setL1PSize(CACHE_L1_0KCACHE);
CACHE_setL2Size(CACHE_0KCACHE);
}

在cmd文件中定义了L1D MEMORY,以及section,如下:

CORE0_L1D_SRAM:  o = 0x10F00000 l = 0x00008000   /* 32kB L1D/SRAM */

.meml1d    >  CORE0_L1D_SRAM

在cmd中将其他数据和指令都是分配在L2里的;

然后在一个测试文件中定义了一个大小32KB(与L1D SRAM的大小相同)的数组,并放入到L1D中,定义如下:

#pragma DATA_SECTION(dataL1D,".meml1d")

uint16_t dataL1D[0x4000];

在测试代码A中用for循环对数组进行赋值和读出;

测试代码A是由串口指令触发的,收到特定指令时,就会进入测试代码。

出现的现象是这样:

1.当屏蔽测试代码A时,整个程序可以正常运行,正常接收串口指令,其他测试代码可以正常进行;

2.不屏蔽测试代码A时,整个程序运行就不正常,要么是跑飞,要么是无法收到串口指令,其他测试代码也不能正常进行;

3.把dataL1D数组大小减半时,又和现象1一样,能正常运行。

 

那我的问题是:

L1D全部配置成SRAM时,使用上是存在着什么限制吗?

  • L1D全部配置成SRAM时,使用上是存在着什么限制吗?

    应该是没有限制的,

    3.把dataL1D数组大小减半时,又和现象1一样,能正常运行。

    看一下生成的map文件,数组大小为未减半前,是否占用内存溢出了?

  • map文件中与L1D空间相关的地方:

    run origin  load origin   length   init length attrs members

    10f00000 10f00000 00008000 00000000 rw-
    10f00000 10f00000 00008000 00000000 rw- .meml1d

    output attributes/
    section page origin length input sections
    -------- ---- ---------- ---------- ----------------

                      1082bd23    0000000b     (.cinit..meml1d.load) [load image, compression = rle]

    .meml1d 0 10f00000 00008000 UNINITIALIZED
                      10f00000 00008000 test_memory_cmp.obj (.meml1d)

    .meml1d: load addr=1082bd23, load size=0000000b bytes, run addr=10f00000, run size=00008000 bytes, compression=rle

  • 看一下MEMORY CONFIGURATION部分,应该会显示used和unused部分的空间。

  • CORE0_L1D_SRAM used 00008000,unused 00000000

    MEMORY CONFIGURATION

    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    LOCAL_L2_SRAM 00800000 00100000 00000000 00100000 RWIX
    LOCAL_L1P_SRAM 00e00000 00008000 00000000 00008000 RWIX
    LOCAL_L1D_SRAM 00f00000 00008000 00000000 00008000 RWIX
    MSMSRAM 0c000000 00100000 00008000 000f8000 RWIX
    CORE0_L2_SRAM 10800000 00100000 0002c6c9 000d3937 RWIX
    CORE0_L1P_SRAM 10e00000 00008000 00000000 00008000 RWIX
    CORE0_L1D_SRAM 10f00000 00008000 00008000 00000000 RWIX
    CORE1_L2_SRAM 11800000 00100000 00000000 00100000 RWIX
    CORE1_L1P_SRAM 11e00000 00008000 00000000 00008000 RWIX
    CORE1_L1D_SRAM 11f00000 00008000 00000000 00008000 RWIX
    EMIF16_CE0 70000000 04000000 00000000 04000000 RWIX
    EMIF16_CE1 74000000 04000000 00000000 04000000 RWIX
    EMIF16_CE2 78000000 04000000 00000000 04000000 RWIX
    EMIF16_CE3 7c000000 04000000 00000000 04000000 RWIX
    DDR3_SRAM 80000000 20000000 00008000 1fff8000 RWIX

  • 看map文件没看出问题,并且也没有内存相关的报错,先简化代码,只在工程中对dataL1D赋值操作,看看有没有问题。或者增加堆栈看一下是否有改善。