|
|
ADI操作系统 |
|
|
|
基于VDK的ADI DSP软件开发技术 |
[ 作者: ] [ 来源:ADSP开源社区 ] [ 发布时间:2011-4-13 ] |
|
当前数字信号处理器(DSP)已广泛应用于图像处理、智能化仪表、通信、自动控制等许多领域。AD公司是全球通用DSP领域最有影响力的厂家之一,VDK (VisualDSPKernel)是ADI公司DSP软件开发工具VisualDSP的一个重要组成部分,他特别适合用来编写需要精巧控制代码的应用程序。某些大型系统可能需要许多算法完成,而每个算法还可能包含许多功能模块,这要由控制代码加以组织。处理器日益强大功能的发挥也需要精巧的控制代码。基于VDK开发的程序中,这些控制码是由一个叫“内核”的程序管理的,内核常驻在DSP中。
1. VDK的原理
VDK实际上是一种带API(Application ProgramInterface)函数库的实时操作系统内核。下面先对VDK的各个组成部分加以介绍,然后总体描述其工作原理。文中所述的被调用的函数均在API函数库中。
1.1 线程
一个应用程序可以划分为多个功能模块,每个模块可以用一个线程实现,线程之间可以互相通信。线程并不是直接定义的,而是先定义线程类型,再由线程类型例化得到。一个线程类型可以有多个例化,也就是说一个系统中多个线程可以属于相同的线程类型。线程类型实质上是各空间VDK下线程类的子类,而线程是该子类例化得到的对象。线程类型创建时被分配一个默认的优先级,该优先级可以通过调用函数SetPriority()改变,同一类型的线程具有相同的优先级。每个线程包含5个成员函数:创建函数、初始化函数、运行函数、错误处理函数和销毁函数。创建函数类似于C++中类的构造函数,用于创建一个线程并为他分配资源。销毁函数类似于C++中类的析构函数,用于销毁一个线程并释放其所占资源。包含线程所要完成算法的运行函数是线程的核心部分,类似于C中的main ()函数。
1.2 调度
调度是一种管理和协调线程的机制,他保证优先级最高的就绪线程能够最早占用处理器来运行。所谓就绪,就是线程已经具备运行所需的所有数据、参数等资源。调度在具有最高优先级的线程改变时被激发。调度的实现基于一种被称为就绪队列的内部数据结构。就绪队列中的就绪线程先按优先级排队,然后遵循先进先服务的原则占用处理器,如图1所示。线程最高优先级为0,是保留的;最低优先级为DSP数据字宽减去2,如32 b DSP为30。具有最低优先级的线程是预定义的IDLE线程,他在就绪队列为空时自动运行,使得DSP处于低功耗状态。
1.3 信号
信号是线程之间进行通信和同步的桥梁。(Semaphore)、事件位和事件(Event and EventBit)、设备标志(Device Flag)。
信标是应用系统中所有线程都可访问的全局资源的抽象,VisualDSP2.0中他有2个值:真和假。他的值为真时,表示该资源可用,所有正在等待该信标的线程中优先级最高的那一个进入就绪队列等候运行;他的值为假时,表示该资源已被占用。线程或者中断服务程序利用信标所代表的资源完成自己的任务后调用 API函数释放该资源以便其他线程或者中断服务程序使用。
事件和事件位是标识系统状态的信号,用于协调线程的执行。事件位用来指示系统某一要素所处状态;事件是所有事件位按照指定规则进行布尔操作的结果。任何一个事件位改变都会导致事件的值被重新计算。信标标识系统资源是否可用,而事件位和事件标识线程中的操作主体利用系统资源完成其工作后所处的状态。线程可以调用PendEvent()等候一个事件发生。
设备标志是设备驱动与线程之间联系的纽带。例如他可以将A/D采样数据的到来这一事件通知多个等待这些数据的线程,而信标、事件和事件位就不能描述他。由于和设备驱动息息相关,后面将会结合设备驱动对设备标志进行详细介绍。
1.4 中断服务程序
VDK的中断服务程序必须用汇编语言编写而且应该比较短小,完成释放信标、改变事件位、激活设备驱动、与线程交换数据等工作,而所有的计算应该在线程域完成。中断可以调用API函数被允许或禁止。
1.5 设备驱动
基于VDK的应用程序可以分解为2个域:线程域和中断域。图2所示线程域中对线程进行管理的机制称为软件调度,也就是前文所述的调度,由内核完成;中断域中对中断进行管理的机制称为硬件调度,由DSP硬件(中断控制器)完成。硬件调度和软件调度是并行的,但中断发生时硬件调度抢先发生,这时软件调度和线程的优先级是无意义的。
众所周知,操作系统是将键盘、显示器、打印机和通信端口作为扩充文件来处理的,而这种处理是通过设备驱动程序实现的。作为一种操作系统内核,VDK也对外部设备进行抽象,可以调用API函数对他们进行打开和关闭、同步读和同步写以及控制。设备驱动是线程域和中断域之间沟通的桥梁,也是VDK应用程序与外部环境通信的接口。其代码既不在线程中也不在中断服务程序中,而是一个独立的函数,他也不直接被内核和中断控制器调度。设备标志是与设备驱动相关联的信号。一个设备标志为真时,就表示与该标志对应的设备准备好,所有等待该设备标志的线程进入就绪队列。
1.6 API
API(Application Programming Interface)是存放应用程序可以调用的函数和宏的库。API函数库为VDK提供基本的服务:中断处理、调度管理、线程管理、信标管理、事件和事件位以及设备标志的传递等。
VDK总体工作原理可以用图3描述。
VDK应用程序以线程域和中断域为主体,以信号为纽带,以设备驱动作为与外部环境进行通信的接口,以调度为线程和中断的管理和协调机制来完成复杂的控制功能。
2. 使用VDK开发应用程序的优点
使用VDK开发AD系列DSP应用程序具有以下优点:
1)开发周期比手写控制代码要短得多。代码自27动生成、文件模板和设备驱动的标准接口,使软件开发者可以专注于算法和控制流程的设计,而不是程序执行的细节。
2)调试方便。 程序执行过程中发生的线程切换、信号的等待和公布(post)等重要事件可用图形和图表直观地表示出来。
3)码的可移植性和可重用性。VDK提供了硬件的抽象层,用户可以用高级语言(C或C++)进行同硬件平台无关的编程,生成的代码可以移植到AD公司所有的DSP核中。许多繁琐的数据读写等基本工作可以直接调用API函数而无需自己编写。
4)项目管理方便。采用基于线程的编程方式,可以把应用程序分解成许多独立的模块进行编写和调试,为项目管理提供了极大的方便。
3. 结语
VDK非常适合用于构造需要精巧控制代码的系统,这些系统中许多事件往往是随机发生的。针对实际的应用系统,我们首先要进行深入分析,建立系统模型,从中抽象出所要创建的线程类型、信号、设备驱动、中断服务程序等,然后就可以着手在VDK环境下编写应用程序了。值得一提的是系统参数、线程类型、信号及其参数、设备驱动、中断服务程序等均可在Project窗口中的Kernel页直接手动定义,VDK会自动生成内核文件存储他们,非常方便。 |
|
|