EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/5/24 17:37:32

0

关于投票

集成外设及DSP/BIOS应用实例(下)---转帖

集成外设及DSP/BIOS应用实例(下)

5  TMS320C6000的DMA控制器设计

本节主要介绍C6000系列的直接存储器访问(DMA,Direct Memory Access)控制器其中介绍硬件特点、DMA通道与寄存器。

5.1  DMA硬件介绍

DMA控制器最大的特点是可以在没有CPU参与的情况下完成映射存储空间中的数据搬移。这些数据搬移可以是在片内存储器、片内外设或是外部器件之间,而且是在CPU后台进行的。DMA控制器具有4个相互独立编程的传输通道,允许进行4个不同内容的DMA传输。另外,还有一个辅助通道用来服务于主机口接口读写访问。

在讨论DMA操作时,需要了解C6000的DMA传输中的几个概念:

(1)数据的读传输(read transfer):DMA控制器从源地址存储器中读取数据。

(2)数据的写传输(write transfer):DMA控制器将读取的数据写入目标地址存储器中。

(3)数据单元传输(element transfer):一个数据单元的读传输和写传输的结合。

(4)帧传输( transfer):帧的大小可编程设置。完成一个帧传输即传输一定数量的数据单元。

(5)块传输(block transfer):每个DMlA通道也可以独立定义每块中帧的数量。完成一个块传输即传输一定数量的帧。

(6).发送数据单元的传输(transmit element transfer):在通道分割模式下,数据单元从源  地址中读出并写入分割目的地址。

(7)接受数据单元的传输(receive element transfer):在通道分割模式下,数据单元从分割源地址中读出并写入目的地址。

DMA控制器有如下主要特点:

(1)后台操作:DMA控制器可以独立于CPU工作。

(2)高吞吐率:可以以CPU时钟的速度进行数据传输。

(3)4个通道:DMA摔制器可以控制4个独立通道的传输。

(4)辅助通道:主机口用辅助通道来访问CPU的存储空间。辅助通道与其他通道间的优先级可以设置。

(5)单通道分割(split-channel)操作:利用单个通道就可以与一个外设间同时进行数据的读和写传输,效果就好像使用两个DMA通道一样。

(6)多帧()传输:传送的每个数据块可以含有多个数据帧。

(7)优先级可编程:每一个通道对于CPU的优先级是可编程确定的。

(8)地址产生方式可编程:每个通道的源地址寄存器和目标地址寄存器对于每次读写都是可配置索引的。地址可以是常量、递增、递减,或是设定地址索引值。

(9)32位地址范围:DMA控制器可以对仟何一个地址映射区域进行访问,包括:

·片内数据存储区

·片内程序存储区(当其作为映射存储器时,而不是作为cache使用)

·片内的集成外设

·通过EMIF接口的外部存储器

·通过扩展总线接口的扩展存储器

(10)传送数据的字长可编程:每个通道都可以独立选择宽度为字节、半字(16位)或字(32位)。

(11)自动初始化:每传送完一块数据,DMA通道会自动为下一个数据块的传送重新初始化。

(12)事件同步:读、写和帧操作都町以由指定的事件触发。

(13)中断反馈:当一帧或一块数据传送完牛,或是出现错误情况时,每一个通道都可以向CPU发出中断请求。

DMA控制器在C6000中的位置如图4-32所示的阴影部分。


5.2  DMA控制器设计及应用

    1.DMA寄存器、初始化和启动

DMA寄存器用于初始化和控制DMA操作。每一个DMA通道都有一套相关的寄存器完成传输控制,在启动DMA之前,必须刘它们进行初始化。表4-14列出了有关的控制寄存器及其在映射存储器中的位置。限于篇幅,这里没有列出寄存器各个控制位的意义。读者可以参考TI的相关文档。

点击看大图

每一个DMA通道启动可以在程序中由CPU完成,也可以是通过自动初始化肩动。每一个DMA通道都可以山CPU控制独立启动、暂停和停止。DMA通道丰控寄存器(PRICTL)的STATIS域指示相应DMA通道的当前状态。只有在STATUS位和START位相同时,才可以修改主控寄存器。启动操作如下所示:

·手工启动:向DMA主控制寄存器(PRICTL)的START域写入01b将直即启动该通    道的DMA。一旦启动,STATUS的值会变成01b。注意一旦启动,再写入01b将不会有任何影响。

    ·暂停操作:在启动后,向START写10b可以暂停DMA。暂停时,如果某个数据单元传输的读传输过程已经完成,此时DMA通道会继续完成其对应的写传输。STATUS在DMA完成当前写传送后变为10b。

    ·停止操作:启动后写入START=00b,DMA控制器将被停止。停止操作和暂停操作相    同。除非是工作在自动初始化模式下,否则一旦DMA完成数据传输,该通道使进入停止状态,STATUS的值变为00b。

在一次块传送任务完成后,DMA控制器可以自动初始化。向主控制寄存器的START写入11b将以自动初始化方式启动DMA。在一次块传送任务完成后,DMA控制器自动调用DMA全局数据寄存器值预先为下一次数据块的传送操作初始化,因此DMA通道参数设置可以在下一次传送操作之前完成。自动初始化可以使DMA进行以下几种操作方式:

·连续操作:该方式占用一定CPU时间。通常,CPU必须在一次读写传送完成之后立    即重新初始化DMA。利用重载寄存器,就可以在当前块传输中的任何时间为下一次传送初始化参数。

·重复操作:连续操作的一个特例。传送完一块后,DMA控制器将重复前一次相同的    块传输。这种情况下,CPU不需要反复设置重载寄存器,只需在开始传输之前设定重载寄存器的值。

·使能自动初始化:只需通道主控制寄存器的START=11b,就可以使能自动初始化。    传送完一块后,DMA控制器将重载寄存器,重复前一次相同的块传输。如果在暂停后重新启动,START必须被重新设置为11b,以使自动初始化使能。

在从自动初始化到非自动初始化操作中,首先需要暂停DMA摔制器,即写入10b,然后再次启动DMA控制器,即写入01b。

2.传输计数

     DMA的通道传输计数寄存器(XFRCNT)包含两个域,分别表示当前传输的帧计数和每帧的数据单元计数,如图4-33所示。DMA的全局计数重装载寄存器结构与传输计数寄存器的结构相同,如图4-34所示。


· COUNT:此域的16位无符号数指示当前块传输中的帧数,每块的最大帧数  为65535。当一帧内的最后一个读传输完成后,该计数值递减。一旦最后一帧传送完后,整个计数器会被DMA通道主控寄存器的CNT RELOAD域所指定的DMA全局计数重载寄存器内的高16位值重载。COUNT设置为0的效果和设置为1一样。

·ELEMENT COUNT:此域内的16位无符号数指示每帧传输的数据单元个数。每次数  据单元的读传输完成后,该值递减。每帧的最大数据单元数目为65535。最后一个数据单元完成传输后,ELBMENT会被DMA通道主控寄存器的CNT RELOAD域所选定的DMA全局计数重载寄存器内的低16位值重载。在块传输开始前,计数器以及对应的全局计数重载寄存器低16位必须设置相同的值,以保证每次的帧长度相同。  除了在自动初始化模式下需要这种重载以外,对于多帧数据传送,也需要数据单元计  数的重加载,必须设定重载值。如果数据单元计数初始值为零,则操作无效。

     3.传输控制:同步与地址产生

同步机制使得用户可以利用某些事什来触发DMA的传输过程,例如外设中断或外部引脚中断。每一个通道有三种类型的同步方式:

   读同步:由指定的事件触发读传输。

   写同步:由指定的事件触发写传输。

   帧同步:由指定的事件触发帧传输。

由DMA通道主控寄存器的RSYNC和WSYNC两个域控制DMA的同步事件。如果这个寄存器内的FS=1,那么整个帧的同步事件是RSYNC选定的事件,这时WSYNC必须设置为00000b。如果该通道设置为分裂模式(SPLIT不等于OOb),那么RSYNC和WSYNC必须设为非零值。表4-15列出了两个域和同步事件的对应关系。

DMA通道副控寄存器中的STAT和CLR位与同步事件的控制有关。

当指定事件的有关信号发生由低变高(或由高变低)变化时,各个通道会锁定事件,同时相应的STAT位被置位。如果没有选择同步事件,读SFAT位总是1。单个事件可以用来触发多个动作。

通过清除悬挂事件可以强制DMA通道等待下一个事件。相反,设置事件可以触发块传输。在触发事件的相关操作完成后,锁定事件的STAT位标志会被自动清除,也可以通过手动清除。用户可以分别向STAT和CLR写入1,手工设置事件或是清除事件。对STAT和CLR位写入0足无效的。手工清除与设置的优先级总是高于任何自动的清除与设置。


DMA控制器负责对每个通道的读写传输进行地址计算。利用不同的地址产生方式,DMA控制器可以支持多种结构数据的传输。例如,DMA控制器可以对矩阵数据进行转置操作。

DMA通道的源地址寄存器和目的地址寄存器都是32位,分别存放下次读传输和写传输的操作地址。如图4-35和图4-36所示。


在计算传输地址时,有基本调整和使用全局索引值调整两种计算方式。基本调整是指通
过控制域SRC DIR和DST DIR来设置传输地址按数据字长大小递增、递减、保持不变。

全局索引寄存器如图4-37所示。与基本调整不同,这种模式是根据传输的数据元素是否是当前帧的最后一个来进行不同的地址调整。全局索引寄存器的LSBl6(ELEMENTINDEX)中存放普通调整值,MSBl6( INDEX)中存放帧尾调整值,两个索引值都是16位有符号数,范围从32768~32767。每帧中数据除最后一个数据传输之外都按ELEMENT INDEX值规定地址寄存器的增量,对于最后一个数据传输,按照 INDEX值调整地址寄存器的值。

 


4.单一通道的分裂操作

利用通道分裂操作方式可以使一个DMA通道为一个具有固定地址的外部或是内部外设同时提供输入和输出数据流。

    分裂通道操作分为发送数据单元的传输和接收数据单元的传输,每种传输都依次执行一
次读传输和一次写传输:

    ·发送数据单元的传输

■发送读传输:数据从DMA通道的源地址读出,然后源地址按照设置参数进行调    整,传送计数减1。没有同步事件。

■发送写传输:由发送读传输得到的数据被写入分裂目标地址。此过程有WSYNC    域所指定的同步事件。

■接收数据单元的传输

    ■接收读传输:数据从DMA通道的分裂源地址读出。此过程有RSYNC域所指定的事件同步。

    ■接收写传输:由接收读传输得到的数据被写入目标地址,然后目标地址按照设置    调整。没有同步事件。

由于每个通道只有一个数据单元传输和帧传输计数器,因此接收与发送的帧数以及每帧的数据单元个数必须是相同的。为了使分裂通道正常工作,RSYNC和WSYNC控制域必须配置为非零值,同时禁止帧同步方式。

所有传输都按照以上次序进行。但是在以上的过程中,发送数据单元传输并不需要等前一次的接收数据单元传输完成之后才能进行。因此发送数据有可能会发生在接收数据之前。整个相关的发送数据单元传输完成后,源地址寄存器会被递减或者重新初始化。只要发送数据单元传输的次数不会超过接收数据单元传输的次数8次,DMA通道的硬件会继续运行,否则发送数据单元传输将被停止。

在DMA主控寄存器中SPLIT域选取相应的DMA全局地址寄存器作为分裂传输操作中的分裂地址:

    ·分裂源地址:即C6000的输入数据流的源地址,保存在选定的DMA全局地址寄存器    里。
    ·分裂目标地址:即C6000的输出数据流目的地址,比分裂源地址大一个字(4个字节)。    两个地址的最低3位始终为0,强制按照字地址大小排列。从而确保分裂源地址在偶数字上,分裂目标地址是在奇数字上。  对于外部设备,用户在设计地址译码时一定要符合这个规定分裂操作要求。

     5.资源仲裁和优先级设置

     DMA控制器片内仲裁机构根据优先级确定哪个请求方将先获得资源的控制权。这些请求方包括:

   (1)DMA通道。

   (2)CPU的程序存取和数据存取。

   公共资源包括:

   (1)片内数据存储器。

   (2)片内程序存储器。

   (3)通过外设总线访问的片内外设寄存器。

   (4)通过片内外部存储器接口(EMIF)访问的外部存储器。

   (5)通过扩展总线访问的扩展存储器。

   优先级的设置包括两个方面:

(1)DMA与CPU之间:每一个通道都可以独立配置为高优先级模式。主控寄存器的PRI位决定了每一个DMA通道与CPU访问之间的优先级,辅助控制寄存器中的AIJXPRI位决定了辅助通道和CPU之间的优先级。

(2)DMA通道之间的优先级:4个通道的优先级是固定的,通道0优先级最高,通道3优先级最低。辅助通道的优先级是可任意设置的。

    6.DMA通道的状态

一些状态标志位提示着DMA的工作情况,这些标志存在于DMA通道副控寄存器中。副控寄存器中的一系列中断允许位(IE)控制的是DMA中断CPU的方式。如果某个状态对应的IE被使能,则相应的状态变化就会影响该通道的中断信号。当该通道的TCINT他设为1,所有的状态信号相或的结果就会产生DMA_INTx信号并被送往CPU,甭则DMA_INTx无效。它们的逻辑关系如图4-38所示。


5.3 BIOS中DMA设置实例

在TMS320C6xTM系列器件里,有两个DMA结构,即DMA和EDMA(enhanced DMA)。C6201TM器件集成了DMA外设,而C6211TM集成了EDMA外设。两种DMA结构在结构上有很大的不同,所以BIOS为每一种结构分别提供了对应的独立API模块。

    1.BlOS中DMA控制器API函数

同样:DMA模块基于句柄模式,完成对DSP器件DMA外设的控制,进行DMA操作。API模块包括结构定义、函数和宏。

     DMA配置结构有两个,如表4-17所示。

点击看大图
点击看大图
 2.用CSL UI配置DMA控制器
    
     采用CSL GUI可以很方便地配置DMA控制器。DMA模块包括配置管理器、资源管理器和全局寄存器管理器,CSL图形用户接口DMA部分界面如图4-39所示。

     DMA模块包括下面几个部分:

     (1)DMA配置管理器:配置管理器允许创建一个初始化DMA通道寄存器的配置对象。

     (2)DMA资源管理器:资源管理器指定DMA通道用哪一个配置对象配置。

     (3)DMA全局寄存器管理器:全局寄存器管理器预先初始化全局寄存器。

     利用DMA配置管理器可以很方便地创建一个配置对象,非常直观地设置DMA通道的相关寄存器。DMA配置管理器的属性选项卡如图4-40所示。

 


在属性选项卡中可以设置相关的存储器映射寄存器。配置操作可以分成以下几个部分。

·Operation Mode:工作模式。

·Source:源地址,增加和重载配置。

·Destination:目标地址,增加和重载配置。

·Synchronization:同步控制。

·Count/Index:选择全局寄存器和计数值。

·Intellaap Enable:中断控制。

·Condition:清除条件标志位。

DMA资源管理器把已设定好的DMA配置对象与某一DMA通道绑定,在属性选项卡中直接选择配置对象。如图4-41所示,选择已经创建的对象dmaCfg1初始化DMA通道,DMA通道的句柄是hDmaO。

对于每个DMA通道,全局寄存器是共享的。用资源管理器可以很方便地初始化全局寄存器。全局资源管理器属性选项卡如图4-42所示,设置好该项将会生成对应的DMA_globalAlloc()和DMA_globalConfig()CSL函数。

点击看大图

 

6本章小结
本文介绍了C6000系列DSP芯片的集成外设,主要从外设接口特点和使用等几个方面着重进行介绍。另外给出了如何使用BIOS中芯片支持库(CSL)访问和控制片上外设。限于篇幅,有些部分没有介绍,有兴趣的读者可以参照TI的相关文档。

 

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(713) | 回复(0)

发表于 2008/5/24 17:35:41

0

关于投票

集成外设及DSP/BIOS应用实例(上)---转帖

http://blog.eccn.com/u/107250/archives/2007/305.htm

集成外设及DSP/BIOS应用实例(上)

本文将主要介绍C6000系列DSP的外设,分别从硬件接口特点、接口设计和接口设置等方面介绍了主机口HPI、多通道缓冲串口McBSP和直接存取控制器DMA/EDMA等外设。另外,介绍了如何利用DSP/BIOS操作系统提供的芯片支持库(CSL)访问和控制各个外设。

1  集成外设资源概述

C6000系列DSP在内部集成了丰富的外围设备(Peripherals),方便用于控制片外的存储器、主机以及串行通信设备。对于每种型号的外设资源都是不一样的,具体的需要查询该芯片的技术资料。

    在C6000系列DSP中集成的外设资源有:

    1.DMA与EMDA控制器

DMA、EDMA控制器最人的特点是可以在没有CPU参与的情况下完成映射存储空间中的数据搬移。这些数据搬移可以是在片内存储器、片内外设或是外部器件之间,而且是在CPU后台进行的。

C620x/C670x内部集成了DMA外设,其特点如下:

  (1)DMA摔制器独立于CPU 工作,具有单周期的数据吞叶率。

  (2)四个通道,外加专用的辅助通道,每一个通道对十CPU的优先级可设置。

  (3)32位寻址能力,可以对存储器映射空间的任何一个区域进行访问。

  (4)传送数据支持8/16/32位字长。

  (5)具有灵活的地址产生方式,有单通道分割(split-channel)操作模式。

  (6)每次数据块传输完毕后,可以进行DMA通道的自动初始化。

  (7)传输操作可以由选择的同步事件触发。

  (8)每个通道都可以触发中断事件。

  C621x/C671x内部集成的是EDMA外设,其特点如下:

  (1)16个通道,EDMA可以对16个通道进行彼此独立的控制。

  (2)连接:EMDA通道可以被连接起来,构成一个传输链。

  (3)事件同步:每一个通道都有一个特定的事件来触发。

  (4)主机接口HPI。

主机口(HPI)是一个16/32位宽度的并行端口,主机可以通过它直接访问CPU的整个存储空间,包括C6000片内存储映射的外围设备。C62x/C67x HPI与CPU存储空间的互连是通过DMA控制器实现的。借助专门的地址和数据寄存器,通过DMA辅助通道,完成HPI对存储空间的访问。主机和CPU都可以对HPI控制寄存器(HPIC)进行访问,主机还可以访问HPI地址寄存器(HPIA)和HPI数据寄存器(HPID)。对于C64x器件,CPU也可以访问HPIA寄存器。

2.多通道缓冲串口McBSP

C6000的多通道缓冲串口(McBSP)是存C2x和C54x的串口的基础上发展起来的,McBSP的功能包括:

  (1)全双工通信。

  (2)两级缓冲数据寄存器,允许连续的数据流。

  (3)收发独立的帧信号和时钟信号。

  (4)可以与工业标准的编/解码器、AICs(模拟接口芯片)以及其他串行A/D,D/A接口。

  (5)数据传输可以利用外部时钟,或者是片内的可编程时钟。

  (6)当利用DMA、McBSP服务时,串口数据读写具有自动缓冲能力。

  3.外设存储接口EMIF

  EMIF是实现外设存储器与DSP无缝连接的桥梁,EMIF支持的存储器包括:

  (1)同步突发静态RAM(SBSRAM)。

  (2)同步动态RAM(SDRAM)。

  (3)异步器件(包括异步SRAM,ROM和FIFO等)。

  (4)外部共享存储空间的操作。

