SylixOS 下 DMA 操作带 Cache 地址时应如何保持数据一致性
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回写。
Related Articles
SylixOS 功能介绍及版本差异
SylixOS功能介绍及版本差异 SylixOS 标准版 SylixOS 标准版是 SylixOS 的基础版本,具备如下功能: 兼容 IEEE 1003(ISO/IEC 9945)操作系统接口规范; 兼容 POSIX 1003.1b(ISO/IEC 9945-1)实时编程标准; 支持国军标 GJB7714-2012 操作系统接口规范; 优秀的实时性能(任务调度与切换算法时间复杂度为 O(1)); 支持无限多任务; 抢占式调度支持 256 个优先级; 支持虚拟进程; ...
error: xxx-sylixos-elf-lzocom.exe
Q:IDE 在编译工程时出现:xxxx-sylixos-elf-lzocom.exe 应用程序出错。 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。信息如下图所示。 安装 vc2010_redist_x86.exe 即可解决此问题, 此文件在 IDE 软件安装包的 Tools 目录下(如 SylixOS IDE 3.9.11_professional\Tools) 。
手动修改 SylixOS 工程类型的方法
问题描述: 当我们想要通过 IDE 重新选择已有 SylixOS Project 的 base 时,如果 base 的类型需要变化,会遇到如下图所示的问题"SylixOS Base project invalid",导致无法选择想要的base。 问题原因: 当base类型变化了,创建SylixOS Project时,工程设置里设定了base的类型。 解决方法一: ...
DW 网卡 DMA 复位失败是什么原因?
Q:DW网卡DMA复位失败是什么原因? 初始化 DMA 网卡时提示如程序 清单1 所示信息,通常这种情况是 RX_CLK 引脚的时钟出现问题,可以查看 phy 的设置,如果没有 phy 存在,则检查时钟是否正常。 程序清单1 网卡DMA复位失败 1.__dmaInitEngine : Failed to reset the dma 2.__dwHwSetup: DMA engine initialization failed 3.__dwOpen: Hardware setup failed
SylixOS 动态库更新 version 不一致的问题
Q:SylixOS 动态库更新 version 不一致的问题 首先 SylixOS 是允许多个进程对共享库文件进行代码段共享的(默认是共享打开的,可以使用 dlconfig share dis 命令进行关闭),代码段共享会出现一个问题:当 A 进程 使用一个 share.so 共享库的时候,B 进程也使用 该 share.so 的共享库,share.so 共享库因为 B 的原因需要修改,修改后,更新share.so文件,然后重启 B 进程,一般来说会出现错误,错误如下: ...