当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]DSP/BIOS中的IO设备驱动编程技术

介绍了DSP/BIOS中I/O设备驱动程序的编写,并给出了一个在TMS320C5402 DSK上开发语音处理程序的实例。

    关键词:数字信号处理器(DSP) 实时操作系统 I/O设备驱动 应用程序接口(API)

近年来,随着信息技术的飞速发展,DSP在航空、航天、雷达、通信、消费类电子设备等方面都得到了广泛应用;同时,DSP的运算能力也越大越强大,TI公司新推出的TMS320C6400系列的运算能力可以达到8800MIPS。这些都要求开发DSP的应用程序要缩短开发时间,增加软件的可编护性和可重用性。语音压缩、语音识别、图像处理等方面的应用要求DSP的开发尽可能简单,还要求代码的执行效率高。

DSP/BIOS是TI公司推出的一个实时操作系统。DSP/BIOS与TI的CCS(Code Composer Studio)集成在一起。目前最新的版本是CCS 1.2中的DSP/BIOS II。应用DSP/BIOS可以大大简化DSP应用程序的开发和调试。与外部设备的I/O接口是DSP应用开发中不可缺少的重要部分。基于DSP/BIOS的I/O设备驱动将软件与硬件分离,提高了软件的可重用性,在软件或硬件改动时可使相互的影响降为最小。

1 DSP/BISO操作系统简介

DSP/BIOS实际上是一组可重复调用的系统模块API的集合。只占用DSP很少的资源,可以满足DSP实时运行时的调试性能分析,编写高效的程序。例如,在TMS320C6211上运行printf()函数需花费4000个周期,而运行LOG_printf()只花费36个周期,可printf()要比LOG_pfrintf()多花费100倍以上的时间。下面只对与I/O设备驱动有关的模块作简要介绍。

1.1 任务调度模块(HWI/SWI/TSK)

在DSP/BIOS中,任务的调度是通过HWI、SWI和TSK三个模块实现的。HWI(硬件中断管理模块)管理硬件中断,主要负责DSP与外设的交互,从外设中读写数据。由于硬件中断直接与硬件打交道,对应的中断服务程序ISR应尽可能短小精焊。HWI不引起任务调度,它在处理完数据的输入输出后调用SWI_post()来调度相应的软件中断SWI完成数据处理工作。

DSP/BIOS提供两类优先线程:SWI(软件中断管理模块)和TSK(任务管理模块)。SWI是DSP/BIOS任务调度的核心,SWI任务是抢断式的,即高优先级的任务可以抢断低优先级的任务。但是SWI任务是不可阻塞的,所有SWI任务共享一个堆栈,SWI任务只能在程序编制时预先定义好。DSP/BIOS中对任务的动态产生和对阻塞状态的支持是通过TSK模块来实现的。TSK也是可以抢断的,但每个TSK任务使用独立的堆栈。

1.2 通讯模块(PIP/SIO)

PIP(带缓冲管道管理模块)和SIO(流输入输出管理模块)是DSP/BIOS提供的两个接口对象,用于支持DSP与外设之间 数据交换。PIP对象带有一个缓冲队列,可以执行带缓冲的读任务和写任务。SIO没有缓冲队列,SIO的操作get()和put()在应用程序和驱动程序之间交换缓冲的指针,而不是数据的拷贝,因此执行效率比PIP高。

PIP和SIO对象支持基于帧的信号处理系统的实现。在多速率系统中需要使用优先级线程来统一端口通信,在其它需要处理不同尺寸、不同速率的帧的系统中,优先级线程也是必须的。PIP对象可被SWI或TSK线程使用,而SIO对象只能被TSK使用。

2 低级设备驱动(LIO)

LIO(Low Level I/O)是一组基于DSP/BIOS设计的API函数。它由控制函数、I/O缓冲区管理函数、信令函数组成,如表1所示。应用程序可以通过LIO函数控制一个或多个外设通道。

表1 LIO API函数

函    数 函数类型 描     述

Open
Close
Cntl
Start
Stop
GetBuf
PutBuf
IsEmpty
IsFull
SetCallback

控制
控制
控制
控制
控制
缓冲区队列
缓冲区队列
缓冲区队列
缓冲区队列
信令

分配资源,初始化设备
释放资源,复位设备
设备特殊操作
缓冲区传送使能
缓冲区传送使不能
从设备输出队列重新得到缓冲区
将缓冲区放入设备输入队列
若设备输出队列为空返回真
若设备输入队列为满返回真
当传送毕,设置函数为调用

LIO函数不考虑数据的转送方向,也就是说仅执行输出设备、仅执行输入设备和能执行输入、输出的设备执行的是同样的函数。输入与输出之间的主要不同点是传送到缓冲区队列函数的参数意义不同。既然所有其它的操作都是同样的,大多数控制代码能在单个驱动程序中被所有通道共享。

2.1 总体设计、设想和命名规范

所有的驱动程序函数都不能设置成全局中断。驱动程序应不影响全局中断使能标记的状态,仅影响由它控制的外设所能触发的中断所对应使能标记的状态。这样可以阻止一个驱动程序与其它驱动程序或应用程序争夺CPU资源。

为了避免由不同驱动程序使用同一函数名引起的命名空间冲突,也为了改变驱动程序而不需再编译应用程序代码,可以通过函数表访问驱动程序函数。用这种方式,仅需要为每个驱动程序定义一个外部符号。这种符号有其命名规范。此命名规范通过接线板、在片外设、LIO接口等来区分。如包含应用程序注释的源代码为TI TMS320VC5402 DSK的AD50音频编解码器执行基于DMA的驱动程序,驱动程序函数表名是DSK5402_DMA_AD50_TI_ILIO。