EMIF整个外部空间最大容量为64MB,分为4个空间(2E0~CE3,每个CE空间彼此独立,可以进行不同的访问控制,但是某些控制信号线是复用的,使用时一定要注意。数据总线宽度32bit,同时也提供8/16位存储器的读写支持。

4.扩展总线XBUS

扩展总线(XBUS)是一个32位宽度的总线,支持多种异步外设、异步或同步FIFOs、PCI接口芯片和其他类型的外部主机。在主机口接口方面,扩展总线的功能较HPI有了很大增强。XBUS提供了曲种模式,即同步和异步主机口模式。异步模式相当于一个32位的HPI,同步模式支持多种协议的接口。

目前在C6202和C6203中具有扩展总线XBUS功能。

5.自举逻辑控制

TI C6000系列DSP芯片使用多种加载方式。根据复位前管脚的状态执行相应的加载方式。目前提供的3种加载方式如下:

(1)没有BOOT处理:CPU直接从地址0处开始运行。

(2)ROM加载模式:通过DMA控制器,把存储在外部存储器里的程序加载到内部首地址0处,在加载过程中,CPU已经脱离复位状态,但是仍处于stall状态。对于C620x/C670x DSP,要求程序代码必须是以Little-Endian模式存储在外部存储器中,尤其是ROM设备。

(3)主机加载模式:在主机加载模式下,外部主机可以通过HPI接口读写访问CPU的存储空间,包括内部配置的寄存器,如EMIF控制寄存器或其他外设。一旦主机完成了所有的初始化工作后,必须置DSPINT为1,表示已经完成加载过程,同时使CPU脱离stall状态,CPU开始从地址0处运行程序。

在C6201/C6701有专门的管脚BOOTMODE[4:O]决定DSP芯片复位后运行的加载方式,而C6211/C6711是利用主机口的HD[4:0]管脚复用,C6202/C6203是利用扩展总线的XD[4:0]管脚复用。

6.定时器

(26000系列集成了32位的通用定时器。定时器的输入时钟可以由内部产生,也可以是外部时钟;可以通过输出口TOUT输出时钟。TINT和。TOUT两个管脚也可以被配置为GPIO口。定时器可以用于

  (1)计时。

  (2)事件计数。

  (3)产生脉冲。

  (4)产生CPU中断信号。

  (5)产生DMA的同步信号。

2  DSP/BlOS

CCS(Code Composer Studio)是一个完整的DSP集成开发环境,所有的TI DSP都可以使用该软件进行丌发。在CCS中,不仅集成了常规的开发工具如源程序编辑器、代码生成工具(编译、连接器)以及调试环境外,还提供了DSP/BIOS开发工具。DSP/BIOS是一个可裁剪的实时操作系统,方便用户编写多任务应用程序。DSP/BIOS提供了类似于先占式的多线程运行方式、硬件驱动、实时分析和配置工具。DSP/BIOS已经是DSP开发过程中重要的工具。在本节将介绍DSP/BIOS工具的使用。

2.1  DSP/BIOS概述

DSP/BIOS是一个可裁剪的实时操作系统,本身占用很少的CPU资源,被集成在CCS开发环境里。该操作系统由TI公司免费提供。DSP/BIOS提供底层的应用函数接口,可用于支持系统实时分析、线程管理、调度软件中断、周期函数idle函数(后台运行函数)以及外部硬件中断与各种外设的管理。DSP/BIOS主要包括以下几个部分:

    1.DSP/BlOS配置工具

CCS提供了DSP/BIOS GUI功能,即DSP/BIOS配置工具。使用该工具,可以静态创建和配置程序中使用的DSP/BIOS对象,也可以配置存储器分配、线程管理和中断句柄。

2.DSP/BIOS实时分析工具

DSP/BIOS提供的一个强大的实时分析工具。使用该工具可以实时观测程序的运行状况,如各个线程占用CPU运行时间、代码执行时间统计、显示输出信息等。

    3.DSP/BIOS应用程序接口(API)

DSP/BIOS提供了超过150个API函数,其中有与C语言、C++语言和汇编语言接口的函数。这些API函数是为在硬件目标的嵌入式程序工作的,包括实时统计、I/O模块、软件中断管理和时钟管理等模块。由于应用程序的不同,DSP/BIOS API函数的代码长度从200~2000B不等。程序通过调用API函数米使用DSP/BIOS的资源。目前DSP/BIOS中主要的API模块有CLK模块、HST模块、HWI模块、IDL模块、LOG模块、MEM模块、PIP模块、PRD模块、RTDX模块、STS模块、SWI模块、DEC模块、SIO模块、MXB模块、QUE模块和SEM模块。

2.2  DSP/BIOS GUI配置

在DSP/BIOS的程序里,有一个DSP/BIOS的配置文什,该配置文件的后缀名为.cdb。这是一个图形界面的参数设置窗口,如图4-1所示。主要有两种功能:

(1)确定DSP/BIOS使用的各种参数。

(2)可以静态说明需要调用的DSP/BIOS模块,包括中断、任务和内部集成的外设等。


 1.系统设置项

系统设置项包括全局设置、存储器段管理器、系统设置和模块钩子管理器,如图4-2所示。

在全局设置的属性窗口中可以设置正使用的DSP型号、选择使用的片级支持库CSL、Endian模式和Cache模式等多种参数。在存储器段管理器的属性窗口中可以进行系统程序存储段的管理。通过该项设置,系统将自动生成系统程序连接时使用的.cmd文件。

2.实时分析工具

实时分析工具包括LOG管理器和统计类管理器,如图4-3所示。


用户可以利用LOG模块中的事件日志来记录实时的事件。系统口志记录系统所有运行事件包括系统出错等事件。用户可以用LOG_printf或LOG_event函数在用户日志中添加消息。用户可以利用STS模块仝面了解中断、任务以及用户自己定义的代码段或函数的运行时间。

3.线程管理

DSP/BIOS是一个类似于先占式的多任务操作系统。BIOS把任务称之为线程,一个线程是一个单独的控制点,可能包含一个子程序、一个宏或者足一个函数调用。DSP/BIOS内核支持具有不同优先级的多种类型线程运行,高优先级的线程可以中断低优先级的线程,因此具有类似的先.占式特点。

   DSP/BIOS提供了以下几种线程类型,优先级从高到低。

  (1)硬件中断HWI(含CLK模块)。

   (2)软件中断SWI(含PRD模块)。

   (3)任务TSK。

   (4)后台线程IDL。

   线程管理的界面如图4-4所示,使用GUI可以很方便地增加/删除线程。

   4.同步

同步主要的任务就是负责线程之间的协调,如同步通信、数据交换等。其中包括旗语、邮箱、队列管理和资源锁定管理等部分,如图4-5所示。


5.输入输出

    DSP/BIOS内核提供了丰富的数据交换途径。利用BIOS可以方便地实现主机和DSP之间的实时数据交换(RTDX和HST)以及各种线程之间的数据交换。DSP/BIOS的PIP模块
和SIO模块将主要用于I/O数据流的缓冲,这些数据流称为线程、DSP芯片和实时外围设备提供了牢固的数据软件结构。输入输出界面如图4-6所示。


6.片级支持库

片级支持库(CSL)提供了一个C语言接口的配置和控制片内外设1具。CSL集成在BIOS里,系统程序可以使用该功能,也可以不使用。使用片级支持库(CSL)简化了DSP片上外设开发时间,可以加快项目开发进度。片剂支持库(CSL)可以预先静态设置,也可以在程序运行时动态设置。

2.3  DSP/BIOS编程实例

DSP/BIOS是一个嵌入式实时操作系统。在BIOS基础上编程与普通的编写程序不同,下面将以TI的例了来介绍BIOS的编程特点。

    (1)首先新建一个BIOS配置文件。建市两个软件中断SWl0和SWll,SWl0的优先级设为1,SWll优先级设为2,如图4-7所示。


保存例子,名称为switest.cdb。

(2)新建一个工程,工程名switest.pit。把配置文件switest.cdb加入到工程文件中去,同时把switestcfg.cmd文件也加入到工程文件中。

(3)新建switest.C文件。源文件如下:


(4)编译连接工程,打开execution graph、statistics view和message log窗口,然后运行程序。在实时分析工具中可以观察到线程SWIO和SWll运行一次,部分时间是其他线程和KNL-swi运行,如图4-8~图4-10所示。

3  TMS320C6000的HPl接口设计

本节主要介绍主机接口外设HPI,其中介绍了主机如何通过主机接口(Host-port interface,HPI)读写访问C6000的存储器资源,包括HPI的控制寄存器设置,有关信号的作用与接口等。

3.1  HPI硬件介绍

主机口(HPI)是一个16/32位宽度的并行端口,主机可以通过它直接访问CPU的整个存储空间,包括C6000片内的存储映射的外围设备。HPI与CPU存储空间的互连是通过DMA/EDMA控制器实现的。借助专门的地址和数据寄存器,通过DMA辅助通道,完成HPI对存储空间的访问。主机和CPU都呵以对HPI控制寄存器(HPlC)进行访问,另外主机可以访问HPI地址寄存器(HPIA)和HPI数据寄存器(HPID)。对于C64x器件,CPU也可以访问HPIA寄存器。

图4-11中的阴影部分是HPI在C620x/C670x整个芯片中的位置。图4-12是HPI在C621x/C671X/C64x整个芯片中的位置(阴影部分)。表4-1列出了在C6000系列芯片中HPI外设的区别。


3.2 HPI接口及其应用

在这里将仔细介绍HPI接口的特点,分析HPI接口信号和总线时序的特点,硬件接口设计和软件设计特点。

    1.HPI接口与信号

主机可以通过HPI接口与CPU连接,HPI管脚信号功能如表4-2所示,详细的信号描述可以参照TI相关文档。

 


C6000 DSP不同芯片的HPI外设与主机接口有所不同,下面简要介绍其区别。

对于C620x/C670x芯片的HPI外设,HPI是16位宽度的并行接口,CPU可以自动地把主机连续写入的两个16位数据组合成一个32位数据。丰机把数据写入HPID寄存器,DMA辅助通道可以访问所有的CPU地址,把写入的数据存储到指定地址的存储空间中去。C620x/C670x芯片的HPI外设与主机连接框图如图4-13所示。


C64x芯片的HPI外设与主机连接框图如图4-15所示。C64x HPI外没有32根外部数据引脚,支持16/32位数据传输。C64x器件根据自举加载配置和器件配置决定是16位还是32位数据通道。C64x HPll6是C621x/C67lx的HPI外设增强版本。除了C621x/C67lx的HPI外设功能外,HPll6允许DSP访问HPI地址寄存器HPIA。如图4-15所示,地址寄存器HPIA分成两个寄存器,即HPIA写寄存器(HPIAW)和HPIA读寄存器(HPIAR)。HPI 32和HPI16功能类似,区别在于数据总线宽度不一样,而且HPI 32不使用 HHWIL信号线。

2.HPI总线时序

图4-16~图4-19分别给出了HPI读和写操作的时序。/HSTROBE是内部选通信号,由/HDSl、/HDS2和,HCS信号逻辑组合产生。控制信号:HCNTL[1:0]、HR/W、HHWIL和/HBE[1:0]是输入信号,由主机驱动。HCNTL[1:0]和HR/W控制对两个半字的访问。HRDY低电平表示HPI已经准备好收发数据。

/HAS信号为高电平或者没有使用,那么/HSTROBE的下降沿锁存控制信号。如果使用了/HAS信号,在/HAS的下降沿锁存控制信号。可以根据具体的情况来决定是否在接口中应用选通信号HAS,因此下面的读写时序中部各自给出了有/HAS和没有/HAS信号时的情况。


3.HPI控制寄存器

HPI外设利用3个寄存器完成主机和DSP之间的数据交换。3个寄存器分别是HPI数据寄存器(HPID)、HPI地址寄存器(HPIA)和HPI控制寄存器(HPIC)。对于C64x器件,HPI地址寄存器分为地址读寄存器(HPIAR)和地址写寄存器(HPIAW)。

HPIA中存放主机访问DSP存储空间的地址,这是一个30位值,最低2位固定为0。对于C62x/C67x,只有主机才能访问HPIA,DSP不可以访问。对于C64x,主机和DSP都可以访问HPIA寄存器,主机可以对DSP的不同存储空问进行读写操作。

HPID中存放的是主机从存储空问读取的数据,或者是主机要向DSP的存储空间写入的数据。HPIC是32位寄存器,高16位和低16位对应的是同一个物理存储区,因此高16位和低16位的内容是一样的。在写HPIC时,必须保证写入数据的高16位和低16位的内容一致。HPIC寄存器如图4-20所示,其中各位意义如表4-3所示。


 4.主机访问操作顺序

  主机按照以下的顺序完成对HPI的访问:

  (1)初始化HPIC寄存器。

  (2)初始化HPIA寄存器。

  (3)从HPID寄存器读取/写入数据。

对HPI任何一个寄存器的访问,主机都需要在HPI总线上进行两次half-word的存取(第1个16位HHWIL为0,第2个HHWIL为1)。一般主机不会打断这样的两次存取,一旦打断可能会引起整个数据的丢失或者数据被破坏。如果前一次HPI的访问尚未完成,那么当前的第一个half-word的存取需要等待,此时HPI会置/HRDY信号为高。但是在第2个半字存取访问时,HRDY可以为有效状态。C64x}fPl32把两个半字组合成一个字传输。

在访问任何数据之前,必须对HPI进行初始化,包括设置HPIC和HPIA寄存器。对C62x/C67x和C64x是有所不同的。

   HPI的数据传输模式有4种:

   (1)不带地址白增的读操作。

   (2)带地址自增的读操作。

   (3)不带地址自增的写操作。   

   (4)带地址自增的写操作。

这些模式由HPI的HCNTL[1:O]信号以及HHWIL进行控制,具体如表4-4所示。其中的地址自增功能使主机可以很便捷地访问一个线性存储区域,而无需反复地向HPIA中写入需要的地址。


5.HP的自举加载操作

通过HPI接口也提供了相应的HPI加载方式。当CPU复位时,根据相应的加载配置,CPU进入HPI加载处理方式。在HPI加载处理方式中,DSP处在复位状念,而其他部分脱离复位状态。通过HPI接口,主机可以访问DSP的全部存储空间,包括片内外设寄存器、片内存储器和片外存储器。主机完成初始化DSP后,需要向HPI控制寄存器HPIC的DSPHlNT位写1,这样才可以使DSP脱离复位状态开始从地址0处执行程序。HPI加载处理过程如图4-21所示。


3.3 BlOS中HPI设置实例

HPI模块提供了访问HPI寄存器的API函数,其中用于访问HPI状态位和设置中断事件。对于C64x,还包括读写HPlA寄存器。在CCS中没有提供HPI设置图形用户接口。

     HPI模块提供的API函数如表4-5所示。


4  TMS320C6000的McBSP接口设计

本节对多通道缓冲串口McBSP(Multi-channel Buffered Serial Port)的硬件及其操作进行介绍,包括有关的控制寄存器设置和时序图。此外,还介绍在BIOS中McBSP模块的特点和应用。

4.1  McBSP硬件介绍

C6000的多通道缓冲串口(McBSP)是在TMS320C2x/C3x/C5x和TMS320C54x串口的基础上发展起来的,McBSP的功能包括:

   (1)全双工通信。

   (2)双缓冲数据寄存器,允许连续的数据流。

   (3)收发独立的帧信号和时钟信号。

   (4)可以与工业标准的编/解码器、AICs(模拟接口芯片)以及其他串行A/D,D/A接口。

   (5)数据传输可以利用外部时钟,或者是片内的可编程时钟。

   (6)通过5通道的DMA控制器,串口数据读写具有自动缓冲能力。

   另外,McBSP有以下特点:

   (1)支持以下方式的传输接口:

   ■TI/E1帧协议

   ■MVIP兼容的交换方式以及ST—BUS兼容设备,包括:MVIP帧方式、H.100帧方   式和SCSA帧方式

   ■IOM-2兼容设备

   ■AC97兼容设备

   ■IIS兼容设备

   ■SPI设备

  (2)可与多达128个通道进行收发。

  (3)传输的数据字长可以是8位、12位、16位、20位、24位和32位。

  (4)μ-律/A-律压扩硬件。

  (5)对8位数据的传输,可选择LSB先传还是MSB先传。

  (6)可设置帧同步信号和数据时钟信号的极性。

  (7)内部传输时钟和帧同步信号可编程程度高。

所有的C6000器件有着同样的McBSP接口,但是C621x/C671x和C64x器件的McBSP接口却有所不同,增加了新的特色和增强功能。

4.2  McBSP接口及应用

McBSP外设具有很多强大功能,在这里将要介绍外设的信号接口、控制寄存器、时序特点以及初始化工作;同时介绍了作为SPI接口和通用IO口使用的原理和方法。对于McBSP的多通道工作模式和μ-律/A-律压扩硬件功能没有介绍,有兴趣的读者可以参照TI相关文档。

    1.信号接口和寄存器

McBSP包括一个数据通道和一个控制通道,连接到外部器件。数据通过发送(DX)和接收(DR)引脚与外部器件通信,而其他的4个引脚起时钟和帧同步信号作用。C6000通过片内的外设总线访问串口的32位控制寄存器,进而实现与McBSP间的通信与控制。McBSP结构如图4-23所示。外部引脚含义如表4-6所示。

 


数据通道完成数据的发送和接收。CPU或DMA控制器将待发送的数据写入发送寄仔器(DXR)中,从接收寄存器(DRR)读取接收到的数据。写入DXR的数据通过发送移化寄存器(XSR)移位,从DX管脚输出。同样,DR管脚上接收到的数据先移位到接收移位寄存器(RSR)中,然后被复制到接收缓冲寄存器(RBR)中,RBR再将数据复制到DRR中,最后等候CPU或DMA控制器将数据读走。这种多级缓冲方式使得片内的数据搬移和外部数据的通信可以同时进行。

McBSP可以触发多种中断事件,中断事件可以中断CPU执行中断服务子程序:也可以产生同步事件告知DMA控制器,见表4-7。

点击看大图
2.数据的收发

如图4-23所示,McBSP的接收操作采用三级缓冲方式,发送操作采用两级缓冲方式。接收数据到达DR管脚后移位进入RSR,一旦整个数据单元(8位,12位,16位,20位,24位或32位)接收完毕,如果RBR寄存器末满,则RSR将数据复制到RBR中。如果DRR中旧的数据已经被CPU或DMA/EDMA控制器读走,则RBR将新的数据复制到DRR中。发送数据被CPU或DMA/EDMA控制器写到DXR。如果XSR寄存器没有数据,则DXR中的值被复制到XSR中:否则,DXR会等待XSR中旧数据完全发送完,才将数据复制到XSR中。

McBSP的复位有两种方式:

(1)一种是芯片复位,那么McBSP中发送、接收和采样时钟都同时被复位。

(2)另一种是通过设置串口控制寄存器SPCR中的相应位,单独使McBSP复位。设置/XRST使得发送复位。/RRST=0将分别使接收复位,/GRST=0将使采样速率发生器复位。

复位后,整个串口初始化为默认状态。所有计数器及状态标志均被复位,这包括接受状态标志RFULL、RRDY及RSYNCERR,发送状态标志/XEMPTFY、XRDY及XSYNCERR。器件复位和McBSP控制器复位对寄存器标志位和管脚将产生不同的影响。

RRDY和XRDY分别是McBSP接收和发送状态准备标志位。读山DRR数据和写入DXR数据都将分别对RRDY和XRDY状态位产生影响。读写串口数据有多种方式进行同步:

    ·轮询RRDY和XRDY状态位;

    ·DMA/EDMA控制器产生的同步事件(REVT和XEVT);

    ·CPU事件(RINT和XINT)产生的中断。

McBSP的控制信号,如时钟、帧同步和时钟源都是可以设置的。图4-24是McBSP时钟和帧同步信号的一个典型时序。时钟CLKR和CLKX对数据的接收/发送进行同步,而帧同步信号17SR和FSX则与一个数据单元传输同步。

点击看大图
McBSP允许对数据时钟以及帧同步信号设置参数,如下:

·FSR、FSX、CLKX、CLKR的极性

·选择单相帧或二相帧

·定义每相中数据单元的个数

·定义每相中,一个数据单元的位数

·是选择帧同步信号触发新的串行数据发送流,还是被忽略

·选择帧同步与第一个数据位之间的延迟时间,可以是0位,l位,2位延迟

·接收数据的左右调整,进行符号扩展或是填充0

对McBSP的收发部分可以各自独立地选择时钟以及帧同步配置。接收和发送的帧同步信号和时钟可以由内部或是外部产生,根据寄存器PCR、SRGR中相应位的设置而定。

     3.SPl协议下的接口

     McBSP中的传输时钟具有停止模式,与SPI协议的兼容。McBSP支持两种SPI传输格式,在SPCR寄存器的CLKSTP位中设置。表4-9列出了CLKSTP与CLKXP相配合,对串口时钟工作模式的控制。图4-25和图4-26分别给出了在两种SPI格式下,时钟传输接口的时序情况。

 


McBSP既可以作为SPI主设备又可以作为SPI从设备。作为SPI主设备时,由McBSP内部的采样率发生器产生时钟CLKX和从设备使能信号FSX.CLKX定义为输出口(CLKXM=1),FSX定义为输出口,与从设备的使能端(/SS)连接。SPI协议要求:McBSP在移位输出数据之前,FSX信号就必须有效,所以XCR寄存器中XDATDLY位必须设置为1。XDATDLY=0或2时将导致非法操作。

用户需要设置SRGR寄存器中的CLKSM位来选择采样率发生器的时钟源,以及利用CLKGDV位设置需要的SPI数据传输速率。在McBSP内部会产生一个连续的CLKX时钟,在完成传输后时钟禁止输出,从而实现传输接口所需要的时钟停止模式。因此在McBSP-端,对于发送和接收的内部操作而言,时钟信号实际上是连续的。选择时钟停止模式时,SRGR寄存器中的帧设置位(FPER和FWID)无意义。McBSP作为主设备时的接口框图如图4-27所示。


当McBSP作为SPI从设备时,由外部的主设备产生所需的时钟信号和从设备使能信号。串口按照时钟进行数据同步传输。输入的CLKX和FSX信号同时也分别作为McBSP内部接收端的CLKR信号和FSR信号。McBSP的FSX引脚信号同从设备SPI的使能信号SS要求一样,在进行数据传输之前,外部主设备必须先将FSX信号置为有效(低电平)。

图4-28是McBSP作为SPI从设备的接口框图。作为SPI从设备时,McBSP的CLKX管脚和FSX管脚配置为输入管脚(CLKXM=FSXM=0)。McBSP的RCR/XCR寄存器中的(R/X)DATDLY位必须置为0,以保证发送的第一个数据能够出现在DX管脚上,一旦检测到串行时钟CLKX有效,就可以立刻接收数据。


虽然CLKX信号是由外部主设备产牛,但是McBSP内部的采样率发生器仍必须被使能,并被设置为相应的SPI模式。内部采样时钟对输入的CLKX和FSX:信号进行同步化处理。寄存器SRGR中的CLKSM=I,指定内部采样时钟由内部CPU时钟产生。必须保证内部的CLKG信号频率至少是SPI数据传输率的8倍,比如,可以令CLKGDV=l,将采样率发生器设置为最大的速率。

设定McBSP工作在SPI模式下,需要按照以下步骤初始化寄存器:

(1)复位收发端口,将SPCR寄存器中/XRST和/RRST置为0;

(2)McBSP保持复位的状态下,设置有关的寄存器为需要的值,先设置CLKSTP=1xb;

(3)置SPCR寄存器中GRST=l,采样率发生器退出复位态,开始工作:

(4)等待两个时钟周期,以确保McBSP重新初始化;

(5)根据由CPU还是由DMA来访问McBSP,分别进行下面的设置:

·如果是由CPU进行访问,置/XRST=/RRST=1,使能串口,注意SPCR寄存器中其他    的设置值不变。

·如果是由DMA进行访问,先对DMA进行初始化,启动DMA,使之等候同步事件,    然后再将/XRST=/RRST=1,使串口退出复位态。

(6)两个数据时钟周期后,发送端和接收端进入有效状态。

4.通用I/O口

在两种情况下,串口的管脚(CLKX,FSX,DX,CLKR,FSR,DR以及CLKS)可以作为通用IO口使用:

·接收或发送处于复位状态,SPCR寄存器中(R/X) RST="0"。

·串口使能为通用I/O状态,PCR寄存器中(R/X)IOEN=1。

在表4-10中详细描述了这些管脚作为通用IO口的用法,其中有几个引脚只能定义为单向IO口,这一点一定要注意。 


4.3 BIOS中McBSP设置实例

在TMS320C6x系列器件里都集成了McBSP外设。不同类型的DSP芯片集成的McBSP外设个数不一样。BIOS为McBSP提供了对应的API模块。

    1.BlOS中McBSP控制器API函数

同样McBSP模块基于句枘模式,完成对DSP器件McBSP外设的控制,进行串行收发数据操作。API模块包括结构定义、函数和宏。

McBSP只有一个结构,定义如下:

 


McBSP配置管理器创建配置对象,通过设置属性页的内容可以设置McBSP的工作方式。属性页的设置界面如图4-30所示,属性页主要包括以下几个部分:

·发送模式:中断方式、帧同步方式和时钟控制;

·发送帧和数据单元格式:相位、数据单元个数;

·接收模式:中断模式、帧同步、时钟摔制;

·接收帧和数据单元格式:相位、数据单元个数;

·采样频率发生器:采样频率发生器;

·多通道操作:数据单元和块分割:

·通用IO口:使能GPIO功能;

McBSP资源管理器中显示器件内部集成的McBSP外设个数,并对每个外设定义一个初始化的句柄名。C6202和C6203芯片支持第3个外设MCBSP_Prot2,端口和句柄对应方式如下:

  ·McBSP_Prot0:句柄名hMcbspO;

  ·McBSP_Protl:  句柄名 hMcbspl:

  ·McBSP_Prot2:  句柄名hMcbsp2;

通过属性页可以使能打开串口操作和用配置对象初始化串口。属性页如图4-31所示:


通过CSL GUI设置好McBSP端口后,将会分别在头文件和源文件中生成相应代码,详细可以参照附带光盘里的例子。

在csl_mcbsp.h头文件中有如下代代码:


 

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(909) | 回复(0)

发表于 2008/5/24 17:31:35

0

关于投票

软件无线电接收机设计实例(转帖)

 http://blog.eccn.com/u/107250/archives/2007/405.htm

软件无线电接收机设计实例

本章重点通过实例介绍TI TMS320C6713 DSP在软件无线电接收机设计中的应用。其中,首先简要阐明了软件无线电的概念、特点、核心思想及其关键技术;然后介绍软件无线电的结构;第三节设计了基于高速A/D AD6640、数字下变频器AD6620、DSP TMS320C6713的软件无线电接收机硬件结构;最后介绍软件无线电接收机中的DSP的软件程序编写、软件无线电接收机调试方法及实验结果分析。

1软件无线电概述

软件无线电是一种以现代通信理论为基础,以数字信号处理为核心,以微电子技术为支撑的无线通信体系结构。移动通信的最终目标是实现任何人可以在任何地点、任何时间与其他任何人进行任何方式的通信,软件无线电就是实现这一日标的关键技术,并且代表着未来移动通信的发展方向。软件无线电就是将模块化、标准化的硬件单元以总线方式连接构成通用的硬件平台,并通过软件加载实现各种无线电通信功能的一种开放式体系结构。软件无线电的天键思想是将A/D、D/A尽可能靠近天线和用软件来完成尽可能多的无线电功能。

 将软件无线电技术应用于移动通信领域,设想不需要为每一种新的通信体制重新建网、更换设备,只需在各个基站中建立统一的硬件平台,然后不论是现有的各种通信体制和标准,还是将来出现的新的通信体制和标准,都以软件升级的方式更新换代。需要更新的软件可以通过统一的软件提供商来供给,软件都可以以无线电波的形式从空中下载。使用这样一种理想的软件无线电概念后,所有通信体制和标准的更新,以及不同通信体制之『日J的兼容,都可以通过更换适当的软件来完成,这样既节省了重新建设移动通信网络的费用,又缩短了研究到应用的周期。

     软件无线电的主要特点可以归纳如下:

     (1)灵活性。软件无线电可以通过增加软件模块,很容易增加新的功能。可以和其他任何电台进行通信,并可以作为其他电台的射频中继,还可以通过无线加载来改变软件模块或更新软件。

     (2)开放性。软件无线电采用了标准化、模块化的结构,其硬件可以随着器件和技术的发展而发展或扩展,软件也可以随需要而不断升级。软件无线电不仅能和新的体制电台通信,还能与旧的体制电台兼容。

软件无线电已经成为第二代移动通信系统的关键技术。软件无线电技术可以解决多种通信标准及频谱拥挤的问题,以达到多种通信频段、多种信道调制及多种数据格式的互操作性。第三代移动通信系统具有多模、多频段、多用户的特点,面对多种移动通信标准,采用软件无线电技术对于在未来移动通信网络上实现多模、多频率、不问断业务能力方面将发挥重大作用,如基站可以承载不同的软件来适应不同的标准,而不用对硬件平台改动;基站间可以由软件算法协调,动态地分配信道与容量,网络负荷可自适应;移动台可以自动检测接入的信号,以接入不同的网络且能适应不同的接收时间要求。

软件无线电是近年来发展起来的新技术,虽然对它的研究理论上趋于成熟,但是具体实现环节上许多技术问题还需要解决。其中的关键技术概括:

(1)开放式总线结构及实现。软件无线电的一个重要特点是其开放性,这主要体现在软件无线电所采用的开放式标准化总线结构上,只有采用先进的标准化总线,软件无线电才能发挥其适应性广、升级换代方便等特点。由于软件无线电的研制国内外部起步不久,在研制开发过程中,必须逐步形成标准化的硬件平台和软件平台,而标准化总线是构筑上述两个平台的奠基石,现有的软件无线电研究和实验系统中一般采用双总线结构,即:控制总线和高速数据总线。控制总线结构如VME总线、PCI总线等,尽可能采用现有的工业标准,以便于利用已有的软件及硬件平台,加快开发速度。高速数据总线结构则是软件无线电体系结构的软件,目前还没有形成标准,世界各国都在努力研究,以期得到适合软件无线电高速数据处理的总线结构标准。

(2)智能天线技术。天线部分是软件无线电不可替代的硬件出入口,只能靠硬件本身来完成,不能用软件加载来实现其全部功能。但是软件无线电由于其具有智能的、可编程的数字信号处理核心,所以可以充分利用这一优势,对固定天线接收下来的信号进行优化组合,达到提高信噪比、抑制同信道干扰、增大系统容量的目的。固定天线与数字信号处理核心的结合,构成了可以动态配置的天线特性,即智能天线。软件无线电这部分的要求包括:无线能覆盖所有的工作频段;能用程序加载的方法对功能及参数进行设置。

(3)高速A/D技术。软件无线电对A/D要求是非常高的。对它们的要求主要包括采样速率和采样精度。采样速率主要由信号带宽决定,因为软件无线电系统的接收信号带宽较宽,而采样速率一般要求大于信号带宽的2.5倍,因此采样率较高;采样精度要求在80dB的动态范围内不能低于12位。除了进一步提高器件性能外,还可采取多个ADC并联使用的方法。

(4)数字下变频技术。数字下变频(DDC,Digital Down Converter)是A/D后首先要完成的处理工作,包括数字下变频、滤波和二次采样,是系统中的数字处理运算量最大的部分,也是最难完成的部分。

(5)高速数字信号处理技术。高速数字信号处理部分主要完成基带处理、调制解调、比特流处理和编译码等工作。这部分工作用高速数字信号处理器(DSP)完成,这是软件无线电的一个核心部件,但也是一个主要瓶颈。单路数字语音编译码,调制解调能用单个DSP实现。当单个DSP处理能力不足时,可采用多个DSP芯片并行处理提高运算能力。

(6)信令处珲技术。在现代的移动通信系统中,信令部分已经是用软件完成的,软件无线电的任务是将通信协议及软件标准化、通用化和模块化。无线接入是无线通信的重要内容,其协议的主体是公共空间接口,目前已经形成许多不同的标准。因此,当用软件无线电实现多模互联时,使用通用信令处理是必要的。这就需要把现有的各种无线信令按软件无线电的要求划分成几个标准的层次,开发出标准的信令模块,研究通用的信令框架。

2软件无线电结构

软件无线电的基本思想是以一个通用、标准、模块化的硬件平台为依托,通过加载软件来实现各种无线电功能,从基于硬件、面向用途的电台设计方法中解放出来。功能的软件化势必要求减少功能单一、灵活性差的硬件电路,尤其减少模拟环节,把数字处理(A/D、D/A)尽可能靠近大线。

软件无线电主要由三部分组成,即射频处理(含天线)前端;高速A/D、DIA;数字信号处理(DSP)。

2.1  理想的软件无线电结构

     软件无线电的核心思想是将A/D、D/A尽可能地靠近天线,尽早地将天线接收下来的模拟信号数字化,DSP对A/D转换后的数字信号进行同步提取(载波恢复、时钟恢复和帧同步)、信号调制样式的自动识别、信道解码、信源解码、信号特征提取(解调)。理想的软件无线电结构如图5-l所示,其中接收机部分是对天线接收到的射频信号直接进行全宽带A/D转换,转换后的高速数据流送DSP处理,最后由窄带D/A转换为语音、数据或者图像输出。然而,这样不但目前A/D器件采样率、输入带宽无法满足所述软件无线电结构要求,而且后续的DSP也无法实时处理大量的高速数据流,所以这是一种理想的软件无线电结构。


2.2  实际可行的软件无线电接收机结构

由于A/D器件的限制和DSP的瓶颈,目前设计软件无线电接收机的折衷方案是:一方面把射频信号通过混频搬移到中频再带通采样,使得A/D采样率、输入带宽满足系统要求;另一方面是在DSP前加数字下变频器。

软件无线电接收机在中频接收下来的是系统的整个频段,而对于一个通信用户而言只占用一个很窄的信道,如TACS系统中,系统频段为15MHz,而信道只占25kHz。同样,GSM系统中整个系统频带为25MHz,而信道带宽为200kHz,其系统频段与信道带宽关系如图5-2所示。所以,对中频宽带信号A/D采样后可以实行信道分离,这样就只需处理某一信道数据了。另外,中频数字化后产生的大量数据流如果直接送DSP处理,将给DSP带来巨大的运算压力。如中频为50MHz,A/D Nyquist采样速率为100MHz,而DSP每处理一个采样信号,大约需要100次运算,那么总共需要的运算速率为100×100=104MOPS(Million OperationsPer Second)。这样高的运算速率,目前DSP芯片还难以达到。数字下变频器(Digital DownConverter)正是一种解决以上问题的可编程器件,它一方面从包含所有信道的宽带信号中分别提取需要的窄带信号;另一方面,对分离出的窄带信号再进行信号抽取、滤波,降低频率,便于后续的DSP处理。


目前实际可行的软件无线电接收机结构如图5-3所示。天线接收下来的射频信号先经过混频器混频到中频,再通过带通滤波器后由宽带高速A/D带通采样,采样后的高速数据流由数字下变频器信道选择、频率抽取后送由DSP实时处理。


3软件无线电接收机硬件设计

软件无线电接收机主要包括高速A/D部分设计,数字下变频部分设计和基带数字信号处理部分设计。本节针对以上3个部分分别介绍高速ADC AD6640,数字下变频器AD6620,高速DSP TMS320C6713的工作原理及其在中频软件无线电接收机子系统中的应用。

3.1高速A/D部分设计

软件无线屯的核心思想之一就是要将ADC、DAC尽可能地靠近天线。这就给ADC的采样率、采样精度、动态范围等特征提出了很高的要求。ADC的特性指标包括采样率、采样精度、信噪比(SNR,SignalNoise Rate)、无寄生动态范围(SFDR,Spurious-Free Dynamic Range)、模拟输入带宽及功耗等。对高速应用来说,ADC动态特性是非常重要的,而SNR和SDDR是能够比较准确地衡量ADC动态特性的重要参数。

AD6640就是这样一款高性能的高速ADC芯片。AD6640采样率可达65MHz;12位精度;有着80dB无寄生动态范围;全功率模拟输入带宽为70MHz;3.3V或5V CMOS兼容输出;二进制补码格式输出。典型应用包括Cellular/PCS基站;多通道多模式接收机;GPS抗干扰接收机;通信接收机;相控阵接收机等。

AD6640功能方框图如图5-4所示。AD6640采用的是两级子区式转换结构,这种设计既保证了所需的转换精度和转换速度,又降低了功耗,同时也减小了模片尺寸。从图5-4中可以看出,AD6640的模拟信号输入方式为差分结构,模拟信号首先经过缓冲,然后进入第一个采样保持器(THl)。当采样时钟为高时,THl进入保持状态。THl的保持值作为粗6位ADC(ADCl)的输入,其输出用于驱动一个6位D/A转换器(DACl)。如将延迟的模拟信号与DACl的输出相减,则可在保持器TH3的输入端产生剩余信号。保持器TH2的作用是为ADCl数字延迟后的一个模拟信道延迟进行补偿。将ADCl和ADC2相加,并将修正后的结果传至数字误差校正单元,便可以输出最终的12位模数转换结果。


3.2数字下变频部分设计

中频宽带信号经过AD6640带通采样后,接下来面临的问题是对极大量数据流的处理。由于DSP的处理瓶颈,软件无线电接收机中引入数字下变频器,一方面足将包含所有信道的宽带信号进行分离出某一用户窄带信道;另一方面对分离出的某一用户信道信号抽取、滤波,降低数据速率后南DSP实时处理。

Analog Device公司推出的AD6620就是一款能很好地完成以上任务的数字下变频器。AD6620采用了信号多级抽取理论,数字混频正交变换理论,使用了级联积分梳状滤波,是一款高性能的可编程数字下变频器。AD6620将中频数字信号搬移到基带,实现数字下变频、抽取、低通滤波等功能。单通道实数输入信号最高频率达67msps:单通道复数输入信号或分集信道实数输入信号最高频率达33.5msps。AD6620典型应用包括软件无线电接收机、基站收发信机(AMPS、TDMA、GSM和CDMA等)。

AD6620功能方框图如图5-5所示。AD6620是一个数字信号接收处理芯片,内部由4个串取处理单元组成,分别是:频率变换单元、二级固定系数积分梳状滤波抽取滤波器(CIC2)、五级固定系数积分梳妆滤波抽取滤波器(CIC5)和一个系数可编程的RAM系数滤波器(RCF)单元。其中,频率变换器的作用是实现数字下变频,将巾频信号搬移到基带;抽取滤波器的作用是降低数据率,获得能够为DSP处理的较低速率数据流;RAlVl系数滤波器设计的目的是尽可能使低通目标信号通过,并抑制带外干扰信号。


AD6620输入的数据可以是实数和复数。如果输入的是实数,AD6620可以工作在单通道或分集信道模式。分集信道模式(Diversity Channel Real),典型的应用在分集接收机(DiversityReceiver)。频率转换单元由一个32位的复数数控振荡器实现,输入这郜分的实数分为同相(I)和正相(Q)信号。复数数控振荡器实现信号由中频到基带的搬移。频率转换单元之后是二级固定系数,积分梳妆滤波器(CIC2),抽取率是2~16,这部分数据的输入速率等于输入数据率?samp,CIC2的输出数据率?samp2由CIC2的抽取率MCIC2决定,即?samp2=?samp//MCIC2。CIC2之后是五级固定系数,积分滤波器(CIC5),抽取率是1~32。CIC5的输出数据率?samp5,由CIC2的抽取率MCIC2和CIC5的抽取率Mcic5决定,即?samp5=?sap/(MCIC2×MCIC5)。滤波器CIC2和CIC5的响应由抽取率定义,目的是降低数据速率,使得后续的RAM系数滤波器(RCF)每次输出能运算更多的阶数。RCF滤波器是20位系数。抽取率可编程的积和(sum-of-product)滤波器,抽取率是1~32,最大能处埋256阶。AD6620的整个滤波器响应部分包括以上3个级联的抽取滤波器CIC2、CIC5、RCF。每个连续的滤波器都能使带宽变窄。在第一部分更多地抽取将减少整个抽取阶段耗费的资源。数据最后通过并行口或者串行口输出。

3.3  DSP部分设计

高速数字信号处理部分是软件无线电的核心,它要完成全部基带处理功能,如信号检测、同步获取、解调等基本功能,还要完成加密、纠错、均衡、信号环境评估、信道接入控制、网络管理等功能。软件无线电接收机中选用TI公司推出的目前最先进的浮点DSPTMS320C6713。

    TMS320C6713内有8个并行的处理单元,分为相同的两组。其体系结构采用超K指令字(VLIW,VelociTM Advanced Very Long Instruction Word)结构,甲指令长 32位,8个指令组成一个指令包,总共字长为8×32=256位。芯片内部设置了专门的指令分配模块,可以将每个256位的指令包同时分配到8个处理单元,并由8个单元同时运行。芯片的最高时钟
频率达225MHz,这是通过片内锁相环路(PLL)将输入时钟倍频后获得的。当芯片内部8个处理单元同时运行时,其最大处理能力可以达到1800MIPS。

TMS320C6713功能及CPU方框图如图5-6所示。TMS320C6713的8个独立的功能单元中有两个乘法器(32位结果)和6个算术逻辑单元(32位/40位)。它采用加载/存储(load/store)体系结构,数据在多处理器之间传输依靠32位通用寄存器。


TMS320C6713的指令集可以进行字节寻址,获得8位/16位/32位数据,因此存储器可以得到充分的利用。指令集中有位操作指令,包括位域抽取、设置、清除,以及位计数、归一化等。所有的指令都是条件执行指令,可以根据某种条件决定是否执行。

TMS320C6713的存储器寻址空间为32位,其中芯片内部集成了1~7Mb片内SRAM。片内RAM分为两块:一是内部程序/Cache存储器,采用了LlP/L2两级缓冲结构;二是内部数据/Cache存储器,分为两路,也采用了LID/L2两级缓冲结构。32位外部存储器接口包括直接同步存储器接口,可以和同步动态存储器(SDRAM)、同步突发式静态存储器(SBSRAM)连接,主要用于大容量高速存储:还包括直接异步存储器接口,可与静态存取器(SRAM)、只读存取器(EPROM)连接,主要用于小容量数据存储和程序存储:还有直接外部控制接口,可与先进先出寄存器(FIFO)连接,这是控制接口线最少的方式。因此TMS320C6713可以配置不同速度、不同容量、不同复杂程度的存储器。

  TMS320C6713还包含丰富的片上外设,包括:16通道增强型直接存储器存取协处理器,用于控制数据的EDMA传输;16位主机端口接口,可以将TMS320C6713配置为宿主机的DSP加速器;两个多通道音频串行口,便于音频信号的输入输出处理;两个多通道串行缓冲口,便十DSP和外设串行通信;两个32位通用定时器;16引脚的通用I/O口(可设置外部中断源);两个I2C总线;灵活的锁相环路时钟发生器(×4、×5、…、×25;/1、/2、…、/32),可以对输入时钟进行不同的倍频和分频。此外,芯片内部还有基于IEEE-1149.1标准的边际扫描接口(JTAG),可用于芯片的自检和开发。

3.4软件无线电接收机系统设计

根据4.2.2节介绍的实际可行的软件无线电接收机结构,设计基于高速A/D-AD6640、数字下变频器AD6620、高速浮点DSP TMS320C6713的单通道软件无线电接收机,其结构框图如图5-7所示,其原理图如图5-8所示。


 中频软件无线电接收机中高速ADC AD6640对中频宽带信号采样量化。数字下变频器并行接收AD6640并行输出的高速数据流,对其进行正交基带变换,即下变频、多级抽取、滤波。高速浮点DSP TMS320C6713通过多通道缓冲串行口(McBSP)同步串行接收基带正交
信号I、Q,并对接收的信号进行正交解调处理。

软件无线电接收机中,AD6620接收AD6640并行输出的12位高速数据信号,并通过使用相同的外部时钟同步。DSP和AD6620按串行通信(PAR/SER=0)的方式连接,AD6620工作地主模式(SBM=1),向TMS320C6713的多通道缓冲串行口McBSPl发送时钟同步信号(SCLK→CLKRl),帧同步信号(SDFS→FSRl),McBSPl同步接收AD6620发送的数据(SDO→DRl)。另外,软件无线电接收机中AD6620内部参数由PC通过IEEE→1284标准并行端口设置。

4软件无线电接收机软件设计

软件无线电的核心思想之一就是用软件实现尽可能多的无线电硬件功能。本节重点介绍软件无线电接收机中 TMS320C6713 DSP和数字下变频器AD6620之间的接口程序设计和信号解调算法的DSP程序实现,DSP/BIOS实时操作系统嵌入数据传输和数据处理线程,构建DSP应用的程序结构。此外,本节还介绍了软件无线电接收机中的高效数字滤波及其基于可编程器件AD6620的实现。

4.1 TMS320C6713 McBSP和AD6620接口程序设计

实时信号传输与处理系统要求系统在有限的时间内同时完成大量的数据传输和信号的算法处理,选取合理有效的算法固然至关重要,同时选择有效的数据传输方法也不容忽视。在实际工作中发现,数据传输所花费的时间往往超过数据处理的时间,成为实时信号处理系统的瓶颈。   

软件无线电接收机中,基于McBSP和EDMA实现的DSP和外设之间的串行通信,传输效率高。采用PING-PONG缓冲,传输更稳定。奉节所论述的信号传输和处理方法通用性强,可广泛应用于其他数据传输和信号处理领域,如实时语音信号处理系统、实时图像处理系统、多路信号实时采集监控系统。

    1.McBSP设置

TMS320C6713提供了2个高速多通道缓存串行口(McBSP)。McBSP提供了双级缓存的发送寄存器和三级缓存的接收寄存器,具有仝双工的同步或异步通信功能,允许连续的数据流传输;数据发送和接收有独立可编程的帧同步信号;能够与工业标准的解码器、模拟接口芯片或其他串行A/D与D/A设备、SPI设备等直接相接;支持外部时钟输入或内部可编程时钟;每个串行口最多可支持128通道的发送和接收;串行字长度可选,包括8、12、16、20、24和32位:支持μ律和A律数据压缩扩展。

McBSP方框图如图5-9所示。McBSP通过7个引脚(DX、DR、cLKX、CLKR、FSX、FSR和CLKS)与外设接口。DX和DR引脚完成与外部设备进行通信时数据的发送和接收,由CLKX、CLKR、FSX、FSR实现时钟和帧同步的控制,由CLKS来提供系统时钟。发送数据时,CPU或EDMA控制器将要发送的数据写到数据发送寄存器(DXR,Data transmitregister),在FSX和CLKX作用下,由DX引脚输出。接收数据时,来自DR引脚的数据在FSR和CLKR作用下,从数据接收寄存器(DRR,Data receive register)中读出数据。接收和发送帧同步脉冲既可以由内部采样速率产生器产生,又可以由外部脉冲源驱动,McBSP分别在相应时钟的上升沿和下降沿进行数据检测。

 


串行口的操作由串行口控制寄存器(SPCR,Serial Port Control Register)、引脚控制寄存器(PCR,Pin Control Register)、采样率产生寄存器(SRGR,Sample Rate Gener-atoR register)、发送控制寄存器(XCR)和接收控制寄存器(RCR)来控制。接收控制寄存器RCR和发送控制寄存器XCR分别设置接收和发送的数据各种参数,如接收数据相数、帧长度等。

McBSP可以硬件中断CPU来处理串口接收的数据(RINT)或向串口发送数据(XINT),也可以通过发送同步事件给EDMA,让EDMA来处理串口接收的数据(REVT)或向串口发送数据(XEVT)。

软件无线电接收机子系统中,DSP和AD6620按串行通信(PAR/SER=0)的方式连接,AD6620工作于主模式(SBM=I),TMS320C6713工作在从模式。AD6620向McBSPl发送时钟同步接收信号(SCLK→CLKR),帧同步信号(SDFS→FSR)。McBSPl同步接收AD6620发送的数据(SDO→DR)。

在软件无线电接收机中,按照mcbspCfgl数据结构配置McBSPI各控制寄存器。mcbspCfgl结构定义如下:

 

点击看大图

2.EDMA设置

    TMS320C6713提供了16通道独立的自加载EDMA协处理器,用于控制数据的EDMA传输。EDMA控制器可以在不占用CPU资源情况下完成映射存储空间中的数据搬移。每个
EDMA通道通过主控寄存器、副控寄存器、传输计数寄存器、源地址寄存器、目标地址寄存器、全局地址寄存器组、全局索引寄存器组设定工作方式。

EDMA控制器结构如图5-10所示,包括事件和中断处理寄存器(Event and interruptprocessing registers)、事件编码器(Event encoder)、参数随机存储器(Parameter RAM)和地址产生硬件(Address generation hardware)。EDMA事件由事件寄存器捕获,一个事件就是触发一个EDMA通道开始传输的同步信号。如果有多个事件同时发生,可以通过事件编码器来协调解决。对应事件的传输参数存储在EDMA参数随机寄存器(Parameter RAM)中,传递给地址产生硬件。地址产牛硬件产生EMIF和(或)外设的地址,执行必要的读写传输操作。

 



中频软件无线电接收机子系统中利用EDMA结合McBSPl实现数据的串行接收。EDMAl将McBSPI DRR内数据转存内部高速存储区(Ping缓冲区和Pong缓冲区),供DSP解调,其同步事件是McBSPl接收事件(REVTl)。EDMA结合McBSP的数据传输,把DSP从频繁的处理串口数据任务中解放出来,使DSP可以主要用来执行系统核心数字信号处理算法,提高了系统运行效率,增强了系统实时性。

在软件无线电接收机中,按照gEdmaConfigRcv数据结构配置EDMA各控制寄存器。gEdmaConfigRcv结构定义如下:

 


3.PING-PONG缓冲

PING-PONG缓冲是一种同时利用两个数据缓冲区的数据传输技术。使用PING-PONG缓冲是因为在传输和处理数据过程中单个缓冲区数据很容易被覆盖。PING-PONG缓冲方式的连续执行,总是保持一个缓冲区激活用于数据传输,而另一个缓冲区保持静态稳定地由DSP处理数据。软件无线电接收机中PING-PONG缓冲方式数据传输过程如图5-11所示。


4.2软件无线电接收机中解调算法及其DSP程序设计

软件无线电具有灵活性、可扩展性等主要特点,这主要是因为软件无线电的所有功能都是用软件来实现(定义)的,通过软件的增加、修改或升级就可以实现新的功能。可以说,功能的软件化是软件无线电的最大优势之一。在所有的软件中,数字信号处理软件占据着重要的地位,例如编码、调制、解调、解码、同步提取、频谱分析等都可以采用信号处理算法来实现。本节着重以DSP解调算法为例,介绍软件无线电接收机中信号处理算法的DSP实现。

    1.软件无线电解调算法通用模型

软件无线电的几乎所有功能都将用软件来实现,解调也不例外。软件无线电的解调一般采用相干解调的方法。数字相干解调的方法从原理上讲和模拟相干解调是一样的。常见于模拟解调电路的相干解调法(指用一个同相同频的本地载波去相干解调),当同频同相不满足时,解调输出会严重失真。例如,在移动通信中,接收的信号受到严重衰落时,提取出来的载波质量往往达不到要求,特别是在多普勒效应等引起的偏频环境下更是如此。由于正交解调法在一定程度上能克服以上弱点,因此,软件无线电中的解调一般采用数字正交解调法。正交调制法产生的调制都能用正交解调法解调,而且一般调制都能用正交调制法进行,也就是说,正交解调法从理论上说可以对几乎所有的调制样式进行解调。

图5-12所示的数字正交变换通用模型显示了ADC采样后的数字序列S(n)和两个正交的本振序列cos(ωcn)和sin(ωc,n)相乘,再通过低通滤波器来实现正交解调过程。


尽管调制样式多种多样,但实质上调制不外乎用调制信号去控制载波的某一个(或几个)参数,使这个参数按照调制信号的规律变化的过程。载波可以是正弦波或脉冲序列,以正弦波为载波的调制叫做连续波调制。这里只讨论连续波调制信号的解调。

对于连续波调制,已调信号的表达式为:


调制信号可以分别“寄生”在已调信号的振幅A(n)、频率ω(n)和相位θ(n)中,相应的调制就是调幅、调频、调相这三类熟知的调制方式。由于频率和相位有着一定的关系,为了便于分析,可以将式(5-1)改写为

 

这就是我们所希望得到的同相和正交两个分量,根据XI(n)XQ(n),就可以对各种调制样式进行解调,三大解调算法如下:
 


 上式就是利用xI(n)、xQ(n)直接计算?n)的近似公式。这种算法只用乘减运算,计算比较简便。

