SylixOS下DMA操作带cache的地址时的处理
来源:互联网 发布:linux编译程序 编辑:程序博客网 时间:2024/06/01 09:43
DMA只操作物理内存,不会操作cache,但CPU却先操作cache,这样就会造成数据不一致的问题。因此,对于一块带cache缓冲的地址要用DMA传输的话,需要经过特殊的处理。
linux下可以通过dma_map_single、dma_unmap_single函数来得到对应的物理地址,并根据数据的方向判断是该回写cache还是无效cache。
SylixO中可以利用API_VmmVirtualToPhysical来得到对应的物理地址,但对cache的操作需要手动进行。以nand的读写为例。
static void read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
{
int i;
struct nand_chip *chip = mtd->priv;
API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&RX));
__uartDmaRequest(mtd, (void *)RX, len, 1);
API_CacheInvalidate(DATA_CACHE, buf, len); /* DCACHE 使指定的页面无效(访问不命中)*/
}
将nand里面的数据拷贝到参数buf下,拷贝完成后,需要将buf对应的cache line无效。
static void write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
{
int i;
struct nand_chip *chip = mtd->priv;
API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&TX)); /* 指定类型的 CACHE 将所有或者指定的数据项清空*/
API_CacheFlush(DATA_CACHE, (PVOID)buf, len);
__uartDmaRequest(mtd, (VOID *)TX, len, 0);
}
将buf里面的数据写到nand里面,写之前,需要将buf对应的cache line回写。
linux下可以通过dma_map_single、dma_unmap_single函数来得到对应的物理地址,并根据数据的方向判断是该回写cache还是无效cache。
SylixO中可以利用API_VmmVirtualToPhysical来得到对应的物理地址,但对cache的操作需要手动进行。以nand的读写为例。
static void read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
{
int i;
struct nand_chip *chip = mtd->priv;
API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&RX));
__uartDmaRequest(mtd, (void *)RX, len, 1);
API_CacheInvalidate(DATA_CACHE, buf, len); /* DCACHE 使指定的页面无效(访问不命中)*/
}
将nand里面的数据拷贝到参数buf下,拷贝完成后,需要将buf对应的cache line无效。
static void write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
{
int i;
struct nand_chip *chip = mtd->priv;
API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&TX)); /* 指定类型的 CACHE 将所有或者指定的数据项清空*/
API_CacheFlush(DATA_CACHE, (PVOID)buf, len);
__uartDmaRequest(mtd, (VOID *)TX, len, 0);
}
将buf里面的数据写到nand里面,写之前,需要将buf对应的cache line回写。
阅读全文
0 0
- SylixOS下DMA操作带cache的地址时的处理
- Linux下如何处理DMA与Cache的问题
- DMA和cache的一致性
- 宏ARCH_SLAB_MINALIGN的值,使用DMA时的CACHE一致性
- 3.3.5 DMA写时发生Cache命中的优化
- DMA的基本操作
- 如何消除CACHE对DMA的影响?
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得 --dma_alloc_writecombine
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得
- DMA及cache一致性的学习心得
- DMA导致的CACHE一致性问题解决方案
- 带Cache的FileStream
- ucGUI在SylixOS下的应用
- tf.variable_scope与tf.name_scope不同之处
- 单片机学习准备1
- Spread.js 上下级关系
- graphql学习(一)graphql-java文档初步阅读
- 常见exception
- SylixOS下DMA操作带cache的地址时的处理
- Windows Python3 Scrapy网络爬虫环境搭建
- JS内存泄漏排查方法(Chrome Profiles)
- Full Screen Control——全屏控件
- 数据结构与算法(java)——栈和队列
- easyui中datagrid如何显示子对象的属性
- 一个简单的jquery省级联动插件
- js脚本获取自身路径方法
- Handler.Callback()避免内存泄漏