想把L2空间一部分设置成缓存,缓存大小为64kb,把DDR上最开始的16M设置成cacheable,我是这样配置的:L2CFG=0x2h;L2INV=1;MAR128=0XFFFFFFFFh;不知这样有没有问题。
我的问题是这样的:
1.不知道L2INV作用是什么,最低位设置成0和1的作用是什么?这点我没有没有看懂文档。
2.我知道要把MAR128寄存器的某个位设置成1,地址8000 0000h~80FF FFFFh区间才会成为cacheable,但不知道应该是哪一位,所以索性把MAR128=0XFFFFFFFFh。请高手指点迷津,给个文档链接。
3.缓存设成了64kb,不太清楚缓存使用了L2空间的哪一部分?是默认采用L2高位地址还是L2地位地址区间或者其他,不甚明了。
等候高手解答。thanks。
v king:
回复 Tony Tang:
L2INV我还是不太明白。
文档上说L2INV的最低位:
0~代表 “normal operation”,
1~代表“All L2 cache lines are invalidated.”
我的理解是,“0”时,L2正常缓存外存的内容;“1”时,L2就不再缓存外存的数据,相当于外存的内容跳过L2直接进入L1缓存和DSP内核。
你能给分别解释下0和1代表的含义不?另外我咋使用这个寄存器?thank you。
v king:
回复 Tony Tang:
你好 Tony Tang,非常感谢你的回答。
但是L2INV我还是不太明白。
文档上说L2INV的最低位:
0~代表 “normal operation”,
1~代表“All L2 cache lines are invalidated.”
我的理解是,“0”时,L2正常缓存外存的内容;“1”时,L2就不再缓存外存的数据,相当于外存的内容跳过L2直接进入L1缓存和DSP内核。
你能给分别解释下0和1代表的含义不?另外我咋使用这个寄存器?thank you。
v king:
回复 Tony Tang:
thank you,Tony Tang.非常感谢你详细的回答。
我还有两事不明。
1.在编写程序时,当某一个计算(比如是对一个大数组的处理)完成时,就需要一个命令把数据从缓存写回到内存,此时可以指定cache 为invalid或者不指定invalid,不知道是不是这样?(是不是也可以解释我以前程序的一个错误:以前我只在程序开头配置了一下缓存,程序中间过程没有对缓存做任何处理,也就是说中间所有的数据都没有写回,因此造成了一些 “中间结果及最终结果”的错误)
2.当数据处理步骤非常多时,好像不停的写回比较麻烦,是不是这本来就很麻烦,没有捷径?
《TMS320C64x+ DSP Cache User's Guide》这个文档我研究的还不是很仔细,还要再看看。以后希望有不会的地方再请教您。
非常感谢你的回答。
v king:
回复 Tony Tang:
To Tony Tang,
非常感谢你的解释。
v king:
回复 Tony Tang:
Tony Tang 你好,看了这三个文档后,【1】《TMS320C6424.pdf》【2】《TMS320C64x+ DSP Megamodule Reference Guide》缓存部分【3】《TMS320C64x+ DSP Cache User's guide》全文依然不太会配置缓存,希望得到你的指教。问题有些多哈。我用的是C6424芯片,c6424的L1P、L1D、L2地址映射如下(L1P、L1D、L2都分为两大部分):/*********************************************/start end size0x0080 0000 0x0081 FFFF 128K L2 RAM/Cache0x00E0 8000 0x00E0 FFFF 32K L1P RAM/Cache0x00F0 4000 0x00F0 FFFF 48K L1D RAM0x00F1 0000 0x00F1 7FFF 32K L1D RAM/Cache
0x1080 0000 0x1081 FFFF 128K L2 RAM/Cache0x10E0 8000 0x10E0 FFFF 32K L1P RAM/Cache0x10F0 4000 0x10F0 FFFF 48K L1D RAM0x10F1 0000 0x10F1 7FFF 32K L1D RAM/Cache/*******************************************/我的问题如下:问题1:为什么L1P、L1D、L2分了这么多部分?是不是每一部分都可以使用?我试了下,应该没一部分都可以使用,但是如果把程序、数据放到L1P/L1D/L2上,程序总是跑飞,不知道配置时有什么主意事项?问题2:对于c6424,设置缓存大小时,cache在高地址、RAM在低地址,如果我配置L1P cache=16KB、L1D cache为16KB、L2 cache为32KB,cache的地址应该是哪一部分(上面的地址区间太多了)?然后我就可以把剩下的memory配置到cmd文件中。问题3:另外是先在cmd中配置RAM大小(放程序和数据,且main函数配置的cache地址和cmd中的地址不冲突),然后在main函数中利用没有使用的空间配置cache吗?问题4:L1P cache默认大小是多少?起始地址应该是什么呢?问题5:L1D cache不在main函数中配置,也能缓存L2和external memory 的程序,和文档【3】不符啊,不知道为什么?问题6:这样配置不知道有没有问题?配置如下:(L1P、L1D、L2是我定义的int类型数据,因为在文档【3】27页中,有“Read back L1PCFG. This stalls the CPU until the mode change completes.”不太理解,就这样配置了)/****************************************************/void main( void ){ extern Int16 EVM6424_init(); EVM6424_init(); //CPU Init
CACHE_L1PCFG = 0x00000003; // L1P on, L1P = CACHE_L1PCFG; CACHE_L1PINV = 1; // 1->L1P invalidated
CACHE_L1DCFG = 0x00000003; // L1D on, L1D = CACHE_L1DCFG; CACHE_L1DINV = 1; // L1D invalidated
CACHE_L2CFG = 0x00000004; // 0-cache disabled;1-32k;2-64kb;3-128kb;4-256kb;5~7-maxinum cache L2 = CACHE_L2CFG; CACHE_L2INV = 1; //1- all L2 cache lines are invalidated, 0-normal operation
MAR_128=0xFFFFFFFF;……(以下代码省略)/*************************************************/问题7:请问哪里可以找到cache配置的例程?光看文档也不是很清楚咋配置,急切需要一些例子。问题8:由于内存分配或者stack溢出而出现的程序跑飞怎么排查?(这个问题好像有点大了)
以上问题有些多,回答起来肯定比较麻烦,还是希望您百忙之中给予解答,非常感谢!最后,您能不能给我一个您的邮箱,有些截图我无法放当这个帖子中,希望能发邮件给你,Thank you!