2.AM信号软件无线电解调算法

式中,A(n)=Ao(n);Ao>Ⅰm(n)Ⅰ:m(n)为调制信号,φ o为载波的初始相位。
  对信号进行正交分解,得同相分量和正交分量:

 


减去直流分量Ao就解得调制信号m(n)。这种方法具有较强的抗载频适配能力,即本地载波与信号载波之间允许一定的频率偏差。由于传输信道或其他一些原因(例如,对未知信号载波频率信号进行接收解调时,载频估计不准)而造成本地载波与信号载波之间存在频差和相差时,同相分量和正交分量进行表示为:

所以,AM信号用正交解调法解调时,不需要载频严格的同频同相。从以上分析过程中可知,理论上失配可以任意大,但由于失配时,同相和正交分量相当于调制在以失配频率为载频的载波上,失配严重时,信号会超出数字信道而发生失真。当然,这种现象一般不会发生,因为,即使是对未知载波频率的信号进行接收解调时,频率估计频差不会超过50Hz。

3.AM正交解调算法程序设计

EDMA将McBSP串行接收地经过AD6620正交基带变换后的I、Q两路正交信号交叉存取在PING或PONG缓冲区内,如图5-11所示。这时即可根据前面介绍的AM解调算法,处理I、Q信号实现.AM解调。

