文档章节

SylixOS DMA子系统之一

B
 BEST_CC
发布于 2017/06/21 11:19
字数 1180
阅读 7
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

1. DMA子系统简介

1.1      DMA简介。

DMA的英文拼写是“Direct Memory Access”,是一种数据不经过CPU处理,直接由DMA控制器从一块物理内存搬运到另一块物理内存的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。

 

2. DMA设备驱动模型

2.1      DMA驱动模型简介

SylixOS中的DMA架构位于“libsylixos/SylixOS/system/device/dma/”下,DMA驱动多用于外设驱动或总线驱动中。主要功能是从一块物理地址向另一块物理地址搬运数据。本文以mini2440的通用DMA驱动为例。

DMA设备库对DMA设备进行了封装,设备驱动仅需要提供初始化函数和回调函数即可。

在注册DMA设备驱动之前,需要先安装DMA设备库,其原型如程序清单 2‑1:

程序清单 2‑1

#include <SylixOS.h>

INT    API_DmaDrvInstall (UINT               uiChannel,

                         PLW_DMA_FUNCS  pdmafuncs,

                         size_t               stMaxDataBytes)

函数API_DmaDrvInstall原型分析:

l  此函数执行成功返回PLW_DMA_FUNCS的地址。

DMA设备需要调用dmaGetFuncs函数绑定驱动并创建设备,其函数原型如程序清单 2‑2:

 

程序清单 2‑2

#include <SylixOS.h>

PLW_DMA_FUNCS  dmaGetFuncs (UINT        iChannel,

ULONG   *pulMaxBytes)

函数dmaGetFuncs原型分析:

l  此函数成功返回ERROR_NONE,失败返回PX_ERROR

l  参数iChannel:DMA通道号;

l  参数pulMaxBytes:最大传输字节数;

结构体PLW_DMA_FUNCS 详细描述如程序清单 2‑3:

程序清单 2‑3

typedef struct lw_dma_funcs {

    VOID            (*DMAF_pfuncReset)( UINT     uiChannel,

                                         struct  lw_dma_funcs *pdmafuncs);

    INT              (*DMAF_pfuncTrans)( UINT     uiChannel,

                                         struct  lw_dma_funcs *pdmafuncs,

                                         PLW_DMA_TRANSACTION  pdmatMsg);

    INT              (*DMAF_pfuncStatus)(UINT    uiChannel,

                                         Struct  lw_dma_funcs *pdmafuncs);

} LW_DMA_FUNCS;

typedef  LW_DMA_FUNCS    *PLW_DMA_FUNCS;

结构体中包含三个需要提供给DMA设备库的操作函数,其功能分别是复位当前DMA操作、启动一次DMA传输、获得当前DMA工作状态。这三个函数的第一个传入参数都是DMA的通道号,第二个参数都是指向DMA驱动结构体的指针。

2.2      DMA回调函数

使用回调函数的目的是将DMA设备库中的结构体保存到驱动中以供缓冲区数据操作,因此在驱动结构体中需要提供三个变量以保存数据,示例如程序清单 2‑4:

 

程序清单 2‑4

 

typedef struct {

    VOID   (*DMAT_pfuncStart)(UINT     uiChannel,

                              PVOID    pvArg);   /* 启动本次传输之前的回调*/

   

    PVOID  *DMAT_pvArg;                        /* 回调函数参数          */

    VOID   (*DMAT_pfuncCallback)(UINT     uiChannel,

                                  PVOID    pvArg); 

/* 本次传输完成后的回调函*/

} LW_DMA_TRANSACTION;

 

2.3      DMA传输参数

在LW_DMA_TRANSACTION结构体中除了一些DMA回调函数,还有一些重要的DMA参数,实例如程序清单 2‑5:

程序清单 2‑5

typedef struct {

    UINT8   *DMAT_pucSrcAddress;                   /*  源端缓冲区地址    */

    UINT8   *DMAT_pucDestAddress;                  /*  目的端缓冲区地址  */

    size_t     DMAT_stDataBytes;                     /*  传输的字节数       */

    INT      DMAT_iSrcAddrCtl;                      /*  源端地址方向控制  */

    INT      DMAT_iDestAddrCtl;                     /*  目的地址方向控制  */

    INT      DMAT_iHwReqNum;                     /*  外设请求端编号    */

    BOOL    DMAT_bHwReqEn;                      /*  是否为外设启动传输*/

    BOOL    DMAT_bHwHandshakeEn;                /*  是否使用硬件握手   *

    INT      DMAT_iTransMode;                      /*  传输模式, 自定义  */

    PVOID   DMAT_pvTransParam;                    /*  传输参数, 自定义   */

    ULONG  DMAT_ulOption;                        /*  体系结构相关参数   */

    PVOID   DMAT_pvArgStart;                      /*  启动回调参数       */

    …

(回调函数上小节已经单独说明)

} LW_DMA_TRANSACTION;

typedef LW_DMA_TRANSACTION    *PLW_DMA_TRANSACTION;

DMA 操作的是物理地址, 所以 Src 和 Dest 地址均为物理地址。有些系统 CPU 体系构架的 CACHE 是使用虚拟地址作为索引的, 有些是使用物理地址做索引的。所以 DMA 软件层不处理任何 CACHE 相关的操作, 将这些操作留给驱动程序或应用程序完成。

2.4      DMA API函数简介

