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回写。 |
SylixOS下DMA操作带cache的地址时的处理
最新推荐文章于 2024-02-07 09:33:24 发布