根据式(4-14),则凋制信号A(n)为:


式中,xI(n)为同相分量,XQ(n)正交分量,都是16位无符号数,交叉存取在接收缓冲区(gBufferPingR或gBufferPongR)中。解调算法程序就是对同相分量和正向分量序列做平方和、开方运算处理,输出调制信号A(n)保存在缓存区gBufferPing或gBufferPong中,由CCS软件实时分析。AM解调算法程序流程如图5-13所示。

 


另外,为了提高代码执行效率,主程序调用了TI公司所提供的高速浮点DSP数学运算函数库中的数学函数来做程序中必要的乘方、开方等数学运算。该函数库中的数学函数都是根据DSP硬件处理单元结构优化编译过的汇编函数,执行效率非常高。

AM解调算法TMS3206713 DSP程序实现代码如下:

 

4.3 DSP/BlOS构建软件无线电接收机信号传输和处理软件流程
DSP/BIOS是一个功能丰富、可扩展的内核服务集,开发人员可以用来管理系统级的资源和构建DSP应用的基础结构。DSP/BIOS所提供的内核服务在代码大小和性能上进行了专门优化,可以应用于T=MS320C5000和TMS320C6000系列的DSP。通过使用DSP/BIOS,DSP开发者可以:
(1)使用多线程技术高效地管理DSP MIPS;
(2)使用标准接口的I/O和中断;
(3)高效地定义和配置系统资源,如系统内存;
(4)通过实时分析工具对用户应用程序的运行状况实时查看;
(5)向用户的目标应用程序添加数据结构并围绕一组相关线程来加以组织;
(6)向新的TMS320 DSP移植更加容易。
    1.DSP/BIOS简介
DSP/BIOS是一个用户可剪裁的实时操作系统,由Texas Instruments Code composerStudio 2.0集成。DSP/BIOS展开如图5-14所示,主要有3部分组成:多线程实时内核(Scheduling)、实时分析工具(1nstrumentation)和芯片支持库(CSL,Chip Support Library),另外还包括系统设置(Sysmm)、同步信号(Synchronization)、输入/输出(Input/Output)。操作系统维护调度多线程的运行,只需将定制的数字信号算法作为一个线程嵌入到系统即可芯片支持库设置管理外设资源,复杂的外设寄存器初始化可以直接利片j图形工具配置。实时分析工具可以帮助分析算法实时运行情况。DSP/BIOS把由配置工具创建对象的静态和全局特性与程序中创建对象的动态和局部特性结合在一起,给开发人员提供了一种充分优化目标应用程序性能和资源利用的基础框架。

 


2.软件无线电接收机信号传输和处理流程

中频软件无线电接收机子系统中,DSP/BlOS配置系统资源,嵌入定制的数字信号解调算法线程,使开发更具条理、简捷。DSP/BIOS首先设置系统,包括选用DSP型号、设定DSP工作模式、调用芯片支持库的类型、配置程序和地址空间等。其次,在Scheduling(多线程调度)模块中定义硬件中断HWI_INT8,其中断源为EDMA控制器,中断函数是edmattwi()。最后,在Scheduling模块中定义软件中断processBufferSwi,该中断线程由硬件中断HWI_INT8的中断函数edmaHwi()启动,其中断函数是processBuffer()。函数processBuffer()处理缓冲区中的数据,可以是各种数字信号处理算法。


DSP/BIOS操作系统根据软件无线电接收机子系统应用程序的需要剪裁完毕,形成配置文件。然后在此基础上将自定义的解凋算法与控制程序作为线程插入任务循环,编译载入DSP。系统开始运行后,DSP首先在main()函数中初始化McBSPl、EDMA,开中断,然后从main()函数跳入空闲状态(IDL),等待中断。信号传输与处理主流程图如图5-15所示。中频软件无线电接收机中,AD6620向McBSPl发送数据,McBSPl同步接收。McBSPl发送接收同步事件(REVT)给EDMA,EDMA将McBSPl DRR中数据搬移到接收缓冲区gBufferPingR或gBufferPongR),当接收缓冲区满时,EDMA硬件中断DSP(HWI_INT8),HWI_INT8中断服务程序edmaHwi()再调片j嵌入在软件中断processBufferSwi中的信号解调算法线稗processBuffer(),处理缓冲区数据。同时EDMA自动启动另一个缓冲区接收数据。DSP解调后数据保存在缓存区gBufferPingX或gBufferPongX。信号传输与处理中断流程图如图5-16所示。


4.4软件无线电接收机中的高效数字滤波及其实现

软件无线电接收机接收下来的是天线的整个宽带频段,向实际的一个无线通信信号带宽一般为几十kHz到几百kHz。这样,对单通道信号采样时所需要的采样率是不高的,所以对某个通道的窄带信号的采样率降低的处理(或者叫二次采样)是完全可能的。使采样率降低的变换成为抽取,或者叫采样率压缩。当信号的采样数据量太大时,为了减少数据量以便于处理和计算,对数据每隔(D-1)(这里D为正整数)个取一个,这样的抽取称为整数倍抽取,D称为抽取因子。然而,抽取也不是无限量的,抽取后的采样率必须满足采样定理。所以,对时域离散信号降低速率之前,必须采取必要的滤波措施,保证抽取后的频谱没有混叠,原始信号可以无失真的恢复。

    1.软件无线电接收机中的高效数字滤波

信号抽取的关键问题是如何实现抽取前的数字滤波,对于基带抽取,采用低通滤波器,对于带通信号的“整带”抽取,采用带通滤波器。滤波器的性能好坏,直接影响抽取率变换效果及实时处理能力。另外,当信号抽取率很大时,这就要求数字滤波器的带宽非常窄,过渡带要求非常陡,而设计这样的滤波器几乎是不可能的。因此,当抽取因子很大时,往往采用多级抽取,多级抽取要比单级抽取所需的计算量少得多。

抽取率为2的抽取称为二倍抽取。采用二倍抽取的优点是可以使用半带滤波器。半带滤波器的特点是其冲击响应有近一半的系数为0,可以成倍地降低运算量。因此,如果抽取率为2的整数次幂时(2k),实现起来非常方便,使用K个二倍抽取滤波就可以了。

以上讨论了当抽取因子D为2的幂次方时,采用半带滤波器进行抽取的方法可以说只是一种特殊情况,在实际的抽取中抽取因子D往往不恰好是2m倍,而表现为整数与2m倍相乘的形式,例如:D=48=3×24。这是可以先进行D=3的整数倍抽取的,然后用半带滤波器进行24抽取,而第一级的整数倍抽取就可以用积分梳状滤波器(Integrator Comb)来实现。积分梳状滤波器的特点是无需一般FIR滤波器所需要的乘法运算,这无论是对提高实时性,简化硬什都有重要意义,所以积分梳状滤波器在信号抽取中具有特别重要的位置。另外,和多级二倍抽取一样,当抽取率很大时,可以使用多个级联的积分梳妆滤波器(CIC,CascadedIntegrator Comb)实现信号多级抽取。

2.软件无线电接收机中的高效数字滤波实现

软件无线电接收机中的半带滤波器或者是积分梳妆滤波器显然可以由DSP软件编程实现,但是这样同时会给DSP带来巨大的运算负担,影响系统的实时性,有时甚至无法实现。木文设计的软件无线电接收机中,采用可编程器件AD6620,实现信号的多级抽取。AD6620功能方框图,采用了2阶CIC滤波器、5阶CIC滤波器、低通滤波器FIR的级联结构,实现信号的多级抽取。

AD6620配套了滤波器设计软件Fltdsgn.exe和控制软件AD6620.exe。Fltdsgn.exe帮助用户优化设计数字滤波器,简化抽取滤波器的设计过程。控制软件AD6620.exe通过并行口控制AD6620工作方式并将抽取率和Fltdsgn.exe设计好的滤波器系数写入AD6620内部寄存器。

5系统调试及结果分析

软件无线电核心思想之一就是用软件实现尽可能多的硬件功能。本节在软件无线电接收机系统硬件平台上,通过滤波器设计软件Fltdsgn.exe设计数字下变频器AD6620的抽取率和滤波器参数;通过控制软件AD6620.exe控制并设定AD6620工作方式,下载设计好的滤波器系数;通过DSP TMS320 C6713加载AM解调算法,实现对中频AM信号接收解调。中频AM信号的解调实验,很好地体现了软件无线电思想。

5.1  系统设置及要求

软件无线电接收机子系统的硬件连接如图5-18所示。中频软件无线电接收子系统中中频调制信号源产生中频宽带调制信号,高速ADC AD6640列其进行中频采样量化。数字下变频器AD6620并行接收AD6640并行输出的高速数据流,对其进行止交基带变换,即下变频、抽取、滤波。高速浮点数字信号处理器TMS320C6713通过多通道串行口同步串行接收基带正交信号I、Q,并对接收的信号进行解调处理。

系统中,设定中频AM信号是调制信号为10kHz、载波为10MHz的正弦调幅波,AD6640采样时钟为30MHz。经过AD6640数字化后的数据流速率为30Mb/s,设经过AD6620下变频后的基带信号数据率降为40b/s。

5.2  AD6620内部参数软件设置

因为数字下变频器AD6620输入数据流速率为30Mb/s,输出数据率为40kb/s,则抽取率为30Mb/s/40kb/s=750。利用滤波器设计软件Fltdsgn.exe设计多级抽取滤波器,其通带为0~12.5kHz,阻带为20kHz~15MHz,衰减为-60dB,RCF滤波器为256阶,确定AD6620CIC2、AD6620CIC5、FIR滤波器的抽取率分别为3、25、10。利用控制软件AD6620.exe设定AD6620的工作方式,并将抽取率和设计好的滤波器系数下载AD6620内部寄存器。

5.3 CCS中实时分析AM信号解调后时域及频域特征

软件无线电接收机按照图5-8软件无线电接收机原理图连接。系统工作时,AD6620串行输出数字下变频处理后的基带数据,TMS320C6713使用EDMA结合McBSP同步接收并转存该基带数据到接收缓冲区(参见图5-11)。因为接收缓冲区采用了PING-PONG结构,所以TMS320C6713在使用一个缓冲区(gBufferPingR或gBuffcrPongR)同步串行接收数据的同时,可以直接调用AM信号解调算法处理另一个接收缓冲区(gBufferPongR或gBufferPingR)中的数据。这样,在数据传输和处理的过程中,单个缓冲区数据不会被覆盖或产生读写冲突。而且,gBufferPingR缓冲区和gBufferPongR缓冲区交叉接收数据,使得数据的接收和处理并行进行,提高了系统的执行效率,达到实时性要求。TMS320C6713还开辟了两个数据存储缓冲区gBuffer XmtPing和 gBuffer XmtPong,分别保存gBufferPingR缓冲区和gBufferPongR缓冲区中绎过解调算法处理后的数据。这时,可以通过CodeConposerStudio软件实时分析gBufferXmtPing或gBufferXmtPong中的数据,即分析解调后信号的时域波形和频域特征。首先按照图5-17和图5-18所示分别设定信号的时域分析波形图属性和频域特征波形图属性。系统运行时,可以实时地观测到gBufferXmtPing缓冲区数据的时域波形和频域特征如图5-19所示。图5-19右上部分显示的是中频AM信号解调后的调制信号时域波形,右下部分显示的中频AM信号解调后的调制信号步页域特征。显然,解调后的时域波彤和频域特征表明,使用中频软件无线电接收机子系统很好地实现了对中频AM信号的解调,即解调出调制信号为10kHz的正弦波。


5.4实验结果分析

以上实验在中频软件无线电接收机硬件平台上,通过软件设定数字下变频器AD6620的内部参数,通过软件加载AM信号解调算法,实现了对中频AM信号的解调。基于软件无线电思想的中频软件无线电接收机子系统将ADC尽可能地靠近了天线,大大减少了传统接收机中的模拟器件;通过加载软件模块(如AM解调算法)实现硬件模块功能。以上实验仅对中频AM信号实现了接收解调,但是中频软件无线电接收机子系统是基于数字正交解调通用模型的,从理论上说可以对几乎所有的调制样式进行解调。对于不同的调制信号,只要通过TMS320C6713加载不同的软件解调算法就可以实现不同调制样式信号的接收解调。通过以上分析可知,中频软件无线电接收机充分地体现了软件无线电灵活性和开放性的特点。

6本章小结

    软件无线电是一个庞大的系统工程,有着很多关键技术,本文重点讨论了DSP技术在软件无线电接收机中的应用,设计了基于TMS320C6713的软件无线电接收机。随着高速DSP的发展,软件无线电结构将趋于简单化、理想化,中频和基带之间的数字下变频器将可能完全由DSP软件实现。

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1870) | 回复(0)

发表于 2008/5/24 17:27:20

0

关于投票

实时语音信号处理系统设计实例(转帖)

http://blog.eccn.com/u/107250/archives/2007/417.htm

实时语音信号处理系统设计实例

本章重点介绍基于TMS320C671l DSP的实时语音信号处理系统功能及其设计实现。首先介绍实时语音信号处理系统的设计,主要包括TMS320C6711 DSP和AD535 Codec介绍及其在系统设计中的应用。接着介绍DSP/B1OS I/O设备驱动及驱动程序编写。第4节介绍基于软什中断和PIP实现的实时语音处理系统实现。最后是基于任务和SIO实现的实时语音处理系统实现。

1  语音信号处理概述

语音信号处理包括语音编码、语音识别、语音合成、回声消除(AEC)、语音激活检测(VAD)、语音增益自动控制(AGC)等。

1.1  语音编码

     1.语音编码器的功能

语音编码器的主要功能就是把用户语音的PCM(脉冲编码调制)样值编码成少量的比特(帧)。这种方法使得语音在链路产生误码、网络抖动和突发传输时具有健壮性(Robus-tness)。在接收端,语音帧先被译码为PCM语音样值,然后再转换成语音波形。

2.语音编码器的分类

语音编码器分为三种类型:(a)波形编码器;(b)声码器;(c)混合编码器。波形编码器会尽可能构出包括背景噪音在内的模拟波形。由于波形编码器作用于所有输入信号,因此会产生高质量的样值。然而,波形编码器工作在高比特率。例如:ITU-G.71l规范(PCM)用的比特率为64Kb/s。声码器(Vocoder)不会再生原始波形。这组编码器会提取一组参数,这组参数被送到接收端,用来导出语音产生模型,所以声码器又称为参数编码器。线性预测编码(LPC)用来获取一时变数字滤波器的参数。这个滤波器用来模拟说话人的声道输出。图6-1是合成分析操作,图6-2是低比特率编码器的MOS得分——比特率关系曲线(WEST96)。

在VoIP(Voice overIP)中常用的语音编码器是混合编码器,它融入了波形编码器和声码器的长处,它的另一个特点是它工作在非常低的比特率(4~6kb/s)。混合编码器采用合成分析(AbS)。

为了说明问题,考虑人的声道产生的一个语音模式:当人说话产生语音信号时就会发出浊音(如音素pa、da等)和清音(如音素sh、th)。激励信号就是由输入的语音信号导出的,其方法是使合成语音与输入语音的差别非常小。LPC的用法、激励的产生以及对合成分析(AbS)系统的误差检查均如图6-1所示。长话质量编码器在比特率高于8Kb/s时容易实现,如图6-2所示。长话质量的语音平均意见得分(MOS)必须在获许分以上。传统的PCM语音在比特率小于32 kb/s,语音质量会严重恶化,在这里就不讨论PCN了。混合编码和声码器在比特率相当低的MOS上的得分是可接受的。在现阶段,大多数基于VolP的编码器的工作范围在5.2~8kb/s。研究表明,标准的编码器在比特率为4 kb/s时能提供可接受的MOS得分,一些分0系统在4.8 kb/s的MOS上的得分为3.8。


 


矢量量化和码激励线性预测一种较好的方法就是用预测存储的最优参数(码元矢量)的码本对输入语音信号的表示矢量进行编码,这种技术称为矢量量化(VQ,vectorquantization)。将VQ和AbS技术结合在一起会进一步提高编码性能。AbS VQ是技术构成CELP的基础。VQ和lAbS VQ的主要区别在于进行矢量量化码簿搜索时采用的量化失真测量定义的不同[WONG96]。

3.线性预测合成分析编码器

最常用的比特率在4.8kb/s~16 kb/s之间的语音编码器是基于模型编码器的,这些编码器都是线性预测合成分析(LPAS)方法。为了随着时间的变化模拟语音信号,线性预测语音产生模型必须用适当的信号来激励。每隔一段固定时间(如每隔20ms),语音模型参数和激励参数都必须做一次估计和更新,并用来控制语音模型。下面将介绍两种LPAS编码器:前向自适应LPAS编码器和后向自适应LPAS编码器。前向自适应LPAS编码器:8kb/s G.729编码器和6.3kb/s与5.3kb/s G.723.1编码器。在前向自适应的AbS编码器中,预测滤波器的系数和增益是实时传送的。为了提供长话质量的语音性能,这两种编码器都依赖于信源模型。激励信号(以语音基调周期的信息形式表示)也要传送。这种编码器所提供的模型对语音信号来说是比较好的,但对于一些噪音或者乐器来说并不合适。因此,在背景噪音和音乐环境下,LPAS编码器的质量比7.726和7.727的编码器的质量要差一些。

G.723.1 ITU-T G.723.1编码器在6.4kb/s提供长话质量语音。同时G.723.1还包括一个工作在5.3kb/s的低质量语音编码器。G.723.1是为低比特率可视电话而设计的。在这种适应中,由于视频编码时延通常人于语音编码时延,因此对时延的要求不是很严格。G.723.1编码器的帧长为30ms,还有7.5ms的前视。再加上编码器的处理时延,编码器的单向总时延为67.5ms。其他时延是由系统缓冲区和网络造成的。

G.723.1编码器首先对语音信号进行传统电话带宽的波滤(基于G.712),再对语音信号用传统的8000Hz速率进行抽样(基于G.711),并变换成位的线性PCM码作为该编码器的输入。在编码器中对输出进行逆操作来重构语音信号。G.723.1系统用LPAS编码方法将语音信号编码成帧。编码器能够产生两种速率的语音流量:

(1)用于高速率的6.3kb/s;

(2)用于低速率的5.3kb/s。

主速率编码器使用多脉冲最大自然量化(MP-MlLQ),低速率编码器使用代数码激励线性预测(ACELP,Algebraic-Code-Excited Lineat-Prediction)方法。编码器和解码器都必须支持两种速率,并且能够在帧间对两种速度进行转换,此系统同样能够对音乐和其他音频信号进行压缩和解压缩,但它对语音信号来说是最优的。

编码器对帧进行操作,每帧包括240个样点,采样速率为8000Hz。在进一步的处理(高通滤波器去直流分量)后把每帧分成4个子帧,每个了帧包括60个样点,其他的各种操作包括LPC滤波器以及LSP滤波器非量化系数的计算等,将会导致30ms的分组时延。对每个子帧,用未经处理的输入信号计算LPC滤波器。最后一个子帧的滤波器系数用来预测分裂矢量量化器(PSVQ,Predictive split Vector quantizer)进行量化。正如前而所介绍的,前视占有7.5ms,所以整个编码时延为37.5ms。这个时延在评介编码器,尤其是通过数据网络传输语音时是个很重要的因素,因为如果编码及解码时延比较小的话,就意味着处理互联网中的时延及其抖动时具有更大的自由度。

1.2语音识别

语音识别是一门交叉学科,语音识别正逐步成为信息技术中人机接口的关键技术,语音识别技术与语音合成技术结合使人们能够甩掉键盘,通过语音命令进行操作。语音技术的应用已经成为一个具有竞争性的新兴高技术产业。

     1.语音识别技术

与机器进行语音交流,让机器明白你说什么,这是人们长期以米梦寐以求的事情。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。语音识别是一门交叉学科。近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。人们预计,未来10年内,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。

语音识别听写机在一些领域的应用被美国新闻界评为1997年计算机发展10件大事之一。很多专家都认为语音识别技术是2000年~2010年间信息技术领域十大重要的科技发展技术之一。

2.语音识别技术的基础

语音识别技术关系到多学科的研究领域,不同领域上的研究成果都对语音识别的发展作了贡献。让机器识别语音的困难在某种程度上就像一个外语不好的人听外国人讲话一样,它和不同的说话人、不同的说话速度、不同的说话内容以及不同的环境有关。语音信号本身的特点造成了语音识别的困难。这些特点包括多变性、动态性、瞬时性和连续性等。

计算机语音识别过程与人对语音识别处理过程基本上是一致的。目前主流的语音识别技术是基于统计模式识别的基本理论。一个完整的语音识别系统可大致分为三个部分:

(1)语音特征提取:其目的足从语音波彤中提取出随时间变化的语音特征序列。

(2)声学模型与模式匹配(识别算法):声学模犁通常将获取的语音特征通过学习算法(可以智能抽取变化的语音特征)产生。在识别时将输入的语音特征同声学模型(模式)进行匹配与比较,得到最佳的识别结果。

(3)语言模型与语言处理:语言模型包括由识别语音命令构成的语法网络或由统计方法构成的语言模型,语言处理可以进行语法、语义分析。对小词表语音识别系统,往往不需要语言处理部分。

声学模型是识别系统的底层模型,并且是语音识别系统中最关键的一部分。声学模型的目的是提供一种有效的方法计算语音的特征矢量序列和每个发音模板之间的距离。声学模型的设计和语言发音特点密切相关。声学模型单元大小(字发音模型、半音节模型或音素模型)对语音训练数据量大小、系统识别率,以及灵活性有较大的影响。必须根据不同语言的特点、识别系统词汇量的大小决定识别单元的大小。

语言模型对中、大词汇量的语音识别系统特别重要。当分类发生错误时可以根据语言学模型、语法结构、语义学进行判断纠正,特别是一些同音字则必须通过上下文结构才能确定词义。语言学理论包括浯义结构、语法规则、语言的数学描述模型等有关方面。目前比较成功的语言模犁通常是采用统计语法的语言模型与基于规则语法结构命令的语言模型。语法结构可以限定不同词之间的相互连接关系,减少了识别系统的搜索空间,这有利于提高系统的识别。