程序清单 2‑6

LW_API  INT     API_DmaDrvInstall(UINT              uiChannel,

                                  PLW_DMA_FUNCS     pdmafuncs,

                                  size_t            stMaxDataBytes);      /*  安装指定通道的 DMA 驱动程序 */

                                 

LW_API  INT     API_DmaReset(UINT   uiChannel);                       /*  复位指定的 DMA 通道         */

 

LW_API  INT     API_DmaJobNodeNum(UINT   uiChannel,

                                      INT   *piNodeNum);                 /*  获得当前队列节点数          */

 

LW_API  INT     API_DmaMaxNodeNumGet(UINT   uiChannel,

                                          INT   *piMaxNodeNum);          /*  获得最大队列节点数         */

 

LW_API  INT     API_DmaMaxNodeNumSet(UINT   uiChannel,

                                         INT    iMaxNodeNum);           /*  设置最大队列节点数          */

 

LW_API  INT     API_DmaJobAdd(UINT                        uiChannel,

                                 PLW_DMA_TRANSACTION    pdmatMsg);  /*  添加一个 DMA 传输请求     */

                             

LW_API  INT     API_DmaGetMaxDataBytes(UINT   uiChannel);               /*  获得一次可以传输的最大字节数*/

 

LW_API  INT     API_DmaFlush(UINT   uiChannel);                         /*  删除所有被延迟处理的传输请求*/

 

/*********************************************************************************************************

  API 中断服务函数

*********************************************************************************************************/

 

LW_API  INT     API_DmaContext(UINT   uiChannel);                     /*  DMA 传输完成后的中断处理函数*/

 

 

#define  dmaDrv                   API_DmaDrvInstall

#define  dmaReset                  API_DmaReset

#define  dmaMaxNodeNumGet        API_DmaMaxNodeNumGet

#define  dmaMaxNodeNumSet        API_DmaMaxNodeNumSet

#define  dmaJobAdd                API_DmaJobAdd

#define  dmaGetMaxDataBytes       API_DmaGetMaxDataBytes

#define  dmaFlush                 API_DmaFlush

 

    如程序清单 2‑6是SylixOS中内核定义的DMA模块,具体函数使用方法和调用流程在下篇文章中会做详细介绍。

© 著作权归作者所有

B
粉丝 1
博文 12
码字总数 16486
作品 0
南京
私信 提问
加载中

评论(0)

SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich
2018/05/15
0
0
一款真正可以拿的出手的本土嵌入式RTOS-SylixOS

由 winniewei 提交于 周四, 12/20/2018 作者:张国斌 在参加工信部人才交流中心和南京浦口区开发区管委会联合举办的第三届集成电路产业紧缺人才创新发展高级研修班暨产业促进交流会期间,我受...

osc_ev4dw47w
2019/03/16
2
0
SylixOS上EtherCAT实现

1 EtherCAT开源协议栈介绍 目前常见开源的主站代码为RT-LAB开发的SOEM(Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master,SylixOS对两者都支持。其中IgH作为常用的...

Jackstraw瑞
2017/11/01
391
0
SylixOS下IIS驱动编程

目录 1. IIS简介 1 2. 数字声音简介 1 2.1 采样频率 1 2.2 量化位数 1 2.3 声道数 1 3. WAV音频文件格式简介 2 3.1 文件格式 2 3.2 原始声音数据的组织方式 2 4. Mini2440声卡的连接方式 3 ...

深山野老
2018/06/26
0
0
SylixOS线程堆栈大小浅析

目录 1. SylixOS线程、线程栈介绍 1 1.1 线程的介绍 1 1.2 线程栈的介绍 1 2. SylixOS线程栈大小的分配 1 2.1 线程、线程栈相关属性的设置 2 2.2 线程栈大小 2 2.3 线程堆栈警戒区 3 3. 总结...

Esc120
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务项目搭建,到底要不要聚合工程?

这是一个入门问题,做微服务项目,首先就是要搭建 Project,代码采用什么样的形式来组织,这是我们面临的第一个问题。 要扯清楚这个问题,首先对 Maven 的使用不能含糊,小伙伴们可以在公众号...

osc_y12wmf09
10分钟前
11
0
C语言探索之旅 | 第一部分第六课:变量的世界(三),显示变量内容

作者 谢恩铭,慕课网精英讲师 Oscar老师。 转载请注明出处。 内容简介 用 printf 显示变量内容 用 scanf 提取程序中的输入 总结 第一部分第七课预告 1. 用 printf 显示变量内容 变量相关的内...

osc_zjs1puzi
12分钟前
14
0
php 操作RabbitMQ

基本流程图 如果exchange 没有绑定queue,则消息将会被丢弃 如果创建exchange,queue,并且已经绑定了,则可以直接使用 为了防止脚本出问题 可以配合supervisor 安装 从网站 https://packag...

php开源社区
13分钟前
18
0
Kotlin Coroutines Flow 系列(五) 其他的操作符

八. Flow 其他的操作符 8.1 Transform operators transform 在使用 transform 操作符时,可以任意多次调用 emit ,这是 transform 跟 map 最大的区别: fun main() = runBlocking { (1...

osc_0l1onu3j
13分钟前
13
0
挽救数据库性能的30条黄金法则

原文: 挽救数据库性能的30条黄金法则 1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于排序,所以在这两个子句涉及...

osc_gxvh47u5
14分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部