传统的数字图像处理系统一般是基于PC机的,由安装在PC机中的图像采集卡采集图像,而后在PC机上进行后端处理。随着多媒体数码产品需求的不断扩大,数字图像处理设备要求越来越小型化,借助飞速发展的可编程器件,嵌入式数字图像处理系统成为发展的方向。
DSP具有独特的哈佛结构,可以实现软件流水,并借助独特的超长指令字结构(VLIW)可以完成大运算量的数字图像处理工作。TI公司推出的DSP/BI0S提供了众多的模块及面向用户的API接口,包括多优先级多任务系统调度、内存管理、硬件driver抽象以及数字信号处理实时数据调试及交换的支持,可以进行多任务处理、管理复杂的硬件设备和实时数据传输,这为DSP在数字图像处理应用中的编程提供了一种利器。
一 数字图像处理系统的硬件结构
该数字图像处理平台是基于TI公司推出的高性能DSP评估板DM642 EVM[参考文献1、2、3],该评估版可以用于视频监控,视频、音频编解码,网络流媒体等多种用途。它包括一片TMS320DM642数字多媒体处理芯片,4M的flash,32M 133MHz SDRAM,256K的I2C EEPROM,以及一块支持OSD功能的FPGA,它还拥有丰富的外部接口,如三个可以配置的视频端口,一个音频接口,一个以太网接口以及PCI口等。
该评估板的核心为TMS320DM642数字多媒体处理芯片,芯片的内核为C64x DSP核,时钟频率为600MHz,指令执行速度高达4800MIPS,具有6个并行的算术逻辑单元与两个并行的硬件乘法器,利用先进的超长指令字结构(VLIW),DM642可以完成复杂的数字图像处理运算。为了提高处理器的存取速度,C64x还提供了一些特别适用于数字图像处理的指令。
整个系统结构框图可分为三个部分,见图1。摄像头采集的视频为PAL制,经SAA7115H数字化,得到的图像为CIF,大小为352*288个像素,4:2:2格式8位宽的YCbCr格式的信号。该视频解码器可以通过DM642的I2C总线编程设置其内部寄存器以接受大多数的视频信号,如NTSC,PAL以及SECAM等。 (图片)
图1 数字图像处理系统结构框图 DSP读入数字化的视频数据,完成需要的数字图像处理运算。本程序调用功能强大的Image Lib(图像处理库),它包括了许多现成的经过优化的函数,可以完成sobel边缘检测、图像二值化、DCT变换等多种功能。另外还可以自己编写程序实现更复杂的功能,如MPEG-4编码、网络协议等。
经过DSP处理后的数字视频经过Phillips SAA7105视频解码器进行数模转换,而后显示在监视器上。
二 DSP/BIOS实时操作系统介绍
DSP/BIOS是一个简易的嵌入式操作系统[参考文献4、5、8],主要是为需要实时调度、同步以及主机-目标系统通讯和实时监测的应用而设计的。DSP/BIOS集成在CCS中,不需要额外的费用,但不提供源码,它是 TI公司倡导的 eXpressDSP 技术的重要组成部分。
DSP/BIOS本身只占用很少的资源,而且是可裁减的,它只把直接或间接调用的模块和API连接到目标文件中,最多为6500字,因此在多数应用中是可以接受的。它提供底层的应用程序接口,支持系统实时分析、线程管理、调用软件中断、周期函数与后台运行函数(idel函数)以及外部硬件中断与多种外设的管理。利用DSP/BIOS编写代码,借助CCS提供的多种分析与评估工具,如代码执行时间统计、显示输出、各线程占用CPU的时间统计等,可以直观地了解各部分代码的运行开销,高效地调试实时应用程序,缩短软件开发时间,而且DSP/BIOS是构建于已被证实为有效的技术之上的,创建的应用程序稳定性好,软件标准化程度高,可重复使用,这也减少了软件的维护费用。
DSP/BIOS组件由以下3部分组成:
1. DSP/BIOS实时多任务内核与API函数
使用DSP/BIOS开发程序主要就是通过调用DSP/BIOS实时库中的API(应用程序接口)函数来实现的。所有API都提供C语言程序调用接口,只要遵从C语言的调用约定,汇编代码也可以调用DSP/BIOS API。DSP/BIOS API被分为多个模块,根据应用程序模块的配置和使用情况的不同,DSP/BIOS API函数代码长度从500字到6500字不等。CCS FOR C6000 V2。2提供的DSP/BIOS主要的API模块包括以下几种:CLK模块、HST模块、HWI模块、IDL模块、LOG模块、MEM模块、PIP模块、PRD模块、RTDX模块、STS模块、SWI模块、DEC模块、SIO模块、MBX模块、QUE模块与SEM模块。各模块的具体使用方法见参考文献[5,8]。
2. SP/BIOS配置工具
基于DSP/BIOS的程序都需要一个DSP/BIOS的配置文件,其扩展名为.CDB。DSP/BIOS配置工具有一个类似Windows资源管理器的界面,它主要有两个功能:
* 在运行时设置DSP/BIOS库使用的一系列参数;
* 静态创建被DSP应用程序调用的DSP/BIOS API函数所使用的运行对象,这些对象包括软件中断、任务、周期函数及事件日志等。
3. DSP/BIOS实时分析工具
DSP/BIOS分析工具可以辅助CCS环境实现程序的实时调试,以可视化的方式观察程序的性能,并且不影响应用程序的运行。通过CCS下的DSP/BIOS工具控制面板可以选择多个实时分析工具,包括CPU负荷图、程序模块执行状态图、主机通道控制、信息显示窗口、状态统计窗口等。与传统的调试方法不同的是,程序的实时分析要求在目标处理器上运行监测代码,使DSP/BIOS的API和对象可以自动监测目标处理器,实时采集信息并通过CCS分析工具上传到主机。实时分析包括:程序跟踪、性能监测和文件服务等。
三 基于DSP/BIOS的程序开发
基于DSP/BIOS的程序开发是交互式的可反复的开发模式[参考文献6、7、8],开发者可以方便地修改线程的优先级和类型,首先生成基本框架,添加算法之前给程序加上一个仿真的运算负荷进行测试,看是否满足时序要求,然后再添加具体的算法实现代码。
使用DSP/BIOS开发软件需要注意两点:
* 所有与硬件相关的操作都需要借助DSP/BIOS本身提供的函数完成,开发者要避免直接控制硬件资源,如定时器、DMA控制器、串口、中断等;
* 基于DSP/BIOS的程序运行与传统的程序有所不同,传统编写的DSP程序完全控制DSP,程序依次执行,而基于DSP/BIOS的程序,由DSP/BIOS程序控制DSP,用户程序不是顺序执行,而是在DSP/BIOS的调度下按任务、中断的优先级等待执行。
1. 基于DSP/BIOS的程序开发流程
下面以数字图像边缘检测(采用sobel算法)为例,具体分析一下DSP/BIOS程序的编写流程,程序的流程图见图2。 (图片)
图2 基于DSP/BIOS的数字图像处理程序流程 基于DSP/BIOS的程序开发流程一般包括以下几个步骤:
* 利用配置工具设置环境参数并静态建立应用程序要用到的对象。要注意的是,在配置工具下创建对象为静态创建,对象是不可以删除的,利用xxx_create可以动态创建对象,并可以用xxx_delete删除动态创建的对象(xxx表示模块名字,如TSK)。本程序中,在MEM模块设置片内ISRAM、片外SDRAM的起始地址与长度以及heap的大小,在LOG模块创建事件记录对象用来记录程序的运行情况,在TASK模块创建三个任务进程(Input Task、Process Task、Output Task),并在SEM模块创建旗语对象来进行线程之间的通信,在DEV模块配置所需的外设,这里包括视频采集端口VP0和视频输出端口VP2。
* 保存配置文件,保存配置文件时,配置工具自动生成匹配当前配置的汇编源文件和头文件以及一个连接命令文件。
* 为应用程序编写一个框架,可以使用C、汇编语言或C与汇编的混合语言来编程,由于目前C++的编译效率还比较低,在数字图像处理应用中一般不采用C++编程。在CCS环境下编译并连接程序,添加program.cdb和programcfg.cmd到项目工程文件中,其他的文件自动连接进应用程序。如果用户想使用自己的连接命令文件,则需要在自己的命令文件的第一行包含语句“-l programcfg.cmd”。
* 使用仿真器和DSP/BIOS分析工具来测试应用程序,本程序中使用XDS510PP并口仿真器通过JTEG口连接DM642 EVM与PC机进行调试;
* 重复上述步骤直至程序运行正确。
在实际产品开发过程中,当正式产品硬件开发好后,修改配置文件来支持产品硬件并测试。
2. DSP/BIOS程序的启动过程
DSP/BIOS的启动过程包括以下几步:
* 初始化DSP:复位中断向量指向c_int00地址,DSP/BIOS程序从入口点c_int00开始运行。对C6000,初试化堆栈指针(B15)和全局页指针(B14)分别指向堆栈底部与.bss段的开始,控制寄存器AMR、IER和CSR也被初始化;
* 用.cinit段中的记录来初始化.bss段;
* 调用BIOS_init初始化DSP/BIOS模块:BIOS_init执行基本的模块初始化,然后调用MOD_init宏分别初始化每个用到的模块;
* 处理.pinit表:.pinit表包含了初始化函数的指针;
* 调用应用程序main函数:在所有DSP/BIOS模块初始化之后,调用main函数。由图2可以看到,本程序在main函数中添加了必要的初始化代码。Main函数初始化之后CPU的控制权交给DSP/BIOS。需注意,main函数中一定不能存在无限循环,否则整个DSP/BIOS程序将瘫痪;
* 调用BIOS_start启动DSP/BIOS:BIOS_start函数是由配置工具产生的,包含在programcfg.s62文件中,它负责使能DSP/BIOS模块并为每个用到的模块调用MOD_startup宏使其开始工作。
在这些工作完成之后,DSP/BIOS调用IDL_loop引导程序进入DSP/BIOS空闲循环,此时硬件和软件中断可以抢先空闲循环的执行,主机也可以和目标系统之间开始数据传输。由图2可以看到,main函数之后Input Task、Process Task、Output Task三个进程开始执行,此三个进程为同一优先级,进程之间利用旗语(SEM)进行通信,协调线程之间的工作,Input Task完成视频采集功能,Output Task实现视频输出功能,在Process Task线程中调用Image Lib中的IMG_sobel()函数实现边缘检测功能。
四 实验结果与分析
为了统计sobel边缘检测所用的时间,在STS模块创建对象sts,然后在IMG_sobel()函数前后分别添加STS_set(&sts,CLK_gethtime()),STS_delta(&sts,CLK_gethtime())。实验中从统计窗得到IMG_sobel()的运行时间为554100.48个指令周期,约为0.93ms(DSP芯片时钟为600MHz)。由于视频采集为PAL制,两帧间隔为40ms,所以可以实时地检测到物体边缘,边缘检测前后的图像如图3、图4。 (图片) 在整个程序运行时序满足要求之后,可以根据需要改变Process Task中实现的数字图像处理算法,如在边缘检测之前添加直方图均衡、中值滤波等预处理算法,若采用Image Lib,仅需要调用所需的函数即可,这对于数字图像处理程序的编写、调试与维护十分方便。
参考文献:略
作者单位:中国人民解放军装备指挥技术学院
2/6/2006
|