1 引言
数据采集系统在工业测控以及试验室研究方面的应用非常广泛。随着科学技术的发展,数据采集技术被普遍认为是现代科学研究和技术发展的一个重要方面:一方面,数据采集系统正向着高精度、高速度、稳定可靠和集成化的方向发展;另一方面,数据采集系统也向着实时系统方向发展,特别是逻辑和时序要求比较高的系统。
本文介绍的嵌入式数据采集系统采用dsp/bios实现系统的实时响应和调度。系统介绍了硬件系统设计结构,并说明了dsp/bios在系统中的应用,最后阐述了系统的自启动实现。
2 系统的硬件结构
在本系统中,采用ti的高端dsp芯片—tms320c6205作为系统的cpu,外围扩展同步动态ram和异步静态rom(flash),并带有数据采集缓冲系统fifo,cpu通过自身的外围接口直接连接到pci总线上,实现系统与主机的实时通讯。系统结构图如图1。
在系统运行过程中,视频输入信号由fifo缓冲后送入dsp的外围扩展sdram,经dsp处理后输出到pci接口及总线与上位机通讯。sdram主要保存系统实时运行的程序和临时数据,flash保存系统的启动及处理程序和一些配置参数。外围jtag接口不仅可以对系统进行调试,还可以实现实时输出信号处理的结果。
3 dsp/bios实时系统
dsp/bios可以看作一个准实时操作系统,主要是为需要实时调度和同步以及主机/目标机系统通信和实时监测的应用而设计的。dsp/bios支持的ti dsp芯片的各种实时操作系统都是以dsp/bios作为底层软件,为嵌入式应用提供基本的运行服务。此外,它还能通过系统中的jtag接口实时获取目标机的信息,并传送到上位机对应用程序进行实时分析。
dsp/bios提供的运行服务包括基于优先级的任务调度、中断处理和io服务。在软件开发阶段,它为实时应用提供底层软件,节约实验室开发时间。dsp/bios的数据获取、统计和事件记录功能在软件调试阶段和主机的ccs(code composer studio,ti发布的集成开发环境)内的分析工具配合,可以完成对应用程序的实时探测、跟踪和监控,与rtdx技术和ccs的可视化工具相配合,除了可以直接实时显示原始数据外,还可以对原始数据进行处理,如实时fft频谱分析等。
dsp/bios由3部分组成:(1)dsp/bios实时多任务内核;(2)api、dsp/bios实时分析工具;(3)dsp/bios配置工具。
3.1 dsp/bios实时内核和api
dsp/bios api被分为多个模块,根据应用程序模块的配置和使用情况的不同,dsp/bios的代码为500字到6500字不等。应用程序通过调用api来使用dsp/bios,所有dsp/bios的api都是以c可调用的形式提供的。只要遵从c的调用约定,汇编代码也可以调用dsp/bios的api。
本系统中要用到dsp/bios实时内核中的csl(chip support library)调用板级支持包,调用gbl(global setting manager)对系统的环境进行加载,调用hwi(hardware interrupt manager)对系统需要用到的硬件中断进行设置,调用swi(software interrupt manager)对系统的软件中断进行设置。对用到实时数据交换的地方还需要调用rtdx(real-time data exchange setting)对交换模块进行设置。
3.2 dsp/bios配置工具
dsp/bios配置工具有一个类似windows资源管理器的界面,它具有两个功能:一个是在运行时设置dsp/bios库使用的一系列参数;一个是作为一个可视编辑器,创建被dsp应用程序调用的dsp/bios api函数时所使用的运行对象,这些对象包括软件中断、任务、io流及是件日志等。
本系统中在调试时需要用到软件仿真环境,这些环境的参数需要在配置工具中设定具体的参数,比如sdram的大小、类型,dsp的外部设备硬件中断号设定,信息处理程序的软件中断设定等。使用配置工具,dsp/bios的对象可以事先配置好并和应用程序绑定在一起,比运行是动态建立这些对象有更高的响应速度。
3.3 dsp/bios实时分析工具
dsp/bios分析工具可以辅助ccs环境实现程序的实时调试,以可视化的方式观察程序的性能,并且不影响应用程序的运行。dsp/bios分析工具可以通过选择ccs菜单dsp/bios打开。
与传统的调试方法不同的是,程序的实时分析要求在目标处理器上运行监测代码。使用dsp/bios的api和对象,可以自动监测目标处理器,采集实时信息并通过ccs分析工具上传到主机。实时分析包括:程序跟踪、性能监测和文件服务等。
4 基于dsp/bios的程序开发
dsp/bios支持交互式的程序开发模式,可以先为应用程序生成一个框架,在使用实际算法之前给程序加上一个仿真的运行负荷来测试程序。在dsp/bios环境下可以方便的修改线程的优先级和类型。
4.1 dsp/bios下一个程序的开发过程
在dsp/bios下一个程序的开发过程如下:
(1) 用配置工具建立应用程序要用到的对象;
(2) 保存配置文件,保存的同时会生成在编译和链接应用程序时所包括的文件;
(3) 为应用程序编写一个框架,可以使用c、c 、汇编语言或这些语言的任意组合;
(4) 在ccs环境下编译并链接程序;
(5) 使用仿真器(或者使用硬件平台原型)和dsp/bios分析工具来测试应用程序;
(6) 重复上述步骤直至程序运行正确;
(7) 当正式产品硬件开发好后,修改配置文件来支持产品硬件并测试。
4.2 dsp/bios对象的动态建立、引用和删除
在程序开发过程中,经常会动态建立新的dsp/bios对象、动态引用dsp/bios对象或者删除dsp/bios对象。通过xxx_create函数可以建立大部分dsp/bios对象,但不是全部对象,有些对象只能在配置工具中创建。每个xxx_create函数都可以为对象的内部状态信息分配存储空间,并返回一个指向新建对象的句柄,这样xxx模块的其他函数就可以使用这个句柄引用这个新建的对象。下面的一段代码是建立并初始化pro对象的过程:
#include
pro_attrs attrs;
pro_handle process;
attrs=pro_attrs;
attrs.name-#quot;reader#quot;;
attrs.priority=pro_minpri;
process=pro_create((fxn)foo,#attrs);
xxx_create函数所返回的指向某个对象的句柄可以作为引用该对象的参数传递给其他函数,例如传递给xxx_delete函数来删除对象,代码如下:
pro_delete(process);
5 系统启动的实现
系统启动包括两部分:系统上电引导和dsp/bios启动。上电完成后dsp运行部分由dsp/bios来控制。
5.1 系统上电引导
ti c6000系列dsp可以有3种上电引导方式,包括不加载、rom加载和主机加载等。其中不加载是cpu直接从地址0处开始执行代码。主机加载是在引导过程中,外部主机通过主机接口初始化cpu的存储空间,主机完成所有的初始化工作后,向接口控制寄存器的dspint位写1,结束引导过程,cpu退出复位状态,开始执行地址0处的指令。主机加载有三种方式,即hpi接口加载、扩展总线加载和pci总线加载。
在本系统中,为了保持系统的独立性,把加载系统放在外部rom中,实现rom加载。rom加载过程为:位于外部ce1空间的rom中的代码(从首地址开始的64kb数据)首先通过dma(或者edma)被搬入地址0处。加载过程在复位信号撤销之后完成,此时cpu内部保持复位状态,由dma(或者edma)执行1个单帧的数据块传输。传输完成后,cpu退出复位状态,开始执行地址0处的指令。对tms320c6205来说,用户可以指定外部加载rom的存储宽度,emif(外部存储器接口)会自动将相邻的6bit/16bit数据打包成32bit的指令,并且rom中的程序必须按little-endian的模式存储。
5.2 dsp/bios启动
autoinit.c和boot.snn文件决定了dsp/bios应用程序的启动序列,这些文件是由库bios.ann和bioss.ann提供的。启动过程包括一下几步:
(1) 初始化dsp:dsp/bios程序从入口点c_int00开始运行,复位中断向量指向c_int00地址。对于tms320c6205来说,堆栈指针(b15)和全局指针(b14)被初始化指向.stack段的末尾和.bss段的开始。控制寄存器amr、ier和csr也被初始化。
(2) 用.cinit段中的记录来初始化.bss段:堆栈建立好后,初始化例程用.cinit段中的记录初始化全局变量。
(3) 调用bios_init初始化dsp/bios模块:bios_init执行基本的模块初始化,然后调用mod_init宏分别初始化每个用到的模块。如hwi_init初始化有关中断的寄存器。
(4) 处理.pinit表:.pinit表包含了初始化函数的指针
(5) 调用应用程序主程序main函数:在所有dsp/bios模块初始化之后,调用main函数。此时硬件中断和软件中断都是禁止的,应用程序可以在此添加自己的初始化代码。
(6) 调用bios_start启动dsp/bios:bios_start函数是由配置工具产生的,包含在programcfg.snn文件中,它负责使能dsp/bios模块并为每个用到的模块调用mod_startup宏使其开始工作。
在这些工作完成之后,dsp/bios调用idl_loop引导程序进入dsp/bios空闲循环,此时硬件和软件中断可以抢先空闲循环的执行,主机也可以和目标机之间开始数据传输。
6 结束语
dsp/bios在整个目标模板上主要起到两方面的作用:其一是实现主机调试环境对目标模板上运行的应用程序的实时监察和控制,其二是实现各线程之间的调度和线程间的通信。将dsp/bios应用于数据采集板上dsp应用程序的设计不但能够缩短开发周期,而且因为dsp/bios的多线程机制使得应用程序的功能得到了彻底的分化,所以在这种情况下,当原程
|