设备驱动程序支持的各通道半双工(输入或输出)通道。每个函数对应一个通道变量。一个能执行输入和输出的物理设备,如连接到音频编解码器的DSP串口,可通过两个半双工通道(一个输入,一个输出)来访问。一个驱动程序支持多少个物理设备和通道依具体实现而实。一般一个驱动程序应能控制一个物理设备,此设备可能有多个通道。通道号与物理设备通道的映射执行时确定。通道号应约定从0开始。对I/O设备,一般约定偶数号为输入,奇数号为输出。[!--empirenews.page--]

2.2 三类函数

LIO接口中有三类函数:控制函数、缓冲区和队列管理函数、信令函数。

2.2.1 控制函数

控制函数用来实现设备的启动、关闭和控制。其初始函数为驱动程序保存资源(物理外设和内存)。它使用结构指针作为可选变量,此结构是一种设备的特殊变量结构。

2.2.2 队列管理

假定每个设备至少有一个用来传送数据的缓冲区。许多设备(如McBSP和DMA)带有允许双缓冲的缓冲队列。图1是一个有三个存储单元的LIO驱动程序,驱动程序中有:由外设填满或清空的缓冲区“todevice”(到设备)队列,将传送的缓冲区返回到应用程序的缓冲区管理程序的“from device”(来自设备)队列和当前传送数据的缓冲区。在虚线框里的认为是在驱动程序里面。当前传送数据的缓冲一般由外设寄存器控制,如DMA源寄存器或目标寄存器,在图1中画在“外设”中。含硬件队列(如DMA重新如载寄存器)的设备也会含一个或多个存储单元用业存储指针为以后传送用,此队列为“to device”队列。能包含缓冲区指针的第三个存储单元是“from device”队列,在驱动程序中为一变量。当设备准备传送缓冲区时,缓冲区从输入队列传送到外设寄存器。这些缓冲区然后移到输出队列以完成传送,作为对CPU中断的响应。

PutBuf()将缓冲区从应用程序传送到驱动程序的输入队列。GetBuf()从输出队列得到缓冲区。IsEmpty()和IsFull()返回输入队列、输出队列的状态。如果输入队列满,因为无空间装新缓冲区,调用putBuf()会返回错误代码。若IsFull()返回false,接下来可调用putBuf()。如果IsFull()返回true,但若在IsFull()返回true和调用putBuf()之间完成传送,则调用putBuf()也可能会成功。

2.2.3 信令

如图1所示,当传送结束一般会触发CPU中断。此中断会使应用程序将传送的缓冲区转移到输出队列,然后调用calback()传到驱动程序。Callback()应向应用程序发信号告知传送完毕。

3 LIO驱动程序例子

音频处理如语音压缩、呼叫过程音调检测等,是DSP的一般应用。本例是使用TMS320C5402 DSK上的DMA将音频编解码数据从McBSP移到缓冲区中。

当驱动程序响应应用程序调用和设备中断时,采用数据结构跟踪驱动程序的状态。有效状态是设备驱动程序缓冲区队列的状态,如图1所示。[!--empirenews.page--]

图2给出了此模式中最简单的传送状态集。圆圈中单词表示设备驱动程序缓冲区队列的状态。第一个单词是“to device”队列,第二个表示外设占用缓冲区指针,第三个是“from device”队列,第二个表示外设占用缓冲区指针,第三个是“from device”队列。E表示空,F表示满,EEE是起始状态。

每个队列可以是空(E),满(F),非空非满(N)。应用程序调用PutBuf()将缓冲区放到“to device”队列中。驱动程序立即将缓冲区放进外设,转移到状态“EFE”。当传送完毕,外设向驱动程序发中断信号,然后驱动中断处理程序将缓冲区从外设寄存器转移到“from device”队列,转移到状态“EEF”,接着调用应用程序的回调函数。回调函数调用GetBuf()从驱动程序的“from device”队列重新得到缓冲区,驱动程序返回起始状态。

如果驱动程序支持硬件排队,则当一个缓冲区正由外设传送时,“to device”队列能控制另一个缓冲区。与图2中状态转移不同,应用程序现在可能向“to device”队列增加另一个缓冲区。驱动程序将此缓冲区指针存进一个队列,此时状态为“FFE”,“to device”队列为满,外设正在传送一个缓冲区,“from device”队列为空。使用C数据结构实现这种状态机器的状态向量。

使用DMA全局重新加载寄存器来控制“to device”队列,状态结构如下所示。

Typedef struct drv_state{

Bool enabled;

Ptr currentBuffer;

Uns currentSize;

Ptr fullBuffer;

Uns fullSize;

LIO_TcallBack callback;

Arg calbackArg;

} LIO_Obj;

第一个字段“enabled”是一个布尔值,表示程序的开始或结束。下面两个字段“currentBuffer”“currentSize”控制当前传送缓冲区的起始地址和尺寸。当传送完毕,它们转移到“from device”队列。“fullBuffer”“fullSize”字段实现长度为1的“from device”队列。Callback()的地址和参数通过setCallback()存储在状态结构中。

驱程序对每个缓冲区只接收一个中断,而不是每个采样一个断。发生中断时,驱动程序已经知道缓冲区传送完毕,重新加载,DMA不需再重新编程。中断处理程序首先将currentBuffer内容移到fullBuffer中。如果缓冲区已在“to device”队列中,即已使用重新加载的DMA,则新缓冲区指针和长度记录进currentBuffer字段中,然后调用callback()。一旦定义了基本的状态机器,相似硬件的新驱动程序就很容易写出。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