Part Number:TMS320C6678
使用 C64 库 的API
Cache_setMar();
使缓存在共享内存0x0c00 0000 开始,长度为0x0040 0000 的区域数据读取不通过缓存,直接读写物理地址。(尝试这样做没有成功,目前没有分配L2缓存,只分配了L1)
这样的操作可行吗?
不可行的话,怎么使某一片内存不通过缓存直接读写物理地址呢?
Nancy Wang:
请问是想修改MAR12的长度吗?应该是不行的,范围已经固定了。
,
Renran:
不是想改变长度。想对MAR12内存段寄进行读写的时候,不通过缓存,直接读写物理地址,从而避免缓存一致性的问题。
,
Renran:
正常情况下向共享内存写数据应该在写之后加入缓存回读,读之前缓存失效。通过Cache_setMar() MAR12 第0bit写0之后,按照我的理解,应该不需要再进行回读和失效的操作才对,但是数据还是写到了L1D缓存上。
,
Renran:
上午测试了一下,想向0x01848030 写0,结果是;地址上的数据是1,这个地址不能直接写吗?文档中有 “ The MAR registers are onlywriteable by Supervisor code. ” ,这是什么意思呢?
,
Nancy Wang:
通过CACHE_enableCaching配置看看。
ti-processor-sdk-rtos-c667x-evm-06.03.00.106-Windows\pdk_c667x_2_0_16\packages\ti\csl\csl_cacheAux
,
Renran:
是不是要用CACHE_disableCaching()这个api呢? 我昨天尝试了disble没有成功;enable不是打开缓存吗?
,
Nancy Wang:
Renran 说:不通过缓存,直接读写物理地址,
您目前是遇到了缓存一致性问题吗?在没有执行Cache_setMar时就出现了这种现象?
我的理解是不将这段地址配置为cache就不需要执行回读失效的操作。
Renran 说:是不是要用CACHE_disableCaching()这个api呢? 我昨天尝试了disble没有成功;
执行完pc位没有置零吗?
,
Renran:
是的,目前遇到的问题是缓存一致性的问题。现在的解决办法是缓存回写和失效;是的,MAR12 的PC位清不掉。还有一种方案是清除MAR寄存器的PC位,使某个内存段不Caching,共享内存对应MAR12,但是MAR12 PC位清不掉,不管是用API还是直接写地址。
,
Renran:
我在文档中看到了 ,这是MAR12 PC位清不掉的原因吗?
,
Nancy Wang:
Renran 说:我在文档中看到了 ,这是MAR12 PC位清不掉的原因吗?
可以修改的,corepac user guide上有标注。
,
Renran:
您好,感谢您的回复,我刚刚去尝试了一下,12到15在EVM板上PC位确实清除不掉。我现在使用XMC模块处理的这个问题。