Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

多内存管理策略 #198

Open
KyleChenjh opened this issue Apr 27, 2021 · 11 comments
Open

多内存管理策略 #198

KyleChenjh opened this issue Apr 27, 2021 · 11 comments

Comments

@KyleChenjh
Copy link

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

@whj4674672
Copy link
Contributor

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

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

@mysterywolf
Copy link
Contributor

mysterywolf commented Apr 27, 2021 via email

@Guozhanxin
Copy link
Collaborator

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

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

@whj4674672
Copy link
Contributor

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

@mysterywolf
Copy link
Contributor

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

@whj4674672
Copy link
Contributor

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

@KyleChenjh
Copy link
Author

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

@mysterywolf
Copy link
Contributor

mysterywolf commented Apr 28, 2021

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

@mysterywolf
Copy link
Contributor

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

@KyleChenjh
Copy link
Author

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

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

@mysterywolf
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants