您尚未登录。

楼主 #1 2020-04-01 06:24:53

TivonLiu
会员
注册时间: 2019-12-27
已发帖子: 46
积分: 36

求助RTT中有无cache safe之类的内存分配函数?

目前使用F1C200S的芯片,想在RTT中做DMA需要保证cache一致性。

离线

#2 2020-04-01 10:18:26

Zodiac
会员
注册时间: 2018-11-28
已发帖子: 42
积分: 42

Re: 求助RTT中有无cache safe之类的内存分配函数?

内存分配为啥需要cache safe?
在DMA开启写入和回取时,做cache失效标记不就行了?

离线

楼主 #3 2020-04-01 12:30:53

TivonLiu
会员
注册时间: 2019-12-27
已发帖子: 46
积分: 36

Re: 求助RTT中有无cache safe之类的内存分配函数?

我想在RTT中,通过RTT提供的API,分配一片内存,这片内存不在cache的控制范围,这样使用这片内存就没有cache一致性的问题,我想问在RTT中有无这样的API?

离线

#4 2020-04-01 16:00:33

Zodiac
会员
注册时间: 2018-11-28
已发帖子: 42
积分: 42

Re: 求助RTT中有无cache safe之类的内存分配函数?

TivonLiu 说:

我想在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里的相关实现。

离线

楼主 #5 2020-04-01 18:14:32

TivonLiu
会员
注册时间: 2019-12-27
已发帖子: 46
积分: 36

Re: 求助RTT中有无cache safe之类的内存分配函数?

Zodiac 说:

你的需求似乎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初始化时,这个区域不在管理范围内。

离线

#6 2020-04-01 18:54:04

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 446
积分: 313.5
个人网站

Re: 求助RTT中有无cache safe之类的内存分配函数?

技术上可以做到。
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)

离线

楼主 #7 2020-04-01 20:01:31

TivonLiu
会员
注册时间: 2019-12-27
已发帖子: 46
积分: 36

Re: 求助RTT中有无cache safe之类的内存分配函数?

aozima 说:

技术上可以做到。
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直接操作的。

这个方法不错,但是要定义变量地址,该咋操作哦。

离线

#8 2020-04-02 10:37:09

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 446
积分: 313.5
个人网站

Re: 求助RTT中有无cache safe之类的内存分配函数?

定义变量 也用non-cache,直接打死。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn