RT-Thread-Studio / sdk-bsp-stm32h750-realthread-artpi

320 stars 203 forks source link

多内存管理策略 #198

Open KyleChenjh opened 3 years ago

KyleChenjh commented 3 years ago

H7上有多块非连续内存分布情况,有高低速总线区别访问、外设定向内存区访问以及Cache数据一致性等情况出现, 因此针对H7这种非连续的多内存分布的管理,需要更加精准的定位到内存地址的定向分配情况。 这个问题该如何处理。@Guozhanxin @whj4674672

whj4674672 commented 3 years ago

我先说下我的思路,抛砖引玉: 使用 memheap 的方式去管理多个连续内存段 在不同的组件里面使用 宏的方式制定当前组件用的是 rt_malloc 还是 rt_memheap_malloc

@mysterywolf @loogg 有其他好的思路吗?

mysterywolf commented 3 years ago

可以移植freertos的heap5 专门针对多块存储空间 拟合成一个内存空间来分配

---原始邮件--- 发件人: @.> 发送时间: 2021年4月27日(周二) 下午3:06 收件人: @.>; 抄送: "Meco Jianting @.**@.>; 主题: Re: [RT-Thread-Studio/sdk-bsp-stm32h750-realthread-artpi] 多内存管理策略 (#198)

我先说下我的思路,抛砖引玉: 使用 memheap 的方式去管理多个连续内存段 在不同的组件里面使用 宏的方式制定当前组件用的是 rt_malloc 还是 rt_memheap_malloc

@mysterywolf @loogg 有其他好的思路吗?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

Guozhanxin commented 3 years ago

根据分层设计的原则,应用层的接口应该是不需要关心这些细节的。只有需要和硬件打交道的代码才需要关心这些细节。所以会有哪些代码会关心这个呢?是不是只有驱动会关心,那么是不是提供一套支持注册标签的内存堆和申请标签的接口就好了。驱动自己把内存管理好是不是就好了

驱动框架这一层需要关心内存从哪里来吗?如果驱动框架需要关心的话,弄个静态选项?开启的话,这个框架里的内存申请就从这个内存堆里申请?

whj4674672 commented 3 years ago

@mysterywolf 拟合成一个内存空间来分配 其实 RT-Thread 是有这个功能的,就是 memheap,目前 STM32H7 存在的问题是,不同的 RAM 可访问的外设不一样,所以需要考虑不同的外设去申请内存时,申请的到的是哪一块内存空间

mysterywolf commented 3 years ago

我这里有一份改编自freertos heap4的代码,可以添加多组内存空间,用户可以指定从哪个内存空间中分配内存,但是比正常的malloc或者free多了一个参数,也就是选择哪个内存

whj4674672 commented 3 years ago

如果组件框架,驱动,软件包中使用到了 rt_malloc 的时候,如何处理呢

KyleChenjh commented 3 years ago

这个是个问题的,理论上框架是不会关心其malloc的是哪段内存,需要关心的对象可能也就是底层外设驱动了。 目前的情况是需要考虑移植性的。

mysterywolf commented 3 years ago

我觉得rt_malloc分配给低速内存,高速、Cache这类的,放在drv_common里边,单独封装成比如rt_high_malloc,这中函数由drv_xxx调用,不让用户使用,用户调用的rt_malloc就用最普通的内存就可以了。高速、cache涉及到底层的,不应该放在框架里边。框架里边和应用层一样 应该用普通的rt_malloc

mysterywolf commented 3 years ago

https://github.com/mysterywolf/mem_sandbox 这个应该适用你这种场景,当时设计这个软件包主要是为了隔离。但是这个软件包也可以同时提供多个类似于rtt的mem.c一样的功能,彼此相互独立,可以选择适用哪块内存分配or回收

KyleChenjh commented 3 years ago

我觉得rt_malloc分配给低速内存,高速、Cache这类的,放在drv_common里边,单独封装成比如rt_high_malloc,这中函数由drv_xxx调用,不让用户使用,用户调用的rt_malloc就用最普通的内存就可以了。高速、cache涉及到底层的,不应该放在框架里边。框架里边和应用层一样 应该用普通的rt_malloc

这样也是有问题的,比如应用层为某个外设分配一个region作缓冲区,用rt_malloc的话,而这个region无法在外设上访问,这样就会出问题了,反之,如果应用层用rt_high_malloc的话,又无法做到用户无感。

mysterywolf commented 3 years ago

能不能把“为某个外设分配一个region作缓冲区”这个动作在drv里边就写好封装成函数,用户直接填size,这样就避免由用户来决定用哪块内存了。