语音识别过程实际上是一种认识过程。就像人们听语音时,并不把语音和语言的语法结构、语义结构分开来,因为当语音发音模糊时人们可以用这些知识来指导对语言的理解过程,但是对机器来说,识别系统也要利用这些方面的知识,只是如何有效地描述这些语法和语义还有困难:

(1)小词汇量语音识别系统。通常包括几十个词的语音识别系统。

(2)中等词汇量的语音识别系统。通常包括几百个词至上千个词的识别系统。

    (3)大词汇量语音识别系统。通常包括几千至几万个词的语音识别系统。这些不同的限
制也确定了语音识别系统的困难度。

3.语音识别技术的前景和应用

在电话与通信系统中,智能语音接口正在把电话机从一个单纯的服务工具变成为一个服务的“提供者”和生活“伙伴”;使用电话与通信网络,人们可以通过语音命令方便地从远端的数据库系统中查询与提取有关的信息;随着计算机的小型化,键盘已经成为移动平台的一个很大障碍,想像一下如果手机仅仅只有一个手表那么大,再用键盘进行拨号操作已经是不可能的。语音识别正逐步成为信息技术中人机接口的关键技术,语音识别技术与语音合成技术结合使人们能够甩掉键盘,通过语音命令进行操作。语音技术的应用已经成为一个具有竞争性的新兴高技术产业。

语音识别技术发展到今天,特别是中小词汇量非特定人语音识别系统识别精度已经大于98%,对特定人语音识别系统的识别精度就更高。这些技术已经能够满足通常应用的要求。由于大规模集成电路技术的发展,这些复杂的语音识别系统也已经完全可以制成专用芯片,大量生产。在西方经济发达的国家,大量的语音识别产品已经进入市场和服务领域。一些用户交换机、电话机、手机已经包含了语音识别拨号功能,还有语音记事本、语音智能玩具等产品也包括语音识别与语音合成功能。人们可以通过电话网络用语音识别口语对话系统查询有关的机票、旅游、银行信息,并且取得很好的结果。调查统计表明多达85%以上的人对语音识别的信息查询服务系统的性能表示满意。

1.3回声消除

回声消除(ECR,Echo Cancellation Resource)是基于DSP技术对语音通道的声音进行的实时控制。其实现方法在于:在线路上收到的声音里去掉IVR系统播放的声音,从而保证接收到的声音是纯净的,如图6-3所示。


 1.回声的特点

与传统电话相比,因特网上进行语音的实时传输,有其致命的弱点,那就是语音质量较差,影响因特网语音质量的因素是多方面的,最关键的因素之一是回声的影响。因此,要提高因特网的语音质量,就必须在因特网的语音传输过程中进行消回声的处理。也就是说,IP电话网关作为因特网的语音接入设备,必须具有回声的消除功能。由于因特网的语音传输是采用分组交换技术实现的一种全新的电信业务,传送的语音信号要经过编码、压缩、打包等一系列处理,这不仅造成回声路径的延迟较大,而且延迟抖动也较大。因此,在因特网的语音传输过程中,回声问题显得尤其突出,并具有以下特点。

    (1)回声源复杂。在传统电话系统中,存在着一种所谓的“电路回击”。该回声产生的主要原因是在系统中存在2-4线的转换。完成2-4转换的混合器因阻抗匹配,造成“泄漏”,从而导致了“电路回声”。从因特网IP电话网关的连接方式可以看出,IP电话网关一端连接PSTN,另一端连接因特网。

尽管电路同声产生于PSTN 中,但同样会传至IP电话网关,是因特网语音传输中的回声源之一,因特网语音传输中的第二种回声源是所谓的“声学同声”。卢学回声是指扬声器播放出来的声音被麦克风拾取后发回远端,这就使得远端谈话者能听到自己的声音。声学回声又分为直接回声和间接回声。直接回声是指扬声器播放出来的声音未经任何反射直接进入麦克风。这种回声延迟最短,它与远端说话者的语音能量,扬声器与话筒之间的距离、角度、扬声器的播放音量以及话筒的拾取灵敏度等因素相关。间接回声是指扬声器播放的声音经不同的路径一次或多次反射后进入麦克风所产生的回声集合。因为周围物体的变动,例如人的走动等,都会改变回声的返回路径,因为这种回声的特点是多路径、时变的。另外,背景噪声也是产生回声的因素之一。

(2)回声路径的延迟大。在因特网的语音传输中,延迟来源有3种:压缩延迟、分组传输延迟和处理延迟。语音压缩延迟是产生回声的主要延迟,例如在G.723.1标准中,压缩一帧(30ms)的最人延迟是37.5ms。分组传输延迟也是一个很重要的来源。测试表明,端到端的最大传输延迟可达250ms以上。处理延迟是指语音包的封装时延及其缓冲时延等。

(3)回声路径的延迟抖动大。在因特网的语音传输过程中,由于回声路径、语音压缩时延、分组传输路由等存在诸多不确定因素,而且波动范同较大,一般在20~50ms之间。

2.声学回声消除器及相关算法

随着消回声技术的发展,当前回声消除研究的重点,已南“电路回声”的消除,转向了“声学回声”。同卢的消除包括以下处理方法:

(1)周围环境的处理。分析声学回声的产生机理,可以知道:声学回声最简单的控制方法是改善扬声器的周围环境,尽量减少扬声器播放声音的反射。例如,可以在周围的墙壁上附加一层吸音材料,或增加一层衬垫以增加散射,理想的周围环境是其回响时间或RT-60(声音衰减60dB所需要的时间)在300ms~600ms之间。因为这样的环境一方面可以控制反射,另一方面又可以不会使讲话者感到不适。改善环境可以有效地抑制间接声学回声,但对直接声学回声却无能为力。

(2)回声抑制器。回声抑制器是使用较早的一种回声控制方法。回声抑制器是一种非线性的回声消除。它通过简单的比较器将接收到准备由扬声器播放的声音与当前话筒拾取的声音的电平进行比较。如果前者高于某个阈值,那么就允许传至扬声器,而且话筒被关闭,以阻止它拾取扬声器播放的声音而引起远端回声。如果话筒拾取的声音电平高于某个阈值,扬声器被禁止,以达到消除回声的目的。由于回声抑制是一种非线性的回声控制方法,会引起扬声器播放的不连续。影响回声消除的效果,随着高性能的回声消除器的出现,回声抑制器已很少有人使用了。

(3)声学回声消除器。声学回声消除的另一个方法是使用声学同卢消除器(AEC:AcousticEcho Chancellor),AEC是对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断地修改滤波器的系数,使得估计值更加逼近真实的同声。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,AEC还将话筒的输入与扬声器过去的值相比较,从而消除延长延迟的多次反射的声学回声。根椐存储器存放的过去扬声器的输出值,AEC可以消除各种延迟的回声。

典型的声学回声消除器结构如图6-4所示,语音激活识别模块判断线路中是否有声音传输。语音激活识别模块的输出传给控制单元,需要时控制单元更新、保持或者置零权值(Weight)。同波估计模块是自适应模块,用于估计回波路径。在叫波估计单元之后,是非线性处理器,目的是减少回声处理后剩下的回声。如果剩余的回声超过设定的闽值,该单元将有效地阻止或消除回声。当信号被阻止后,补偿噪声发生器将插入补偿噪声(Comfort Noise)。声学回声消除器D的核心是用于回波估计的自适应滤波器算法实现,一般采用LMS(LeasetMean Square)算法。另外,TI TMS320系列的DSP有利于该算法优化的汇编指令,使得DSP在处理回声消除时更高效、更实时。

 


2实时语音信号处理系统设计

实时语音信号处理系统是指系统能够实时(或准实时)地对语音信号进行编码、解码,以及网络传输。这是应当前人们对语音处理效果越来越高的要求产生的。本节旨先通过介绍视频会议系统中的语音处理,然后重点介绍基于TMS320C6711 DSP和TLC320AD535Codec实现的实时语音处理系统。

2.1  视频会议系统中的实时语音处理

视频会议系统中实时语音处理框图,如图6-5所示。每个视频会议终端包括接收通路和发送通路。在接收通路中,终端上中央处理器接收互联网和以太网上传输的音频(当然还包括视频)码流,对其帧解析后送给DSP做解码处理。解码后的数字语音信号经D/A转换后,通过扬声器输出。在发送通路中,终端对话筒拾取到语音信号进行数字化转换后交给DSP处理。DSP对语音的处理一般包括语音增强(提高信噪比)、回声消除、语音激活检测、自动增益控制、语音编码等。编码后的语音信号一般由终端上的中央处理器通过互联网或以太网发送。可见,DSP在视频会议终端中担任着终端编码、解码的核心任务。DSP对音频信号能否实时编,解码处理,是视频会议系统的一项最重要的指标。

 


2.2  TMS320C6701 DSP

TMS320C6701是高速的浮点DSP,芯片最高时钟频率达300MHz,最大处理能力达2400MOPS。TMS320C6701 DSP采用先进的哈佛结构,解决了冯·诺伊曼(Von-Neumann)结构中高速数据传输时的传输通道上的瓶颈现象;内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间:指令执行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求,如FIR、ITR、FFT等运算。尤为值得一提的是TMS320C670l的软件特点,多种有效灵活的寻址方式,仪为3ns的指令执行周期,还有一些特殊的运算指令更好地满足了数字信号处理中特有的运算需要。TMS320C6701 DSP功能框图如图6-6所示。


TMS320C6701提供了2个高速多通道缓存串行口。McBSP提供了双缓存的发送寄存器和三缓存的接收寄存器,具有全双工的同步或异步通信功能,允许连续的数据流传输;数据发送和接收有独立可编程的帧同步信号;能够与工业标准的解码器、模拟接口芯片或其他串行A/D与D/A设备、SPI设备等直接相连;支持外部时钟输入或内部可编程时钟;每个串行口最多可支持128个通道的发送和接收;支持传输的数据字长可以是8bit、12bit、16bit、20bit、24bit或32bit。内置μ-律和A-律压扩硬件。可以与工业标准的编/解码器,AICs接口。支持多种方式的传输接口,如T1/E1帧协议、MVIP帧方式、H.100帧方式、SCSA帧方式、IIS兼容设备等。可与多达128个通道进行收发。

McBSP通过7个引脚(DX、DR、CLKX.、CLKR、FSX、f7SR和CLKS)与外设接口。DX和DR引脚完成与外部设备进行通信时数据的发送和接收,由CLKX、CLKR、FSX、FSR实现时钟和帧同步的控制。由CLKS来提供系统时钟。发送数据时,CPU和DMA控制器将要发送的数据写到DXR(数据发送寄存器),存FSX和CLKX作用下,由DX引脚输出。接收数据时,来自DR引脚的数据在FSR和CLKR作用下,从DRR(数据接收寄存器)中读取数据。接收和发送帧同步脉冲既可以由内部采样速率产生器产生,又可以由外部脉冲源驱动,McBSP分别在相应时钟的上升沿和下降沿进行数据检测。

串行口的操作由串行口控制寄存器SPCR和引脚控制寄存器PCR来决定;接收控制寄存器RCR和发送控制寄存器XCR分别设置接收利发送的各种参数,如帧长度等。

2.3  Codec TLC320AD535

    1.AD535功能结构

TLC320AD535是一款SIGMA-DELTA型单片音频接口芯片(AIC),其功能框图如图6-7所示。它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置。在DAC之前有一个差值滤波器以保汪输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。


 TLC320AD535内部有7个数据和控制寄存器,用于编程控制它们的工作状态。

·寄存器0:空操作寄存器。

·寄存器1:软件复位、软件掉电、选择16位或15位工作方式、硬件或软件二次通信    请求方式的选择。

·寄存器2:使能ALTDATA输入端为ADC选择16/15位方式。

·寄存器3:选择FS与FSD之间延迟SCLK的个数,告诉主机有几个从机被联上。

·寄存器4:为输入和输出放大器选择放大器增益;选择N来设置采样频率,fs=MCLK/    (128*N)或MCLK/(512*N);在MCCLK输入端使能外部时钟输入并旁通内部的PLL。

·寄存器5,6:保留。

2.TLC320AD535和TMS320C6701 McBSP之间串行通信

TMS320C6701 DSP和TLC320AD535 Codec之间串行通信连接,如图6-8所示。TLC320AD535与DSP之间的数据传送采用串行方式,包括两种传输模式:主串行通信和二次串行通信。主串行通信用于从ADC接收数据或发送数据给DAC;二次串行通信则对控制寄存器读写控制字,从而控制器件的选择和电路配置。使用主串行通信和二次串行通信的目的是使得转换数据和控制数据能够共用一个串行口传输数据。主串行通信格式的16位都用来传输数据。ADC的数据长度由寄存器2的D4位决定。启动和复位后默认值为15+1位模式,最后一位用于请求二次通信(DO:0表示无操作,l表示请求二次通信)。


3.TLC320AD535和DSP McBSP之间串行通信时序

    (1)主串行通信。

主串行通信在ADC和DAC之间接收和传输数据。DAC字长15位,主16位串行通信字的最低位是控制位,用于确定是否要求二次通信。主串行通信数据格式如图6-9所示。

 


 TLC320AD535有两种串行数据传输模式,一种是FS高模式,通过绑定管脚SL_SELDVDD设定,其时序如图6-10所示。
 


(2)二次串行通信。

是否需要二次串行通信,通过对DT-DIN(或VC_DIN)  的LSB(DO)位置位来实现。二次串行通信的数据格式,如图6-12所示。

 


TLC320AD535的数据传输模式和采样速率都可以通过DSP对其控制寄存器的编程来实现,因此在许多场合下,TLC320AD535都作为DSP的AIC来实现音频处理。

2.4系统硬件设计

实时语音信号处理系统硬件结构如图6-15所示。系统主要由TMS320C6701 DSP、TLCAD535 Codec、电源、逻辑控制单元(CPLD)、外部存储器(FLASH、SDRAM)组成。系统还提供标准JTAG口供测试用,HPI口供主机通信用,以及其他标准的扩展端口。在实时语音信号处理系统中,TMS320C6701 DSP负责语音信号的编码、解码。一方面,TMS320C6701DSP通过。McBSP同步接收TLC AD535 Codec采集到的语音信号(MIC IN或LINE IN),并对接收到的语音信号进行编码。另一方而,TMS320C670l DSP对编码后的数据进行解码处理,解码后的音频数据流再通过McBSP以串行通信的方式传送给TLC AD535 Codec,由其输出(LINE 0UT或HP OUT。)。这是一个语音信号处理的自检(LOOPBACK)过程,通过该系统,结合CCS集成开发环境的Pprofile分析工具,可以很好地分析DSP编解码耗费的CPU资源及实时性分析。


3  DSP/BIOS I/O口设备驱动

这里所描述的驱动器是应用在基于帧格式的I/O流系统中的,也就是说这些系统中的数据块是作为一个个单元(帧)实时处理的。这些系统使用的算法包括声音合成、呼叫处理语音声音检测和发生、语音识别、MPEG播放器、视频处理等基于帧(块)压缩或实时分析。在这些系统应用中,数据块都是周期性地从数据转换器读或周期性地向数据转换器写的连续的数据流。

DSP/BIOS提供两种I/O服务模式:管道(PIP)和流(SIO)来实现基十帧的信号处理系统。两种I/O途径都提供在应用层和外设之间的传输数据的数据缓冲管理以及一个缓冲传输结束时信号通知程序线程的方法。

通常程序的线程是抢占式的,而且阻塞其他线程的执行直到需要的I/O时才结束。DSP/BIOS提供两种抢占式线程:软件中断(SWls)和任务(TSKs)。抢占式线程是诸如通用端口通信等多速率处理系统必需的,使用在任何包含多种帧大小或数据率的系统中。PIP对象使用软件中断和任务,SIO一般只使用任务。

BIOS设备驱动模块包括两个独立的部分:适配器(Adapter)和设备控制器。这两部分一起连接硬件设备到线程(软件中断或任务),DSP/BIOS设备驱动模型如图6-16所示。


适配器:应用程序和设备控制器之间的接口由适配器提供。适配器直接和PIP或SIO象通信,并重新发送一个缓冲区给设备控制器。设备无关表明缓冲区管理和线程信号由设备驱动器中的适配器来处理。DSP/BIOS提供了两种底层I/O口(LIO)适配器:PIP模块使用PLIO适配器,SIO/DEV模块使用DLl0适配器。这些适配器为设备控制器提供通用的接口界面。这些适配器需要稍许、甚至不需要定制。

设备控制器:设备控制器提供适配器和硬件之间的接口。设备控制器面向硬件,填充或者清空适配器为其提供的缓冲区。典型的设备控制器很小,而且主要处理特殊设备。必须为每一个设备写一个独立的设备控制器。设计设备控制器和适配器之间的接口的目的是PLIO和DLIO适配器能够和任何摔制器一起使用,实现底层(LIO)界面定义。适配器和设备控制器分离是因为适配器使用DSP/BIOS调用针对PIP或SIO缓冲函数方法。另外,使适配器和设备控制器分离减少了为新设备编写控制器的大量代码。

3.1  LIO接口

LIO是一个界于应用线程和面向阻塞硬件设备之间的底层界面。LIO使用简单的缓冲管理原则和灵活的信号回调界面连接硬件设备到应用线程。LIO接口定义了创建新的LIO设备控制器时必须实现一系列函数和数据结构。

LIO接口定义一组函数和一个数据结构来实现创建一个新的LIO设备控制器。设备控制器和硬件的接口构成系统数据的源地址或目的地址。设备控制器初始化设备驱动需要的底层硬件,管理应用层和硬件之间的缓冲移动,提供应用层和硬件之间定制的接口。这些功能通过一组定义的函数和用于共享状态信息和数据缓冲的数据结构来实现。设计控制器的函数如表4-1所示,这些函数可以分为三类:全局函数、通道控制函数和中断服务例程。


1.全局函数:init()和setup()

   init()函数初始化控制器模块。该函数初始化独立控制器的I/0通道的全局数据结构。init()结构如下,没有参数和返回值。

V0id_init();

setup()用于为控制器模块设置参数和执行控制器必需的硬件初始化。setup()一般使用芯片支持库(CSL,Chip Support Librar),)配置和执行硬件的初始化。setup()函数的结构如下,传输专用控制设置结构。

void_setup(_Setup*setup);

这两个函数在初始化系统时必须由应用程序的main()函数调用,setup()必须在init()函数之后调用。在应用程序中,设备驱动器占用的硬件不能由其他函数使用。硬件的所有权必须由设备控制器明确声明。由于init()和setup()函数连接硬件和控制器所使用的通道对象,它们必须只调用一次,而且是在应用程序创建任何通道之前。

2.通道控制函数

在控制器初始化和设置以后,应用程序通过调用PLlO_new()或SIO_create()函数创建控制器(或者叫通道)实例。每一个通道使用其通道对象保持其状态和缓冲信息。LIO_Fxns结构绑定控制器到适配器并完成设备的驱动。该结构包含5个管理控制器操作的函数。open()和close()函数创建特定的通道。The submit()和cancel()控制这些特定通道中缓冲的流动。最后,ctrl()扩展控制器接口增强灵活性。这些函数接口可以面向PIP或SIO适配器。因此,当适配器需要调用控制器中的函数时,适配器引用实例对象中的这个结构。

    (1)open()和close()函数

当应用程序为PIP适配器调用PLIO_new()或者为SIO适配器调用SIO_create()函数时,绑定到适配器的控制器调用open()函数。open()函数创建并初始化控制器的特定通道对象。这样的通道对象和硬件之间的缓冲数据是单向流动的。例如,数字信号编解码器(Codec)代表输入输出通道。这两个通道都是Codec设备驱动器的一部分,当一个通道需要和Codec通信时调用open()函数。也就是说,open()函数为接收和发送通道调用。open()函数应该根据适配器设置成输入或输出分配适当的通道。设置通道对象所需要的信息通过open()函数的参数传递。

ptr open(Strinq name,LIO_M0de mode,ptr args,LIO_Tcallback cbFxn,Arg cbArg);

当使用SIO适配器时,应用程序通过SIO-delete()函数调用close()函数。它通过设置通道对象中的状态变量来关闭通道。它还要禁止该通道使用的任何中断。需要注意的是:PLIO不调用close()函数。

(2)submit()和cancel()

一旦控制器完成了已经打开的通道的初始化,应用程序能够和控制器之间发送和接收数据。submit()接收应用层的数据并呈递这些数据给底层的硬件。当适配器从应用层接收到新的缓冲数据时,它调用submit()函数。通道对象用于管理控制器内部的缓冲。一个指向通道对象的指针传给submit()函数,还包括指向新缓冲区的指针及最小可设定地址单元中缓冲区的大小。这个信息应该存储在通道对象中。缓冲数也应该更新,以表明一个新的缓冲已经添加到控制器中。这些变量可以用于和中断服务例程之间的同步及通信。例如,一个采样控制器使用缓冲区的大小来告知中断服务例程已经接收或发送多少数据。submit()函数的参数及返回值如下:

Int submit(Ptr chanp,  Ptr buf, Uns nmauS);

cancel()允许应用程序终止控制器所占有的数据。当使用SIO适配器时,应用程序通过调用SIO_idle()函数调用cancel()函数。cancel()通知底层的硬件停止发送或接收数据。PLIO适配器不调用cancel()函数。cancel()应该有以下参数和返回值:

(3)ctrl()

    ctrl()函数是为控制器创建的扩展接口,引入硬件的特殊功能。ctrl()应该有以下参数和返
回值:

BOOl ctrl(Ptr chanp,  Uns cmd,  ptr args);

3.中断服务例程

中断服务例程是实际上和硬件同步的设备控制器函数。它通过中断向量表调用,并被使能以便认可。中断服务例程实际上和硬件交换数据。它通过使用通道对象和其他控制器共享状态信息。例如,当从应用层接收新的缓冲数据时,中断服务例程可以读这个信息,以便知道数据到达时把数据放置在哪里。当缓冲区填满数据时,中断服务例程通过通道对象中包含的回调函数通知适配器。

    4.总结
    设备控制器接口是一个简单而灵活的绑定应用层和特定硬件的方法。控制器使用3种基
本类型的函数共享适配器和硬件之间的数据。初始化和设置函数执行必要的硬件和软件初始
化。5个通道控制函数构成设备驱动器功能的重要部分。submit()和ISR函数联合工程设备
驱动器的核心。LIO设备控制器函数总结如图6-17所示。


3.2 LIO适配器

LIO适配器通过缓冲区管理器(PIP或SIO)从应用程序中获得一个缓冲,并让其由设备控制器清空或填充。适配器识别控制器何时结束缓冲区处理并通过缓冲管理器发送回应用程序。这些通过小量的耗费和复杂性实现。提供两个基本的LIO适配器,第一个是PLIO适配器,用于PIP模块中;第二个是DLIO适配器,用于SIO/DEV模块中。每一个适配器PIP或SIO对象由PLIO_new()或SIO_create()函数初始化。在main()函数中调用这些函数初始化适配器的数据结构。这个数据结构,或者实例对象还包括适配器提供给缓冲区的控制器信息。在应用线程和适配器之间、或者适配器和设备控制器之间实例对象是无缝连接的。

    1.PiP适配器(PLIO)

DSP/BIOS PIP模块提供“数据通道”服务。PIPs设计的目是用于管理阻塞I/O口。每一个通道对象包含一个缓冲区,该缓冲区分为固定数量、固定长度的帧。用于PIP模块的帧的数量和长度在DSP/BIOS配置工具中设置。虽然每一个帧有固定的长度,应用程序可以填充少于整个帧的数据到PIP.PIP两端。程序从读端读帧的数据。程序从写端发送帧的数据。通常一端编码用于调用I/O设备。数据通知函数执行同步数据传输。当读完或写完一帧数据,这些函数被触发,通知PIP另外一端有一帧数据或空帧。写端通过调用PIP_alloc()函数获得填充数据的帧。数据填充到帧中后,写端调用PIP_put()函数。这个调用导致notifvReader函数被调用。适当的时候,读端调用PIP_get()函数重新找回帧数据,当数据不再需要时,调用PIP_free()函数。调用PIP_free()触发notifyWriter函数,循环重新开始。PIP对象关联的消息函数由用户在通过DSP/BIOS配置工具中设置。PIP适配器,或者是PLIO,设计用于通过缓冲管理器从应用层获得缓冲,并呈递给控制器消耗,控制器完成处理缓冲区并通过缓冲区管理器返回缓冲区给应用层时。

