目前使用F1C200S的芯片,想在RTT中做DMA需要保证cache一致性。
离线
内存分配为啥需要cache safe?
在DMA开启写入和回取时,做cache失效标记不就行了?
离线
我想在RTT中,通过RTT提供的API,分配一片内存,这片内存不在cache的控制范围,这样使用这片内存就没有cache一致性的问题,我想问在RTT中有无这样的API?
离线
我想在RTT中,通过RTT提供的API,分配一片内存,这片内存不在cache的控制范围,这样使用这片内存就没有cache一致性的问题,我想问在RTT中有无这样的API?
你的需求似乎Cortex-M架构上的MPU模块能满足,通过定义一个连续的地址片为MPU_ACCESS_NOT_CACHEABLE来实现。
一旦定义后,也无需OS进行什么特殊操作,普通malloc即可。
但至于F1C100s的ARM926EJ-S内核,应该只有MMU可用,好像没有类似的功能。
还是要在驱动里手动调用诸如:mmu_invalidate_dcache()、mmu_clean_dcache()等函数来操作cache。
总之,上述功能应该不是OS的API范畴,与CPU架构关系很大。具体可以参考RTT的libcpu/arm/arm926里的相关实现。
离线
你的需求似乎Cortex-M架构上的MPU模块能满足,通过定义一个连续的地址片为MPU_ACCESS_NOT_CACHEABLE来实现。
一旦定义后,也无需OS进行什么特殊操作,普通malloc即可。但至于F1C100s的ARM926EJ-S内核,应该只有MMU可用,好像没有类似的功能。
还是要在驱动里手动调用诸如:mmu_invalidate_dcache()、mmu_clean_dcache()等函数来操作cache。总之,上述功能应该不是OS的API范畴,与CPU架构关系很大。具体可以参考RTT的libcpu/arm/arm926里的相关实现。
谢谢你的建议,我似乎找到一个办法,就是单独定义一个地址区域,在mmu初始化时,这个区域不在管理范围内。
离线
技术上可以做到。
MMU映射时,1:1映射1片无CACHE的空间。
这样正常出来的内存地址,做一下地址转换就行了。
参考
const struct mem_desc platform_mem_desc[] = {
{0x00000000, 0x03FFFFFF, 0x00000000, NORMAL_MEM}, /* DDR 64M */
{0x10000000, 0x13FFFFFF, 0x00000000, DEVICE_MEM}, /* 加这行 DDR 64M non-cache */
{0xB0000000, 0xB3FFFFFF, 0xB0000000, DEVICE_MEM}, /* IO 64M */
{0xFFF00000, 0xFFFFFFFF, 0xFFF00000, DEVICE_MEM}, /* SYS 1M */
};
但是
内存操作带CACHE,再刷cache.
性能远远高于无cache直接操作的。
最近编辑记录 aozima (2020-04-01 18:55:53)
离线
技术上可以做到。
MMU映射时,1:1映射1片无CACHE的空间。
这样正常出来的内存地址,做一下地址转换就行了。参考
const struct mem_desc platform_mem_desc[] = { {0x00000000, 0x03FFFFFF, 0x00000000, NORMAL_MEM}, /* DDR 64M */ {0x10000000, 0x13FFFFFF, 0x00000000, DEVICE_MEM}, /* 加这行 DDR 64M non-cache */ {0xB0000000, 0xB3FFFFFF, 0xB0000000, DEVICE_MEM}, /* IO 64M */ {0xFFF00000, 0xFFFFFFFF, 0xFFF00000, DEVICE_MEM}, /* SYS 1M */ };
但是
内存操作带CACHE,再刷cache.性能远远高于无cache直接操作的。
这个方法不错,但是要定义变量地址,该咋操作哦。
离线