社区
嵌入开发(WinCE)
帖子详情
DMA可以使用带cache的内存吗?
oncancel
2010-01-11 03:45:45
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。
DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
...全文
225
6
打赏
收藏
DMA可以使用带cache的内存吗?
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。 DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
oncancel
2010-01-21
打赏
举报
回复
[Quote=引用 2 楼 oncancel 的回复:]
引用 1 楼 paul_chao 的回复:
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
你的意思是先用AllocPhysMem分配一块物理地址并得到一个虚拟地址,再把这块地址用MmMapIoSpace重新映射一次虚拟地址?这样的操作合法吗?释放的时候也先MmUnMapIoSpace再FreePhysMem?
va1=AllocPhysMem(size,PAGE_READONLY,0,0,&pa,LowPart);
va2=MmMapIoSpace(pa,size,TRUE);
...
MmUnMapIoSpace(va2,size);
FreePhysMem(va1);
[/Quote]
经验证,此法可行。thanks。
xumercury
2010-01-19
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]
mark
mxm1986
2010-01-19
打赏
举报
回复
我只知道底层有寄存器可以是某段内存空间禁用cache的
wolfmvp
2010-01-19
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]学习了…
oncancel
2010-01-11
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]
你的意思是先用AllocPhysMem分配一块物理地址并得到一个虚拟地址,再把这块地址用MmMapIoSpace重新映射一次虚拟地址?这样的操作合法吗?释放的时候也先MmUnMapIoSpace再FreePhysMem?
va1=AllocPhysMem(size,PAGE_READONLY,0,0,&pa);
va2=MmMapIoSpace(pa,size,TRUE);
...
MmUnMapIoSpace(va2,size);
FreePhysMem(va1);
paul_chao
2010-01-11
打赏
举报
回复
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
Cache
和
DMA
一致性
有
Cache
的CPU上
使用
DMA
,保证一致性的核心手段是通过硬件监听、非缓存
内存
或软件维护。在嵌入式领域,最常用的方法是在
DMA
传输的关键路径上,由软件根据数据方向执行
Cache
的冲刷(Flush)和失效(Invalidate)操作,并确保
DMA
缓冲区正确对齐。
STM32F7 MPU
Cache
的原理和一致性问题
本文主要从结构原理以及应用方面对 MPU 和
Cache
进行分析,通过对
cache
相关知识体系的学习,以
Cache
有基本的了解,便于在具体的实际应用中,
使用
带
有一级
cache
的 MCU 时,避免出现一些不必要的错误。
别再混用malloc和海思MMZ
内存
了!手把手教你用HI_MPI_SYS_MmzAlloc_
Cache
d提升IVE算子性能
本文深入探讨了海思MMZ
内存
优化对IVE算子性能的关键影响,揭示了混用malloc和MMZ
内存
可能导致40%的性能损失。重点介绍了HI_MPI_SYS_MmzAlloc_
Cache
d接口的正确
使用
方法,包括
内存
对齐、缓存一致性处理及性能监控技巧,帮助开发者充分发挥海思芯片的多媒体处理能力。
【硬核】STM32 C语言陷阱全解析(一):存储器与变量篇(40问深度剖析)
本文针对STM32开发中**"代码能编译但行为诡异"**的高频场景,从基础volatile误用到专家级MPU
内存
保护,构建40个渐进式问题。每个问题包含**错误代码→小白误区→原理剖析→工业级方案**,适用于代码审查自查与团队培训考核。
Linux
内存
管理 ——
DMA
和一致性缓存
1. 出现
内存
不一致的原因 CPU写
内存
的时候有两种方式: 1. write through: CPU直接写
内存
,不经过
cache
。 2. write back: CPU只写到
cache
中。
cache
的硬件
使用
LRU算法将
cache
里面的内容替换到
内存
。通常是这种方式。
DMA
可以完成从
内存
到外设直接进行数据搬移。但
DMA
不能访问CPU的
cache
,CPU在读
内存
的时候,如果
cache
命中...
嵌入开发(WinCE)
19,523
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章