PLIO使用以下基本的函数:

(1)Prime函数。当应用层发送一个缓冲数据给设备驱动器时,PIP管理器调用rxPrime和txPrime。这些函数使用DSP/BIOS API调用从缓冲管理器获得缓冲并呈递给控制器。“prime”函数是应用层和适配器之间的信号接口。

(2)回调函数。rxCallback和txCallback是控制器和适配器之间的信号接口。在驱动器设置期间,当完成缓冲区处理后,适配器告诉控制器调用哪个函数。这个回调通知适配器,当缓冲区准备送回到缓冲管理器,最后送回到应用层。

(3)传输函数。传输函数调用设备控制器submit()函数。submit()函数从适配器返回缓冲,然后传递新的缓冲区信息给中断服务例程。信息的传递通过通道对象实现。PLIO适配器使用这些函数在应用层和控制器之间通信。

2.SlO适配器(DLIO)

DSP/BIOS流I/O(SIO)模块提供和任务线程一起使用的高层设备无关的I/O机制。SIO超过PIP,因为它能在运行时创建新的SIO对象。为了提供这个功能,SIO有自己的设备驱动模块,叫做DEV。写DEV驱动类似于LIO驱动。一组特定设备函数,诸如打开、关闭及缓冲区管理,通过函数表使用SIO对象实现和访问。由于DEV驱动需要更高层DSP/BIOS知识,所以DEV驱动更难写。编写DEV驱动必须知道队列、信号量以及SIO模块知识。SIO适配器,也叫做DLIO,设计易于集成现有的DEV模块。通信和同步可以由最小的耗费和复杂性来实现。

DLIO适配器使用以下基本类型的函数:

(1)回调函数。回调函数是控制器和适配器之间的信号接口。驱动器设置期间,当完成缓冲区处理后,适配器告诉控制器调用哪个函数。这个回调通知适配器,当缓冲区送回到缓冲管理器时,最后送回到应用层。

(2)传输函数。传输函数调用设备控制器submit()函数。submit()函数从适配器返回缓冲,然后传递新的缓冲区信息给中断服务例程。信息的传递通过通道对象实现。DLIO使用这些函数在应用层和控制器之间进行通信。

3.3 LIO设备控制器

   LIO设备控制器构成适配器和面向缓冲的硬件接口。这个接口简单而且很好定义,这样控制器可以与PIP或SIO适配器一起使用,占用很小的资源。控制器的基本功能是在适配器和硬件之间发信号和进行缓冲管理。当一个新的缓冲由应用程序发送来时,适配器调用控制器。控制器呈递这个缓冲给硬件,通常由中断服务例程来表述。当中断服务例程完成缓冲区的处理后,它通过适当的回调函数通知适配器,接收或发送。控制器必须为应用程序的其他功能提供包括初始化硬件、开关、终止设备驱动器的数据。

流设备控制器分为两种不同的类型:sample-by-sample和DMA使能。sample-by-sample控制器通过每一个硬件中断发送或接收数据。DMA使能控制器使用DMA发送和接收采样值,并在每一个缓冲区结束时接收中断。在每一个中断结束后,DMA能够自动为下一次缓冲传输初始化自身。在许多系统中使用DMA更优越,因为DMA减少了与中断服务线程之间频繁切换所耗费的资源,这样就允许CPU做更多的数据处理。下面重点介绍DMA使能控制器及其函数使用方法。

DMA使能控制器使用DMA和底层I/O设备发送和接收缓冲区数据。控制器的初始化例程设置DMA、底层设备以及绑定这两个设备在一起的逻辑。当控制器从适配器接收缓冲时,它向DMA提交缓冲工作。DMA在缓冲和底层硬什之间传输采样值。当DMA完成缓冲处理时,中断服务例程运行并通知适配器缓冲处理结束。

EDMA使能的设备摔制器整个数据流程如下:

(1)硬件,包括EDMA由setup()函数初始化:

(2)适配器调用open()函数初始化合适的通道对象并标记该通道在使用中。

当适配器从应用层接收新的缓冲时,调用控制器的submit()函数;submit()函数将适配器传递的信息传给控制器并更新通道对象。控制器使用这个信息程序同步EDMA和McBSP传输。当McBSP需要发送或接收新的采样值时,它通过硬件通知EDMA。当。EDMA完成缓冲的传输时,其先中断服务例程执行,然后调用通道对象引用的回调函数。

在下一次调用submit()时能够对EDMA编程,设置下一次缓冲传输。一些DMA,包括EDMA有在传输结束“自动重加载”自身新的传输的能力。由于EDMA自动加载自身,CPU就从这个任务中解放出来。EDMA将下一次传输缓冲的参数保存在参数随机寄存器中,使用连接指针的方式自动加载。

    1.通道对象

通道对象在submit()和EDMA中断服务例程中共亨信息。下面是一个在C670l EDMA中使用的通道对象。

 


控制器使用这些变量保存LIO适配器上交的传输连接列表状态。

2.setup()函数

setup()函数供所有设备控制器通道设置硬件。应用层中传递给setup()函数的结构使能或者禁止控制器中的高速缓冲存储器相应调用。如果高速缓冲存储器被使能而且缓冲区不在片上,那么应用层或者是设备驱动器必须处理高速缓冲存储器相应调用。默认的设置是控制器去处理这些调用。EDMA在setup()函数中初始化McBSP和Codec,并且使能EDMA中断。

3.open()函数

open()给EDMA控制器设置特定的通道。这包括设定适当的EDMA通道(接收或发送)。函数开始时为EDMA通道创建一个配置结构,由控制器使用;然后通过检查通道对象的inUse成员确定被打开的通道没有被其他任何事情占用;根据传递的参数,设定通道对象的返回指针和返回参数。

然后open()函数为控制器使用的EDMA分配传输控制代码(TCC)。TCC告诉哪个通道导致EDMA中断。这一点很重要,因为所有的EDMA通道使用同一个EDMA中断。open()函数为控制器使用的PRAM分配地址。

然后,open()修改通用的配置使通道特定化。如果通道打开作为输入,传输信号源设置为串行口接收寄存器,源地址索引设为0,目的索引设为增量。如果通道打开设置为输出,传送的目的地址使串行发送寄存器,目的地址索引为0,源地址设置为增量。当这些变化确定后,配置写入EDMA控制器控制打开的通道,无论是输入/接收还是输出/发送。这些值同样写入为给定通道分配的参数随机寄存器。以下是使用芯片支持库(csL)编写的独立通道配置代码。


4.The submit()

submdt()函数从适配器接收新的缓冲。如果控制器的提交次数达到MAXSUBMIT-COUNT,submit()返回-1表明失败。否则,submit()函数添加缓冲到传输连接列表。这通过管理通道对象中的变量来实现。当EDMA中断服务例程运行时,submit()通过修改这些变量阻止submitCount参数改变禁止EDMA通道。它然后使用通道对象的writelndex成员变量寻找哪个PRAM位置使用下一次传输。下面的代码根据通道模式(LIO_INPUT或LIO_OUTPUT),设定PRAM位置的源地址和目的地址。

 


5.中断服务例程

对于所有通道,EDMA只有一个中断。因此,中断服务例程需要划分出哪个通道(接收、发送或两者)导致中断服务例程运行。初次之外,中断服务例程实际上很简单。由于缓冲区已经被处理,所需要做的是递减submitCount,递增读索引,调用适当的正确参数的回调函数。

以下是处理EDMA传输数据的代码:

 


4基于软件中断和PIP实现的实时语音处理

PIP模块在编译时静态地分配I/O缓冲区内存。简单分配、释放APIs控制缓冲区的读写。当缓冲区满时,写线程(典型的是一个硬件中断)调用PIP_put函数。作为响应,PIP模块调用读消息通知函数安排处理数据。典型的读通知函数是一个DsP/BIOs内核,如SWI_post(信号通知软件线程)。当完成缓冲区的读处理,则调用PIP_free。作为响应,PIP模块调用写通知函数以便缓冲区能够被重新使用。PIP模块的驱动必须使用PIP函数,如PIP_put操作PIP缓冲区。驱动器也必须响应读和写消息通知函数配置PIP对象,如图6-18所示。

 


4.1  实时语音处理系统中DSP/BIOS对象配置

使用PIP模块和LIO设备控制器,必须创建一个PIP对象,该PIP对象使用notifyWriter函数填充LIO输入通道,使用notifyReader排出到LIO输出通道。这些是PIP适配器连接PIPAPI和LIOAPI的功能。

以下是在语音信号处理系统中配置的DSP/BIOS对象:

(1)软件中断swiEcho,运行echo函数。

(2)两个数据管道pipRx和pipTx,在echo和PLIO适配器之间交换数据。pipRx负责接收数据,pipTx负责发送数据。

(3)使用HWI-Hardware Interrupt Service Routine Manager为McBSP串行口0配置对应的中断服务例程。

HWI_INT6:多通道缓冲串行口0接收中断。中断源是MCSP_0_Receive(接收事件),中断函数是_DSK6X11_MCBSP_AD535_rxisr。

HWI_INT7:多通道缓冲串行口0发送中断。中断源是发送事件(MCSP_O_Transmit),中断函数是_DSK6X11_LMCBSP_AD535_txisr。

4.2软件流程

基于软件中断和PIP实现的实时语音处理的软件流程如图6-19所示,具体的程序流程如下:

 


5 基于任务和SIO实现的实时语音处理

SIO和任务线程一起使用,它使用动态可变缓冲区地址。在典型的应用中,静态分配SIO缓冲区,或启动时动态分配缓冲区,或者重复使用循环的缓冲区。因此,为SIO写的驱动必须接收任何缓冲区地址且不必要求这些缓冲区像PIP一样重复使用。在内部,SIO使用关联的DEV(设备)模块。SIO总是使用信号量(SEM)通知任务线程传输已经结束。这和PIP使用底层读/写通知函数是有差异的。

5.1  实时语音处理系统中DSP/BIOS对象创建

   以下在语音实时信号处理系统中实现的设备控制器(DEV)可以和任何LIO一起使用。DEV函数和LI0函数大致形成一对一的映射。每一个DEV函数执行一些操作SIO数据结构和LIO函数间数据传输的操作。SIO连接SIO/DEV API和LIO API。

在实时语音处理系统中,DSP/BIOS对象静态或动态的创建如下:

(1)任务tskEcho,运行echo函数。

(2)使用HWI-Hardware Interrupt Service Routine Manager为DMA通道4和5配置对应的中断服务例程。

(3)使用User Defined Device为DMA_AD535添加设备控制器codec。

在实例中,动态创建DSP/BIOS对象,两个SIO流:inStream和outStream,在echo和DLIO适配器间交换数据。图6-20是DLIO适配器缓冲流程图。

 


5.2  软件流程

基于任务和SIO实现的实时语音处理软件流程如图6-21所示,与基于中断和PIP实现的实时语音处理软件流程不同的是采用了任务(TSKs)抢占式线程。当初始化的任务线程条件满足时,软件将启动对应任务处理线程。该实时语音信号处理系统中设定两个任务线程:一个是接收串行口数据任务线程,另一个是向串行口发送数据任务线程。任务线程的结束和同步使用信号量(Semaphore)机制,这不通用软件中断中一般使用的是Mailbox机制。

 


6本章小结

    本章首先概括介绍了语音信号处理及其与应用在视频会议系统、VolP系统中的实时性要求。然后设计了基于TMS320C6701 DSP构建的实时语音信号处理系统。本文重点介绍TMS320C670l DSP通过两种不同的方法实现实时语音信号处理技术,即基于软件中断和PIP实现的实时语音处理和基于任务和SIO实现的实时语音处理。没有重点介绍语音信号处理的算法,重点足构建了基于DSP的实时语音信号处理系统的硬件平台和软件结构,为具体的语音信号处理算法实现与调试提供了良好的基础。

 

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1405) | 回复(0)

发表于 2008/5/22 1:22:58

0

关于投票

C++环境下DSP/BIOS大致运行顺序

hotpower 发表于 2008-5-22 01:22 德州仪器(TI) ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: C++环境下DSP/BIOS大致运行顺序

DSP/BIOS大致运行顺序:
1.c_int00();
2.BIOS_init();
3.UserHook_Init();//用户初始化函数(用户初始化钩子函数,可用于硬件等初始化)
4.C++类的构造函数(各类自身的初始化)
5.main();//用户最好不要在此前开中断(子中断也最好不要开,专设Task_Init干此事为好~~~)
6.BIOS_start();//BIOS在此开中断
7.Task_Init();//用户任务初始化的任务函数(任务优先级别最高的任务,用户最好在此开子中断)
8.其他级别的任务(HWI,SWI等)
9.IDL_F_loop();

菜农HotPower@126.com 2008.5.22 1:18 于雁塔菜地

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1012) | 回复(0)

发表于 2008/5/14 0:56:18

0

关于投票

DSP中的Mailbox的学习(转帖)

http://blog.chinaunix.net/u/6071/showart_365651.html

在DSP项目开发中,我用mailbox实现了进程间的通信,通过接收网络控制进程发来的mailbox,实现了云台的控制,其中需要学习的地方有两点:一是mailbox通信机制的学习,二是DSP时间管理机制,这里先学习一下mailbox的相关知识。

    MBX模型为mailbox提供了一系列函数支持,比如MBX_pend 和 MBX_post。而mailbox可以用来在同一块处理器上运行的进程相互通信。mailbox是同步通信机制,而且mailbox在传递之前就已经确定了大小,这样可以保证成堆的信息接踵而来的时候不会超出系统的处理能力。我们网络监控系统的mailbox初始化的时候mailbox每条信息容量的上限为500字节,长度为12,也就是可以存储12条信息。

    MBX_create和MBX_delete顾名思义就是分别用来创建和销毁mailbox的。当然你也可以静态的创建mailbox。静态创建对内存的分配方面有好处,而动态创建在于灵活,但是DSP的内存分配策略据说不是很好,我也有所体会了。当然,别人德州器械久负盛名的TI芯片族,我是没资格说三道四了。在我们组的工程中,每个进程都静态配置了mailbox的创建,这样的话,在task的源码中就不会看到MBX_create函数以及调用这个函数的函数了。这个配置文件写在.tci文件中,在最终的.tcf文件中调用,在板子启动时读取这份tcf文件,便在程序启动的最初将它们初始化完毕,以后程序的工作就是用它们了。

bios.MBX.create("mbx_alarm");

bios.MBX.instance("mbx_alarm").messageSize = 500;

bios.MBX.instance("mbx_alarm").length = 12;

 

    下面是MBX_create和MBX_delete的函数参数的介绍。没办法,这不是linux,它们的函数原型恐怕无法得知了。(这两天看UNIX网络编程,感觉还是开源来的爽快,大师们编的程序真是漂亮)。

MBX_Handle MBX_create(msgsize, mbxlength, attrs)

Uns msgsize;

Uns mbxlength;

MBX_Attrs *attrs;

 

Void MBX_delete(mbx)

MBX_Handle mbx;

MBX_pend这个函数用来读取mailbox里的信息。如果邮箱是空的,或是说没有有效的信息,MBX_pend会阻塞。这种状况下呢,timeout参数可以让进程在此等待到超时结束,或是完全不等(设为0,唉,真的是一个信息都接不到啊,还是不要设为0,推荐2),呵呵。

Bool MBX_pend(mbx, msg, timeout)

MBX_Handle mbx;

Void *msg;

Uns timeout; /* return after this many */

/* system clock ticks */

这里要注意的是,DSP时间单位不是秒,而是system clock ticks,下一次我会研究比较一下linux和dsp时间机制的不同。

相对的,MBX_post是用来发送信息的。如果mailbox是满的话,(在我的工程中,就是待发出的信息量大于12)MBX_post会阻塞。在这种情况下,timeout参数会让进程等待到超时结束,或是不等。等不来的话呢,返回0,就说明什么也没发出去咧,返回1呢,就是发送成功了啦。

下面是MBX_post的源码:

 

Bool MBX_post(mbx, msg, timeout)

MBX_Handle mbx;

Void *msg;

Uns timeout; /* return after this many */

/* system clock ticks */

 

值得一提的是,我和实验室的一个MM一起调试云台的时候,我在客户端狂点云台按钮,她在服务器端比较郁闷的发现大多数MBX_post都会返回0,就是发送不成功。可以设想,如果超时时间设长一点的话,可能会保证收到消息的绝对处理,但不能保证收到消息的实时处理。对于监控系统这样对实时性要求很高的固件来说,我认为还是丢弃一部分比较好。但丢弃带来的问题就是,可能命令执行不连续,对云台控制质量保证不了,这需要我们进一步对云台控制的进程进行优化和调度,保证信息的及时稳定的传递。

 

下面奉上DSP的代码,讲的就是两个进程通信,多个人发邮件,一个人收邮件,结果也附带奉上:

     /*

* ======== mbxtest.c ========

* Use a MBX mailbox to send messages from multiple writer()

* tasks to a single reader() task.

* The mailbox, reader task, and 3 writer tasks are created

* by the Configuration Tool.

*

* This example is similar to semtest.c. The major differences

* are:

* - MBX is used in place of QUE and SEM.

* - the ‘elem’ field is removed from MsgObj.

* - reader() task is *not* higher priority than writer task.

* - reader() looks at return value of MBX_pend() for timeout

*/

#include

#include

#include

#include

#define NUMMSGS 3 /* number of messages */

#define TIMEOUT 10

typedef struct MsgObj {

Int id; /* writer task id */

Char val; /* message value */

} MsgObj, *Msg;

/* Mailbox created with Config Tool */

extern MBX_Obj mbx;

/* "trace" Log created with Config Tool */

extern LOG_Obj trace;

Void reader(Void);

Void writer(Int id);

/*

* ======== main ========

*/

Void main()

{

/* Does nothing */

}

/*

* ======== reader ========

*/

Void reader(Void)

{

MsgObj msg;

Int i;

for (i=0; ;i++) {

/* wait for mailbox to be posted by writer() */

if (MBX_pend(&mbx, &msg, TIMEOUT) == 0) {

LOG_printf(&trace, "timeout expired for MBX_pend()");

break;

}

/* print value */

LOG_printf(&trace, "read ’%c’ from (%d).", msg.val, msg.id);

}

LOG_printf(&trace, "reader done.");

}

/*

* ======== writer ========

*/

Void writer(Int id)

{

MsgObj msg;

Int i;

for (i=0; i < NUMMSGS; i++) {

/* fill in value */

msg.id = id;

msg.val = i % NUMMSGS + (Int)(‘a’);

LOG_printf(&trace, "(%d) writing ‘%c’ ...", id,

(Int)msg.val);

/* enqueue message */

MBX_post(&mbx, &msg, TIMEOUT);

/* what happens if you call TSK_yield() here? */

/* TSK_yield(); */

}

LOG_printf(&trace, "writer (%d) done.", id);

}

运行结果:

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(943) | 回复(0)

发表于 2008/5/14 0:53:08

0

关于投票

关于硬件中断(HWI)的两个猜想(转帖)

http://hi.bccn.net/202661/viewspace-9733.html

这两个猜想是我在用程序模拟HWI时(利用几个IRQ_开头的函数,具体查看CCS的帮助文件),多次测试之后的一点想法,不保证正确,因为TI的帮助文档没去看(因为讨厌鸟语).

使用软件是CCS3.1,利用其DSP/BIOS系统,这个系统的确方便.

=======================================================

先介绍一下几个和中断有关的寄存器

硬件中断总开关,CSR(Control Status Register)寄存器中的第0位GIE(Global interrupt enable),1表示允许中断(相当于打开大门),0表示禁止中断(关上大门)

单个中断开关,IER(Interrupt Enable Register)寄存器,其低16位对应了16个中断的开关情况,相当于16个小门,1表示门开,0表示门关

只有这两个开关都打开的时候,中断才能起作用(这是对可屏蔽中断来说的,有些中断是不能被屏蔽的,这两个开关就都没用)

中断状态寄存器,IFR(Interrupt Flag Register),记录有哪些待响应的中断,低16位对应16个中断,如果为1说明这个中断需要被响应.0表示不需要.

中断返回地址,IRP(Interrupt Return Pointer Register),记录中断调用后的返回地址,如果中断嵌套,那么后面的返回地址会覆盖前面的.不过这个不影响中断返回,我测试过中断嵌套,可以正常返回,经过查看堆栈的地址(B15寄存器是堆栈指针sp),可以看出返回地址还是放在堆栈里面了.这个IRP寄存器,应该就相当于一个窗口,让用户可以看看中断返回的地址,而程序自己在返回的时候,是不从这里读取的,而是从堆栈中读取,读取之后也不会更新IRP寄存器.IRP寄存器只有在中断生效的时候被修改.

--------------------------------------------------------------------------------------------

猜想1:

在中断服务程序(ISR,Interrupt service routine),在被调用之前,BIOS应该还偷偷做了两件事,

第一件是将全局中断开关(GIE,Global Interrupt Enable)关闭,也就是不再响应所有可屏蔽的硬件中断.(GIE是CSR寄存器的第0位)

第二件是将IFR(Interrupt Flag Register)中和这个中断对应的位置0,以等待下次使用IRQ_set(中断号)函数将这个位置1

本来这第一件事也没什么,但是奇怪的就是在ISR(中断服务程序)结束的时候,并没有自动把GIE位恢复,而是就让GIE位一直为0,那么所有的中断就都被屏蔽了,所以只能在自定义的ISR函数最后,自己手动加上IRQ_globalEnable()函数.

不知道是我猜想有误还是哪个设置没设置好.

猜想2. 关于硬件中断的执行顺序

我猜想的中断处理流程:

0.初始化的时候,先打开大门GIE(利用IRQ_globalEnable函数),接着打开需要的中断的小门(利用IRQ_enable函数),这样才能响应中断,不然出现中断的时候,只会置位IFR,而不会调用到ISR.

1.程序运行期间,出现硬件中断信号(由于只是软件模拟,没有实际的硬件,所以只能调用IRQ_set函数来虚拟一个硬件中断,这个跟实际的硬件中断是否相同还没法验证.),这个时候将IFR寄存器中对应的位置1.

2.程序每个指令周期,都检测IFR,如果发现其中有某一位为1,那么再查看GIE和IER中对应的位,如果发现门没开,那就不管,继续执行当前的指令.(具体是先看IFR还是先看GIE和IER我就不清楚了,总之结果是一样的)

3.如果门开了(GIE为1,IER中对应的位也为1),那么将下一条指令的地址,还有一个不知道什么值,都存入堆栈中,同时改变IRP的值为下一条指令的地址.这就是保护现场.

4.做好现场保护后,查看中断向量表,找到该中断对应的跳转地址,然后跳转到已经定义好的中断处理程序(ISR)

5.在运行ISR之前,先是将GIE置0,IFR中对应的位置0,IER的位不变.然后执行程序.

6.程序执行完毕后,从堆栈中找到返回的地址,返回到中断前执行的指令,继续向下执行.

我想HWI执行的顺序应该就是上面这样,另外有几点需要补充:

1.不同的HWI没有优先级之分,只要GIE,IER,IFR条件满足,即使是在一个中断中,新出来的中断会打断当前的ISR,优先执行(无论是不是同样的中断,比如INT4打断INT4,INT5打断INT4,INT4打断INT5都是可以的),这就需要在编程的时候注意了,如果不希望在处理一个中断的时候,被另一个中断打断,就应该是在中断返回之前,再调用IRQ_globalEnable函数,这样处理那些不能被屏蔽的中断,其它中断就不会响应

2.如果GIE位是0,出现中断的时候,就只会在IFR的对应位置1,如果这个时候再来一个同样的中断,这个位还是1,等到GIE为1的时候,这个中断只运行一次,而不是两次.

3.如果GIE位是0,这个时候来了几个不同的中断,在IFR的不同位置了1,那么等到GIE为1的时候,会按照从小到大的顺序执行,而不是按照中断出现的顺序执行.


 

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(926) | 回复(0)

发表于 2008/5/14 0:50:01

0

关于投票

CCS的一些问题(转帖)

http://hi.bccn.net/202661/viewspace-9666.html

CCS版本:V3.1

1.run和animate的区别

如果没有断点的话,这两个没区别.
如果有断点,那么run的时候到断点会停止,直到再次按run或者F5才继续执行.
而Animate到断点的时候,会停一小会,将所有窗口刷新一遍,然后就继续执行

一般就是在要看数据变化的时候,先把曲线画出来,然后在改变数据的循环里面设个断点,然后用animate,就能看到图片动态改变了,可以参考Help->tutorial里面的"Code Composer Studio? IDE"->"Using Debug Tools"这一个教程

2.Probe Point 和Breakpoints的区别和联系

共性:他们都会暂停程序运行

区别:

1.Probe Point暂停程序,执行一个设定的任务(如File I/O),然后继续执行程序.而BreakPoint暂停后必须手动继续(当用run的时候)
2.BreakPoints会刷新所有窗口,而ProbePoint不会
3.Probe Point可以执行一些任务(如File I/O),而BreakPoints就是纯粹的停止.

3.阻塞(blocked)和中断(interrupt)的区别和联系

共性:他们都能停止一个tsk(任务,具体见我的另一篇文章:关于tsk和mbx)的执行

区别:

1.只有tsk(任务)能被阻塞,而swi(软中断)和hwi(硬中断)不能阻塞,只能中断

2.停止的原因不一样,阻塞是在某些条件不满足的时候停止tsk,中断是因为有高优先级的事情要做而停止

3.恢复运行的条件不一样,阻塞是要等到原来不满足的条件满足后才能继续,而中断是要等高优先级的任务返回后才继续执行.

4.阻塞改变tsk的任务队列,而中断一个tsk不会改变tsk的任务队列.

举个现实的例子:
如果你在写作业,写着写着,碰到一道很难的题,你百思不得其解,这个时候写作业的这个tsk就被阻塞了,只有等到你想出来这道题怎么做,才能继续做下去.

另外一种情况,还是在写作业,突然门铃响了,你必须去开门,那写作业这个tsk就被中断了,你开完门就能回来继续写作业.

4.LOG_printf和printf的区别和联系

共性:都是用于输出一些内容,一般用于显示一些调试信息,而且可以格式化输出,比如用'%d'输出整数

区别:

1.输出目标不同,printf输出到output窗口,而LOG_printf输出到BIOS的log窗口

2.汇编指令条数不同,printf需要上万条汇编指令,而LOG_printf只要30多条汇编指令,因此LOG_printf的运行速度比printf要快的多,一般在实时系统中,都使用LOG_printf来输出,这样对系统的实时性影响才不大

3.参数个数不同,printf后面的参数个数可以有很多个(具体多少个没测试过),而LOG_printf后面最多只能有4个参数,第一个是写入的地址,第二个是字符串,后面最多加上两个格式化输出的数据,这两个数据还必须是整型,或者指针,或者常量字符串

4.可以输出的格式不同,printf有很多的格式,而LOG_printf只有有限的几种.(%d整型,%x无符号16进制数,%o无符号8进制数,%s常量字符串,%p指针)

5.LOG_printf输出的长度受设定的buffer大小限制,如果超出buffer大小,根据设置的不同,可以是停止输出,或者覆盖原来的内容

6.LOG_printf的优先级比较低,可能是在KNL层,只有系统比较空闲的时候,才会输出,而printf是必然会输出.(比如在一个i=1到100的循环中,用printf就会输出100个数,而用LOG_printf就只会输出一部分数,而且在没有碰到断点的时候,根本不会输出,因为他的优先级相当低,只有在走到断点的时候,系统才允许他执行.)

5.设置tab的宽度

1.打开"Option -> Editor -> language"
2.在左边的File Type里面选择要修改的扩展名(CCS中每种不同扩展名的文件都能设置不同的tab宽度,而不是象一般的代码编辑器,可以全局设置)
3.在右边顶部选择"Tabs/Indenting"选项卡
4.在"Tab Columns"下面的框中输入"3 5"(默认值是5 9,注意两个数值中间有空格)
5.点击OK按钮

解释一下"3 5"的意义,第一个数字等于在一行的最开头按Tab键时跳过的列数加1,第二个数减去第一个数的结果,等于除去每行最开头外的Tab的宽度.
设置成"3 5"表示如果在每行开头按Tab,缩进3-1=2列,而其它地方的缩进是5-3=2列,也就是无论什么地方Tab键的宽度都是2列.

个人觉得,CCS的这个设置Tab键宽度挺有意思的.

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1085) | 回复(1)

发表于 2008/5/14 0:44:25

0

关于投票

关于tsk和mbx(转帖)

http://hi.bccn.net/202661/viewspace-9740.html

这两个都是DSP/BIOS中的,先大概介绍一下

tsk:
    task,任务.在Scheduling中,其优先级高于IDL(背景程序),低于SWI(软中断)和HWI(硬中断).可以被软硬中断打断,也可以被其它事件阻塞(blocked),顺便说一下,SWI和HWI是不能阻塞的.(阻塞和中断的不同,见我的另外一篇文章:CCS的一些问题)

tsk和swi和hwi类似,可以调用一个函数,还可以传递多达8个参数,不同的tsk可以有15个优先级,执行任务的顺序相当于一个优先队列,如果一个tsk被阻塞,会自动将这个tsk放到同优先级tsk的后面,等待条件满足的时候执行.

tsk有个重要的函数TSK_yield,当一个tsk调用这个函数的时候,会将自己挂起(pend),将控制权交给接下来的一个tsk,让他执行.

查看不同的tsk的状态,可以选择"DSP/BIOS -> Kernel/Object View ",在出现的窗口左边点击tsk,就可以在右边看到所有tsk的状态(ready:准备好,running:运行中,blocked:被阻塞,terminal:结束)

------------------------------------------------------------------------------

mbx:
    mailbox,邮箱.在Synchronization中.一般作为不同的任务(tsk)之间传递数据.

mbx有两个属性,
Size:这里面可以存放的单个数据的大小,比如想在这里面存放int类型的数值,那么Size就设为4.
Length:里面最多能存放多少个大小为Size的数据,如果设为2,那么就能存放2个.

主要函数:

MBX_pend:

语法:
status = MBX_pend(mbx, msg, timeout);

参数:
MBX_Handle mbx; /* 句柄*/
Ptr msg;  /* 用以保存读取出来的数据的地址*/
Uns timeout; /* 超时时间*/

返回值:
Bool status; /* 如果成功,返回TRUE if successful,如果timeout设定的时间内没有读取到数据,则返回 FALSE*/

描述:

    如果mbx不为空,将复制其中的第一个数据到msg指定的地址并且返回TRUE.如果为空,这个任务将被挂起,直到MBX_post函数被调用或者timeout设置的时间到.
    如果timeout的值是SYS_FOREVER,那这个任务将一直挂起,直到MBX_post函数被调用,如果timeout的值是0,那么将立即返回FALSE.

MBX_post:

语法:
status = MBX_post(mbx, msg, timeout);

参数:
MBX_Handle mbx; /* 句柄*/
Ptr msg; /* 存放写入数据的地址*/
Uns timeout;  /*等待时间,如果超过此时间仍然不能写入,返回FALSE*/

返回值:
Bool status; /* 成功写入返回TRUE,超时返回FALSE */

描述:
    MBX_post 检查mbx中是否有空闲的位置,如果有,则将msg的内容写入mbx.同时将下一个MBX_post任务(如果有的话)设为ready状态.
    如果mbx已经满了,而且timeout等于SYS_FOREVER,这个任务将被挂起,等待MBX_pend函数被调用.如果timeout等于0,那么立即返回FALSE.如果timeout是不为0的数,这个任务将等待这么长的时间,如果还是没有MBX_pend函数被调用,则返回FALSE.

A task switch occurs when calling MBX_post if a higher priority task is made ready to run, or if there are no free message slots and timeout is not 0.

这两个东西还有不少可以测试的地方,比如tsk的优先队列是怎么排的,调用TSK_yield后排到什么地方,mbx未放满是不是能读取,未读完是不是能放入,pend和post的Timeout值有什么用,这些等下次有空研究的时候补充.

===================================================

在调试TI的一个例程tsktest(位置:X:\CCStudio_v3.1\tutorial\sim64xx\tsktest,其中的sim64xx根据你使用的DSP类型而定)的时候,花了不少时间,才终于理解了这里面任务调度的顺序.

程序中有一个mbx,能放2个8B的数据,有4个tsk,1个是读mbx,3个写mbx,这三个写mbx的tsk调用的是同一个函数,不过为了区分,调用的时候传递了一个不同的参数.程序运行的结果这里就不写了.

我经过改变mbx的length和write函数的循环写入次数后,可以确定mbx有自己的一个任务队列,当mbx满的时候,post过来的tsk会被blocked,但是这个post的动作已经是放在mbx的任务队列中,等到mbx被读空的时候,会自动开始这个post动作.如果在这个post动作后面还排着其它的动作,那么会接着执行后面的动作.

举个现实中的例子,假设有ABC三队人在排队买票,每队3人,分别叫A1A2A3B1B2B3C1C2C3.他们在售票大厅外面的广场排队,售票大厅有一个门,要进大厅的人,必须在门前排成一队,然后才能进去.从各自的队伍排到门口的队伍,按照ABC的顺序,门口的队伍每队只能有一人.大厅里面有2个窗口在卖票,如果两个窗口都有人在买,那么后面的人只能排在门口,不能进大厅.只有当在两个窗口买票的人都离开后,排在后面的前两个人才能进大厅.进入大厅的人,如果自己的队伍还有人,必须通知下一个人过来排队.

那么看一下买票和排队的顺序.

一开始A1A2到门口,大厅空,
两人进去,通知A3过来排队
A3到门口,里面满了,在门口排队,
A队已经一人在门外,就轮到B队了
B1到门口排队,排在A3后面,B组结束,
轮到C队,C1排到B1后面,C队结束.

现在开始第一轮卖票,
A1A2买完走人,大门可以进人,
A3进大厅,因为A队没人了,不用通知,
接着B1进入大厅,顺便通知B队的B2过来排队,B2只能排在C1后面.
大厅又满,禁止进人,

开始卖票,
A3B1买完走人.大门开,
C1进门,通知C2过来排队,C2排在B2后面,
B2进门,通知B3来排队,B3排在C2后边.
大厅满,

开始卖票,
C1B2买完走人.大厅空,门开,
C2进,通知C3,C3排在B3后边,
B3进大厅,B队没人,不用通知,
大厅满,

开始卖票,
C2B3买完走人,大厅空,门开
,C3进,后边没人,不用通知,
由于所有队都排完,大厅虽然没满,也开始卖票,
C3买完走人.
卖票的人等了一会,发现没人来买了,就关门回家了.

买票的顺序就是A1A2  A3B1  C1B2  C2B3  C3

再和tsk和mbx类比,三个tsk就是ABC三条队伍,每次要post一个数据,就是来门口排队,而门口的队伍就是mbx的任务队列,只有mbx中的内容被读完,才会依次启动任务队列中的任务

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(749) | 回复(0)

发表于 2008/5/13 23:32:01

0

关于投票

求助: DSP281X之DSP/BIOS的自建成功例程

俺在5402和2812上用TI自带的DSP/BIOS例程都调试未果,都是跑几下就死机.

而且例程没有涉及硬件部分...很是郁闷~~~

感觉是死在核TSK_idle()中.

有成功在DSP281X上调试成功DSP/BIOS自建例程的好心人吗???

谢谢!!!

菜农HotPower@126.com

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1190) | 回复(0)

发表于 2008/5/11 17:38:02

1

关于投票

关于DSP/BIOS的实时性问答(转载)

关于DSP/BIOS的实时性
guangjian , 2008-04-26 16:23:29
   RY你好,我最近再用C5509做音频处理,第一次使用DSP/BIOS,我用TI的TMS320AIC23采样,频率是48KHZ,我写了一个HWI用来读MCBSP和TSK用来处理,但我发现DSP只在执行HWI,根本就不执行TSK,但我把HWI mask后就开始执行TSK了,我想是不是采样太快以至于DSP只响应HWI没时间执行TSK?那么是不是就不能使用DSP/BIOS,必须裸编或者换一个更快的DSP?
RY , 2008-04-26 17:20:34

首先请确定一下DSP的工作频率是不是最快,好像5509是200MHz的。

另外不知道你的HWI由什么中断触发,是McBSP的接收中断么。如果是McBSP的中断的话,那可能一秒钟要执行48k或者96k次(双声道)HWI中断,这样DSP是吃不消的。一般都是采用DMA接收McBSP的数据,接收了一个块(例如64, 128个采样)之后再向DSP产生DMA的中断,DSP一次处理一个块。 

RE:关于DSP/BIOS的实时性
guangjian , 2008-04-26 20:57:22
 RY谢谢你的回答,我似乎有点思绪了,DSP是工作在192MHz,是mcbsp接受中断,我原先是想来一个数据就进行一次FIR处理就是sample-by-sample,这样是不是不切实际哦?如果用块处理的方式,那么输出的音频会不会有什么影响?
RY , 2008-04-26 21:39:27

sample-by-sample是行不通的。还是用DMA,用PingPong缓存的方式进行实时FIR处理吧。输出的音频会有一定的迟延,可以根据需要调整缓存的大小。

找找TI的5509DSK的例子程序学习一下吧。 

guangjian , 2008-04-26 22:28:54
 呵呵,谢谢你的回复,我在国内网站提过不少问题也在dsprelated.com上发过邮件,重来没有人回复,这是第一次有人回复我的问题还是中文的,太感动了......以后要常来你的blog 学习啊!!!!
RY , 2008-04-26 23:26:14
我学DSP的时候也是没有人问,就是看TI的例子和文档学习的,比较费劲。不过只要坚持学下来还是会很有收获的。我做过一个5509A的项目,能回答的,并且如果我有时间的话,我会帮忙的。欢迎常来。

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(838) | 回复(0)

发表于 2008/5/11 16:19:51

0

关于投票

DSP RTOS(转帖)

μITRON VDK DSP/BIOS
割込み管理 Interrupt Handling HWI Hardware interrupt manager
  PushCriticalRegion  
  PopCriticalRegion  
  PopNestedCriticalRegions  
割込み管理 Interrupt Mask Handling HWI Hardware interrupt manager
def_inh    
ena_int SetInterruptMaskBits HWI_enable
dis_int ClearInterruptMaskBits HWI_disable
  GetInterruptMask  
    HWI_restore
    SWI Software interrupt manager
    SWI_self
    SWI_create
    SWI_delete
    SWI_enable
    SWI_disable
    SWI_inc
    SWI_dec
    SWI_andn
    SWI_andnHook
    SWI_or
    SWI_oHook
    SWI_getmbox
    SWI_post
    SWI_getpri
    SWI_restorepri
    SWI_raisepri
    SWI_getattrs
    SWI_setattrs
システム状態管理 Scheduler Management  
dis_dsp PushUnscheduledRegion  
ena_dsp PopUnscheduledRegion  
  PopNestedUnscheduledRegions  
sns_dsp    
メモリプール管理 Block Memory Management MEM Memory manager
cre_mpl, cre_mpf CreatePool MEM_define, MEM_redefine
del_mpl, del_mpf DestroyPool  
get_mpl, get_mpf MallocBlock MEM_alloc, MEM_valloc, MEM_calloc
rel_mpl, rel_mpf FreeBlock MEM_free
ref_mpl, ref_mpf GetNumAllocatedBlocks MEM_stat
ref_mpl, ref_mpf GetNumFreeBlocks MEM_stat
  LocateAndFreeBlock  
システム状態管理 Thread and System Information TSK Multitasking manager
get_tid GetThreadID TSK_self
ref_tsk GetThreadStatus TSK_getsts
ref_ver GetVersion  
  GetHeapIndex  
  GetThreadHandle  
  GetThreadStackUsage TSK_checkstacks
  GetThreadStack2Usage  
  InstrumentStack  
時間管理 Thread and System Information CLK System clock manager
  GetUptime  
  SetClockFrequency  
  GetClockFrequency  
  SetTickPeriod  
  GetTickPeriod CLK_gethtime, CLK_getltime
    CLK_countspms
    CLK_getprd
set_tim    
get_tim    
システムログ機能 Thread and System Information LOG Event Log manager
vwri_log LogHistoryEvent  
vrea_log    
vmsk_log    
    LOG_disable
    LOG_enable
    LOG_error, LOG_message
    LOG_event
syslog   LOG_printf
    LOG_reset
タスク管理 Thread Creation and Destruction TSK Multitasking manager
cre_tsk CreateThread TSK_create
del_tsk DestroyThread TSK_delete
act_tsk, sta_tsk   TSK_enable
can_act   TSK_disable
ext_tsk   TSK_exit
ter_tsk    
  FreeDestroyedThreads  
  Thread Local Storage TSK Multitasking manager
  AllocateThreadSlot  
  FreeThreadSlot  
  SetThreadSlotValue TSK_setenv
  GetThreadSlotValue TSK_getenv
    HOOK_setenv
    HOOK_getenv
タスク例外処理 Thread Error Management TSK Multitasking manager
def_tex    
ras_tex DispatchThreadError  
ena_tex SetThreadError TSK_seterr
dis_tex ClearThreadError  
ref_tex GetLastThreadError TSK_geterr
sns_tex GetLastThreadErrorValue  
タスク管理 Thread Priority Management TSK Multitasking manager
chg_pri SetPriority TSK_setpri
get_pri GetPriority TSK_getpri
  ResetPriority  
rot_rdq    
タスク付属同期 Thread Scheduling Control TSK Multitasking manager
dly_tsk Sleep TSK_sleep
  Yield TSK_yield
rel_wai    
slp_tsk, wup_tsk    
sus_tsk, rsm_tsk    
can_wup    
    TSK_settime
    TSK_getname
    TSK_deltatime
    TSK_tick, TSK_itick
    TSK_stat
セマフォ Semaphore Management SEM Semaphores manager
cre_sem CreateSemaphore SEM_create
del_sem DestroySemaphore SEM_delete
ref_sem GetSemaphoreValue SEM_count
wai_sem PendSemaphore SEM_pend
sig_sem PostSemaphore SEM_post, SEM_ipost
pol_sem    
    SEM_new
    SEM_reset
周期ハンドラ Semaphore Management PRD Periodic function manager
cre_cyc    
sta_cyc MakePeriodic PRD_start
stp_cyc RemovePeriodic PRD_stop
    PRD_getticks
    PRD_tick
イベントフラグ Event and EventBit  
cre_flg LoadEvent  
wai_flg PendEvent  
set_flg SetEventBit  
clr_flg ClearEventBit  
  GetEventBitValue  
  GetEventData  
  GetEventValue  
pol_flg    
  Device Flags  
  CreateDeviceFlag  
  DestroyDeviceFlag  
  PendDeviceFlag  
  PostDeviceFlag  
  Device Driver DEV Device driver interface
    DEV_match
  OpenDevice Dxx_open
  CloseDevice Dxx_close
  SyncRead  
  SyncWrite  
  DeviceIOCtl Dxx_ctrl
    Dxx_idle
    Dxx_init
    Dxx_issue
    Dxx_ready
    Dxx_reclaim
    PIP Buffered pipe manager
    PIP_alloc
    PIP_free
    PIP_reset
    PIP_get
    PIP_put
    PIP_peek
    PIP_getReaderAddr
    PIP_getReaderNumFrames
    PIP_getReaderSize
    PIP_getWriterAddr
    PIP_getWriterNumFrames
    PIP_getWriterSize
    PIP_setWriterSize
    SIO Stream I/O manager
    SIO_bufsize
    SIO_create
    SIO_ctrl
    SIO_delete
    SIO_flush
    SIO_get
    SIO_idle
    SIO_issue
    SIO_put
    SIO_reclaim
    SIO_segid
    SIO_select
    SIO_staticbuf
メッセージバッファ Message  
cre_mbf CreateMessage  
del_mbf DestroyMessage  
rcv_mbf PendMessage  
snd_mbf PostMessage  
  ForwardMessage  
ref_mbf MessageAvailable  
  GetMessageDetails  
  SetMessagePayload  
  GetMessagePayload  
  FreeMessagePayload  
  DestroyMessageAndFreePayload  
  GetMessageReceiveInfo  
  InstallMessageControlSemaphore  
データキュー   QUE Queue manager
cre_dtq   QUE_create
del_dtq   QUE_delete
snd_dtq   QUE_put
rcv_dtq   QUE_get
    QUE_enqueue
    QUE_dequeue
    QUE_empty
    QUE_head
    QUE_insert
    QUE_new
    QUE_next
    QUE_prev
    QUE_remove
メールボックス   MBX Mailboxes manager
cre_mbx   MBX_create
del_mbx   MBX_delete
snd_mbx   MBX_post
rcv_mbx   MBX_pend
ミューテックス   LCK Resource lock manager
cre_mtx   LCK_create
del_mtx   LCK_delete
loc_mtx   LCK_post
unl_mtx   LCK_pend
ref_mtx    
システム構成管理    
def_exc    
att_ini    
vatt_ter    
システム状態管理    
loc_cpu    
unl_cpu    
sns_loc    
sns_ctx    
sns_dpn    
vsns_ini    
    RTDX Real-time data exchange manager
    RTDX_channelBusy
    RTDX_CreateInputChannel
    RTDX_CreateOutputChannel
    RTDX_disableInput
    RTDX_disableOutput
    RTDX_enableInput
    RTDX_enableOutput
    RTDX_isInputEnabled
    RTDX_isOutputEnabled
    RTDX_read Read
    RTDX_readNB
    RTDX_sizeofInput
    RTDX_write
    STS Statistics object manager
    STS_add
    STS_delta
    STS_reset
    STS_set
    SYS System services manager
    SYS_abort
    SYS_atexit
    SYS_error
    SYS_exit
    SYS_printf, SYS_sprintf, SYS_vprintf, SYS_vsprintf
    SYS_putchar
    TRC Trace manager
    TRC_disable
    TRC_enable
    TRC_query
1

系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1033) | 回复(0)

发表于 2008/5/10 19:25:03

0

关于投票

DSP2812之DSP/BIOS转帖资料列表

  • 求助: 如何做DSP281X之DSP/BIOS菜鸟??? 2008-5-9 0:53:04
  • DSP/BIOS在数据采集程序设计中的应用(转帖) 2008-5-9 1:03:26
  • 操作系统 (OS/RTOS)(转帖) 2008-5-9 1:06:13
  • DSP/BIOS环境下的数据通信(转帖) 2008-5-9 1:16:29
  • DSP/BIOS在数字图像处理中的应用(转帖) 2008-5-9 1:19:36
  • 深入DSP/BIOS的API函数- SWI模块(转帖) 2008-5-9 1:22:08
  • TMS320C55x嵌入式实时多任务系统DSP/BIOS II(转帖) 2008-5-9 1:25:23
  • DSP/BIOS在电能质量监测终端中的应用(转帖) 2008-5-9 1:28:35
  • 开发DSP/BIOS程序(转帖) 2008-5-9 2:03:04
  • DSP/BIOS中的线程(转帖) 2008-5-9 2:04:32
  • DSP/BIOS实时操作系统介绍(转帖) 2008-5-9 2:08:50
  • 中断在TMS320C54x系列DSP中的应用(转帖) 2008-5-9 2:13:42
  • DSP/BIOS与main()函数关系(转帖) 2008-5-9 2:15:54
  • DSP/BIOS 实现实时数据调试和交换(转) 2008-5-9 2:19:53
  • DSP/BIOS中的I/O设备驱动编程技术(转帖) 2008-5-9 2:27:47
  • 郁闷!!!google也知道俺和hotpover的"关系" 2008-5-9 2:38:08
  • 模块化编程(转帖) 2008-5-9 6:53:35
  • 深入DSP/BIOS的API函数 - LOG模块(转帖) 2008-5-9 7:11:31
  • 实时操作系统DSP/BIOS(转帖) 2008-5-9 7:17:26
  • 谈谈DSP实时多任务操作系统(转帖) 2008-5-9 7:19:31
  • 实时操作系统DSP/BIOS在DSP开发中的应用(转帖) 2008-5-9 7:29:42
  • 实时操作系统在探地雷达信号处理中的应用(邓怀东,杨万海) 2008-5-9 7:34:24
  • TMS320VC5410 DSP的DSP-BIOS扩展寻址的实现(转帖) 2008-5-9 7:38:51
  • 系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

    点击查看原文

    发表评论 阅读全文(1777) | 回复(0)

    发表于 2008/5/9 19:08:19

    0

    关于投票

    开发DSP硬件驱动程序的一种方法(转贴)

    开发DSP硬件驱动程序的一种方法
    张 行,雷 勇

    (四川大学电气信息学院 四川 成都610065)

    l 引 言

    目前,TI公司的DSP应用很广泛,随着DSP的功能越来越强大,片上外设种类及应用日趋复杂。传统的DSP程序开发包含两方面程序:即配置、控制、中断等管理DSP片内外设、接口的硬件相关程序和基于应用的算法程序。这样的系统结构,应用程序与硬件相关程序紧密的结合一起,限制了程序的可移植性和通用性,软件开发总要从零开始,存在诸多重复工作。一旦硬件平台有变化,往往与硬件程序捆绑一起的应用程序也需改动,代码的维护性和
    可移植性均不高。

    通过建立硬件驱动程序的开发模式,可使上述现象得到改善。因此,本文介绍一种开发TI公司DSP片内及片外硬件外设驱动程序的方法,并以C5000 DSP的McBSP/DMA及TMS320C5509的USB驱动程序开发为具体对象,介绍这种方法的应用。

    2 基于DSP/BIOS的IOM硬件驱动

    在CCS应用环境中集成的实时操作系统DSP/BI-OS[1]中,硬件驱动程序最终以函数库的形式被封装起来,应用程序可不关心底层硬件外设的具体操作,通过调用DSP/BIOS相关的标准API与不同外设接口。接口按统一标准定义,即在DSP/BIOS中创建并配置硬件设备驱动
    模块为IOM(I/O Mini-driver)模式。

    IOM[2]是DSP/BIOS的设备驱动模块的一种接口方式,配置硬件设备驱动模块为IOM模式可在DSP/BIOS的图形化界面(GUI)中方便完成。IOM模式将设备驱动程序分为两个层次:上一层是"类"驱动程序(class driv-er),这部分程序负责对存储缓冲区管理、由DSP/BIOS各类标准的API函数与应用程序接口,与设备硬件无关。下一层是"迷你"驱动程序(mini-driver),这部分程序集成了实际硬件相关的代码。IOM接口将"迷你"驱动程序与"类"驱动程序联系一起,包括定义I/O数据包(IOM_Packet)以提交"迷你"驱动程序读写,定义功能函数包(IOM Fxns)完成相关初始化,打开或关闭通道,提交I/O数据传输与控制等任务,确保"迷你"驱动程序与"类"驱动程序运行协调一致。

    "类"驱动程序直接在应用程序中出现,并且根据数据输入/输出的处理方式不同,有相应"类"驱动程序。主要是3种:流输入输出型"类"驱动(SIO)、管道型"类"驱动(PIP)和通用输入输出型"类"驱动(GIO)。

    其中,SIO"类"驱动由两部分组成:SIO模块和DIO适配模块(Adapter),前者负责创建通道、数据流输入/输出,DIO提供负责缓冲管理、信号同步、将API及参数与下层"迷你"驱动程序接口;PIP"类"驱动由两部分组成:PIP模块和PIO适配模块(Adapter),前者创建管道、数据管道输入/输出,PIO提供负责缓冲管理、信号同步、将API及参数与下层"迷你"驱动程序接口。GIO"类"驱动是一种通用输入输出接口,调用的API函数,可通过阻塞线程读写数据,直接与"迷你"驱动通信。

    SIO,PIP,GIO模块集成在DSP/BIOS中,SIO通道、PIP管道可在DSP/BIOS的输入输出模块图形化界面(GUI)中静态设置并创建,也可以在应用程序中动态创建。DIO,PIO适配模块(Adapter)创建在DSP/BIOS的设备驱动模块图形化界面(GUI)中完成。

    由上可见,"类"驱动程序均为标准的API函数,故编写驱动程序的重点是"迷你"驱动程序方面。"迷你"驱动通过创建统一接口标准的功能函数包(IOM Fxns),应用程序就可以由DIO适配模块或PIO适配模块或GIO"类"驱动调用"迷你"驱动,控制底层硬件设备。这些统一接口标准的功能函数包括:

    mdBindDev:设备与"迷你"驱动绑定函数;

    mdControlChan:设备通道控制函数;

    mdCreateChan:设备通道创建函数;

    mdDeleteChan:设备通道删除函数;

    mdSubmitChan:按IOM数据包命令执行函数;

    mdUnBindDev:设备从"迷你"驱动释放函数。

    IOM数据包是其中一关键数据结构,为IOM驱动程序内部数据的输入输出服务。应用程序本身不会涉及IOM数据包访问,是IO适配模块、PIO适配模块或GIO"类"驱动通过他访问"迷你"驱动层,其中,数据结构的cmd项,即"类"驱动命令"迷你"驱动的mdSubmitChan功能函数执行硬件设备的读写等操作。"迷你"驱动完成相应操作,通过回调函数后向上返回该数据包。

    3 McBSP/DMA驱动程序开发

    这是基于C5000系列DSP的McBSP和DMA硬件驱动开发。系统以TMS320VC5410为CPU,TLC320AD50C为音频编解码芯片,TLC320AD50C与DSP的McBSP0通道接口,数据传输采用DMA方式。

    在传统的软件开发结构中,应用程序一般通过DMA中断服务程序控制硬件设备及数据管理。传统的软件开发结构如图1所示。

    在本文推荐的软件开发结构中,硬件设备驱动程序与应用程序隔离开,他们之间通过DSP/BIOS的API接口,包括硬件设备初始化参数的传递。本系统软件开发结构如图2所示。

    具体开发过程如下:

    (1)IOM驱动程序

    mdBindDev在DSP/BIOS启动时调用,具体完成硬件设备初始化参数传递、获取McBSP及DMA资源,McBSP及DMA的初始化参数用CSL配置,注意McBSP使用的是通道O。mdCreateChan在应用层与硬件设备创建两个逻辑通道,即DMA接收、发送通道。分别设置初始化参数。mdSubmitChan按IOM数据包数据结构的cmd项,命令"迷你"驱动执行向硬件设备的IOM写操作,即通过McBSP0输出数据。相应工程编译链接生成驱动库函数,完成IOM驱动程序。

    (2)DMA/McBSP应用程序

    在应用工程中,首先在DSP/BIOS配置工具中User-Defined Devices项进行"迷你"驱动程序注册,命名为"co-dec"。属性如图3(a)所示。注册信息中设置了驱动程序的初始化函数、IOM函数包指针、设备参数指针的名称。本应用采用IOM驱动程序的流输入输出"类"驱动(SIO/DIO),DIO适配模块与上述"迷你"驱动程序"codec''接口,DIO适配模块在DSP/BIOS配置工具中添加,命名为"dio codec",属性如图3 (b)所示。

    本应用选择DMA通道4,5,设置TLC320AD50C的4个控制寄存器初始化参数,即"迷你"驱动程序注册信息的设备参数指针所指内容。

    然后,应用程序通过调用DSP/BIOS的API,动态创建DMA/McBSP输入、输出通道,如:

    SIO输人、输出通道均采用双缓冲管理。获取双缓冲资源,管理缓冲数据的工作,同样由SIO相关API完成,API的使用方法可参见参考文献中所列手册。

    4 USB驱动程序开发

    这是基于C5000系列DSP(TMS320C5509A)的USB硬件驱动开发。TMS320C5509A内部集成符合USB 2.0标准的全速模式USB接口。SIE[3](Serial Interface En-gine)负责将数据按照USB物理电平信号串行转并行输入或并行转串行输出,并且具有错误校验机制。UBM(USB
    Buffer Manager)负责数据缓冲管理,管理数据在SIE和缓冲RAM的输入输出,CPU或USB的DMA控制器在缓冲RAM收发数据。

    本硬件驱动的软件开发结构与上述McBSP/DMA硬件驱动开发类似,上层为"类"驱动,即DSP/BIOS GIO,SIO,或PIP模块,提供针对USB的"迷你"驱动的各种输入输出请求。"迷你"驱动是基于DSP/BIOS关于USB模块的CSL(Chip Support Library),调用CSL的API完成底层硬件各种复杂操作。

    (1)IOM驱动程序

    C5509 USB mdBindDev在DSP/BIOS启动时调用,完成USB初始化参数传递,中断向量设置,初始化USB模块;C5509 USB mdControlChan接受如SIOcontrol等"类驱动"命令,可复位USB数据通道,连接主机USB接口等工作;C5509 USB mdCreateChan创建某个USB端点的数据通道及配置数据传输方向;C5509 USB mdSubmitChan负责USB数据流输入输出管理。

    (2)USB应用程序

    在DSP/BIOS配置工具中User-Defined Devices项进行"迷你"驱动程序注册,命名为"usb"。属性如图4(a)所示。本应用也采用流输入输出(SIO/DIO),DIO适配模块与上述"迷你"驱动程序"usb"接口,DIO适配模块在DSP/BIOS配置工具中添加,命名为"dio_usb",属性如图4(b)所示。

    应用程序动态创建USB的某端点为输入、输出通道,如:

    由上可知,应用层"类"驱动程序开发的通用性是很强的。

    5 结 语

    本文推荐的这种DSP硬件驱动开发方法,通过构建应用程序与硬件外设输入输出的统一数据接口,将接口代码层次化。当硬件设备改动后,应用程序可不做修改,应用程序的通用性、可移植性大大加强,硬件驱动程序也具有反复利用的特点。

    系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

    点击查看原文

    发表评论 阅读全文(697) | 回复(0)

    发表于 2008/5/9 7:38:51

    0

    关于投票

    TMS320VC5410 DSP的DSP-BIOS扩展寻址的实现(转帖)

    摘  要:通常C5410程序空间被限制在64K地址空间内,当应用程序超出64K时,则需增加目标系统存储区和附加逻辑,实现对系统的扩展。本文介绍如何配置及使用DSP/BIOS实现扩展寻址功能,并分析了API调用和中断触发过程,最后以DSP并行自举引导方式实现程序的脱离仿真运行。

         关键词:DSP/BIOS  扩展寻址  API  并行自举引导

    字串6

         一 DSP/BIOS 接口 字串3

         DSP/BIOS提供了基本的运行服务,如应用程序实时分析功能,时钟周期函数,I/O模块,优先级的任务调度等。DSP/BIOS提供支持汇编和C语言的API接口函数,这些API函数绝大部分都是用汇编语言实现的,因此汇编语言可以直接调用API,而C语言调用API则通过DSP/BIOS的C封装器。应用程序通过调用API函数来使用DSP/BIOS,如软件中断、背景线程和中断服务程序等都可以调用DSP/BIOS的函数。当DSP/BIOS要调用用户的C语言函数时则要通过函数链接器,如图一所示。

    字串3

    字串2

        二 扩展程序空间

    字串7

        C5410的16位地址空间逻辑上被划分为两块,低地址块定义为公共区(或未映射区),高地址块为映射区(或扩展区)。划分这两块的地址由目标系统的外部寄存器和存储区决定的。值得注意的是,C5410的数据区没有扩展存储区。

    字串4

        用户可以在映射区上定义多个物理存储区,它们覆盖整个映射区,但彼此空间不重叠。当使用存储区的扩展页时,内部16位地址空间被扩展为32位的地址来寻址,高16位代表扩展页的数目,低16位代表局部的16位地址。如使用扩展程序映射存储器(XPC)来存放扩展页码,XPC存放在数据空间地址为0x1E的位置,它的值要与.CMD链接文件中定义的扩展页码保持一致。如图二所示的一个扩展3页的程序区结构图。公共区的范围是0x0000-0x7FFF;映射区的范围0x8000-0xFFFF,映射区为第一页,XPC要为0才能访问该区;映射地址空间存放两个扩展页,扩展程序映射寄存器限定了映射地址,使得每个扩展页的每个单元具有唯一的地址。当访问扩展页时,映射区将被覆盖。
    C5410的DSP/BIOS不仅支持64K程序页内的“近”访问模式,而且支持扩展程序的“远”访问模式,只需设置DSP/BIOS的属性即可实现扩展程序的“远”访问。要注意的是汇编语言写的API只能在PAGE0页调用,而C语言写的API可以在任何页面调用。

    字串2

        三 中断 字串5

        当中断产生时,DSP的内部结构机制只能够保存低16位页内的局部地址,而扩展寻址时程序地址需要23位,这就意味着调用和返回时将超出64K(16位地址)的范围,因此必须考虑怎样保存和恢复扩展地址。解决的方法是用中断服务程序(ISR)保存XPC的值,确保能正确的计算中断向量,为此中断向量表必须方在公共区或映射区的64K程序页面上。当DSP/BIOS在公共区上时,ISR可以放在任何位置;如果不在公共区上,则ISR必须放在PAGE0上。
    当OVLY=0时,为了能保证中断正确的执行,必须在每一个页面上都要有中断向量表的拷贝。当OVLY=1时,只须在公共页面上(如0x7F80)作一份中断向量表的拷贝就可以了。

    字串7

        四  程序实例 字串5

        通过一个简单的例子介绍DSP/BIOS如何实现程序地址的扩展。本例中有三个软中断:时钟中断PRD_POST_SWI,每100毫秒触发SWI_PAGE1(或SWI_PAGE2)一次;SWI_PAGE1,完成值XF高;SWI_PAGE2,完成值XF低。三个软中断执行的函数分别放在程序空间的不同页面上,即PRD_Post_SWI放在公共页面上(XPC=0),Page1Func 和Page2Func分别放在扩展程序页面 1和2上,XPC为1和2。 字串1

    #include "testfarcfg.h"
    #pragma CODE_SECTION(Page1Func, ".FarPage1")
    #pragma CODE_SECTION(Page2Func, ".FarPage2")
    int pagenumber;
    void main(void)       {pagenumber=0;}
    void Page2Func (void)  { asm(" rsbx xf");  pagenumber="0";}
    void Page1Func (void)  { asm(" ssbx xf");  pagenumber="1";}
    void PRD_Post_SWI(void)
    { if(pagenumber)   SWI_post(&SWI_PAGE2);
    else   SWI_post(&SWI_PAGE1);
    }

    字串3

        五 DSP/BIOS的配置

    字串6

        如要把DSP/BIOS的程序映射到扩展程序空间,需要对其配置,步骤如下。 字串9

      1.     建立一个新配置文件。启动仿真软件(Code Composer Studio),建立testfar.pjt工程,通过File中的New -- DSP/BIOS Config创建配置文件,选用sd54.cdb54X EVM)配置。

    字串5

      2.     添加软件中断。右键打开软件中断管理器(Software Interrupt Manager,选择Insert SWI,创建SWI_PAGE1,属性配置为:function:_Page1Funcpriority:2。同样的方法创建function_Page2FuncSWI_PAGE2。右键打开定时器功能管理器(Periodic Function Manager),选择Insert PRD,创建PRD_POST_SWI,属性为:period(ticks):50function :_ PRD_Post_SWImode: continuous

    字串5

      3.     设置OVLY位为1。打开System中的Global Settings的属性页,在PMST(60)项中填入使第5位为1的值,如MP=1,填入0x60 字串6

      4.     指定“远”调用模式。在Global Settings属性页面的Function Call Model选项中选择far,使全局变量CALLMODEL设置为far

    字串2

      5.     在公共区中重新分配中断向量表。双击System中的MEM,右键打开VECT 的属性页,在base项中填入新的基地址,如0x7F80 字串1

       6.       配置扩展程序地址段。对于54X EVM评估板,已经有了2个扩展程序段EPROG0EPROG1(如果没有的话,则需添加这两个段,选择Insert MEM ,添加两个扩展程序段,重命名为EPROG0EPROG1)。EPROG0属性为base:0x8000len:0x4000 ,勾去create a heap in this memory选项,space: codeEPROG1EPROG0的属性不同之处base:0x18000。加入一个新的扩展程序段EPROG2,属性为base:0x28000len:0x4000 space: code

    字串1

       7.       将目标代码链接到扩展程序段。pragma伪指令告诉编译器的预处理器如何处理函数,语法为 #pragma CODE_SECTION(Page1Func, ".FarPage1"),在名为".FarPage1"段中分配Page1Func的程序空间。这样目标代码Page1Func就被链接到.FarPage1段的区域。

    字串4

       8.      创建一个新的链接命令文件(testfar.cmd)。其主要的功能是把testfarcfg.cmd链接进去,并且告诉链接器把不同目标函数放在不同的扩展页面上。如:

    字串6

    -ltestfarcfg.cmd 字串9

    SECTIONS

    字串6

    { .FarPage1: {} > EPROG1 PAGE 0

    字串4

    .FarPage2: {} > EPROG2 PAGE 0

    字串1

    } 字串1

       9.     保存配置文件为testfar.cdb,然后将testfar.cdbtestfar.cmd testfar.c文件加入工程中。 字串8

       10.   配置编译器和汇编器的支持远模式代码。打开菜单Project中的Build Options窗体,选择Compiler属性页,点击Category中的Advanced选项。勾选Use Far Calls -mf)(C548 and higher)。此选项指定产生远调用代码模式。

    字串4

    11.   调试器内描述并激活扩展寻址功能。仿真器的调试软件需要激活扩展寻址功能,才能支持长指令的执行和扩展存储区的读/写,也可方便地对使用扩展寻址的程序进行调试。所以使用通用扩展函数GEL_XMDef()来定义映射寄存器(如XPC)和映射扩展空间的首地址。如当OVLY=1,扩展程序区从0x8000开始,7XPC放置在数据空间的0x1E单元中。把下面这两条语句加入C5410.gel文件的C5410_Init()函数中。

    字串1

    GEL_XMDef(0,0x1e,1,0x8000,0x7f); 字串6

    file://0/:映射程序空间;0x1eXPC的地址;1XPC 在数据空间中; 字串9

    file://0x8000/:映射首地址;0x7fXPC的大小,128页; 字串2

    GEL_XMOn(); //使能扩展地址映射
    字串9

    DSP/BIOS函数调用和中断触发过程分析

    字串8

    1DSP/BIOS API 调用过程,如图三中的实线所示。 字串9

    字串2


    点击放大

    字串7

    产生PRD_F_swi,短调用C语言封装器的PRD_F_swi ()XPC=0字串6

    C语言封装器触发PRD_POST_SWI时钟软中断,然后检测到SWI_PAGE1,产生执行DSP/BIOS调度表的分支。

    字串6

    DSP/BIOS调度表保存当前PRD_POST_SWI上下文信息,调用函数链接器以便触发SWI_PAGE1字串3

    函数链接器远调用SWI_PAGE1,执行相应的函数(Page1Func),XPC=1字串6

    SWI_PAGE1执行结束,远返回函数链接器。

    字串8

    函数链接器又返回到DSP/BIOS调度表。 字串7

    DSP/BIO调度表恢复PRD_POST_SWI信息,返回到C语言封装器。 字串7

    执行上述⑴和⑵,第⑶步触发SWI_PAGE2,函数链接器远调用SWI_PAGE2,执行函数(Page2Func),XPC=2字串8

    SWI_PAGE2执行结束,远返回函数链接器,然后顺序执行上述的第⑹和⑺。

    字串6

    2、中断触发过程,如图三中的虚线所示。 字串7

    PRD_F_swi发生,CPU把当前的16PC指针压入堆栈,在中断向量表中取指令。 字串2

    中断向量程序把当前的XPC压入堆栈,产生一个配置中断服务程序的分支指令,执行中断服务程序,XPC=0

    字串6

    中断服务程序调用HWI_enter,触发PRD_POST_SWI软中断,接着调用HWI_exitHWI_exit检测到SWI_PAGE1准备好,开始调用DSP/BIOS调度表。

    字串7

    DSP/BIOS调度表保存当前的上下文信息,调用函数链接器以便触发SWI_PAGE1

    字串3

    函数链接器远调用SWI_PAGE1,执行相应的函数,此时XPC=1SWI_PAGE1执行完,远返回调用函数链接器,再到DSP/BIOS调度表,调度表恢复上下文信息,把程序指针交给PRD_POST_SWI软中断。PRD_POST_SWI结束。

    字串3

    执行上述的①、②后,第③步检测到SWI_PAGE2准备好,第④步触发SWI_PAGE2,第⑤步函数链接器远调用SWI_PAGE2XPC=2,顺序执行下去直到PRD_POST_SWI结束。

    字串2

       七 并行自举引导的实现
       C5410上电复位后,检查到DSP处于MC(微计算机)工作方式,从片内ROM的0FF80h起执行程序。0FF80h地址存放的是中断向量表,它实为一条分支转移指令(BD  0F800h),使程序跳转至0F800h执行自举引导程序(Bootlooader)。并行自举引导是DSP举引导常用的一种方式,Bootlooader首先从地址为0FFFFh的I/O口读取自举表首地址的内容,如果此内容不符合8位或16位的引导方式,就从地址为0FFFFh的数据存储器读取,进行8位或16位并行自举引导。若要完成自举引导功能,必须建立正确的自举表。
    字串2


    自举表的内容不仅包括了欲加载的各段代码,而且包括各段代码长度、各代码段存放的目标地址、程序入口地址等信息。自举表可由hex500格式转换器自动生成。hex500是一个通用程序,它将公共目标文件格式—COFF文件转换成各种FLASH(或EPROM)的编程格式。因此,在使用hex500工具之前,首先把testfar.pjt进行编译、链接,生成COFF格式的testfar.out文件,然后再通过设置适当的选项生成用户所要求的自举表,如转换文件的格式,外部数据存储器的字宽等选项。把testfar.out转换为testfar.hex文件后,再使用C语言编写一个转换程序,将hex文件转换为DSP烧写FLASH程序能识别的文件格式。根据文件信息就可以完成自举表的内容,如表一。最后使用FLASH的擦除、读和写等操作指令把表一的内容烧入FLASH中。DSP上电复位,便可完成并行自举引导。

    字串4


    整个引导过程为:上电复位后,判断MP/MC=0 处于微计算机工作方式,从片内ROM的0FF80h处执行中断向量表的分支转移指令(BD 0F800h),使程序跳转至0F800h处执行自举引导程序,自举引导程序完成初始化后读取数据空间的0FFFFh地址的内容,找到自举表首地址8000h,从8000h处开始读取内容,首先是16位自举标记(10AA),然后分别是寄存器SWWSR及BSCR的内容,程序入口地址,代码段长度,存放代码段的目标地址等信息,最后根据这些信息把FLASH的8008H到A594H的程序搬运到片内RAM中,然在把Page1Func和Page2Func的代码搬运到0x180000和0x28000处,最后跳转至片内RAM的26FDH,即PC为26FDH,XPC为0,开始执程序。完成程序的并行自举过程。
    字串4

    点击看大图 字串5

     

    系统分类: DSP  |  用户分类: DSP/BIOS  |  标签: 无标签  |  来源: 转贴  | 

    点击查看原文

    发表评论 阅读全文(567) | 回复(0)

    23Next >Total , Page /