320C(精选10篇)
320C 篇1
摘要:结合TMS320c6455针对TI C6000系列DSP网络开发工具NDK进行详解研究。描述了利用NDK开发DSP6455网络应用的程序过程和实际应用中需要注意的问题, 对于开发DSP 6455的网络应用有实际的指导价值。
关键词:TMS320C6455,NDK,TCP/IP
1 引言
在高端DSP设备上进行网络通信已经成为一种技术发展潮流。TI公司的C6000系列芯片是面向高速信号处理的高端芯片, 主频高, 集成了以太网网口, 其推出的NDK网络开发工具可以快速地开发出网络应用程序, 缩短产品开发周期, 并且其性能很优异[1]。本文系统地介绍了在TMS320C6455上利用NDK开发网口过程, 以及影响网口性能的因素。
2 NDK的结构
TI公司结合C6000芯片推出的TCP/IP NDK (Network Developer’s Kit) 开发套件, 其主要组建包括: (1) 支持TCP/IP协议栈程序库。主要包含的库有:支持TCP/IP网络工具的库, 支持TCP/IP协议栈与DSP/BIOS平台的库, 网络控制以及线程调度的库; (2) 示范程序。其中主要包括DHCP/Telnet客户端, HTTP数据服务器示范。 (3) 支持文档。包括用户手册、程序员手册和平台适应手册。NDK采用紧凑的设计方法, 实验了用较少的资源耗费来支持TCP/IP。从实用效果来看, NDK仅用200-250K程序空间和95K数据空间即可支持常规的TCP/IP服务[2]。
使用NDK相对于操作系统和底层硬件是透明, 这主要是OS.LIB提供与操作系统DSP/BIOS的接口和HAL.LIB提供对硬件的支持来完成的。在NDK的TCP/IP协议中STACK.LIB包含了顶层套接字到底层链路层的所有功能, NETCTRL.LIB在整个协议栈中起关键作用, 协调操作系统和底层硬件驱动, 管理所有网络事件, NETTOOL.LIB提供配置网络的各种服务[2]。
3 NDK在DSP/BIOS下的设置和初始化
DSP/BIOS是TI开发的实时微型操作系统, 支持实时分析、线程管理、调度软件中断、周期函数以及外部硬件中断与各种外设的管理。使用DSP/BIOS所有与硬件有关的操作都必须借助操作系统提供的函数完成, 应避免直接控制硬件资源。基于DSP/BIOS的程序与传统开发过程是不同的。用户编写的程序由DSP/BIOS调度, 不再按标写的次序顺序执行。同样开发基于DSP/BIOS的网络应用程序也必须遵循一些原则[3]。在DSP/BIOS下使用NDK必须注意以下几点。
(1) 必须在tcf文件中为HAL创建一个周期为100ms的PRD函数, 用来驱动ll Timer Tick () 函数, 如图1所示; (2) 在tcf文件中创建两个钩子函数NDK_hook Init () 和NDK_hook Create () 。因为OS需要钩子函数为TCP/IP堆栈加载和保存私人变量指针, 如图2所示; (3) 把工程项目的Include Searching Path指向NDK安装NDK安装目录下的inc文件夹; (4) 为了保证使用NDK的工程项目能正确编译, 在CCS的Link Order要按照一定的顺序添加库文件, 推荐的顺序是:NETCTRL.LIB、HAL_xxx.LIB、STACK.LIB、OS.LIB; (5) 在使用NDK的过程中, OS和HAL会创建三个内存段, 分别是PACKETMEM、MMBUFFER、OBJMEM, 必须在cmd文件中为这三个段在内存中分配存储空间; (6) 至少要使用32K的cache, 否则应用程序会产生不可预料的错误。如图3所示, cache在BIOS中设定为64K。
堆栈初始化过程: (1) 使用NC_System Open () 。该函数为所有网络应用程序建立堆栈和内存环境; (2) 使用Cfg New () 。该函数会创建一个配置句柄, 利用该句柄使用Cfg Add Entry () 函数可以添加DHCP、DNS、HTTP等服务和配置SOCKET缓冲区大小与ARP超时参数; (3) 使用NC_Net Start () 。该函数根据前面的配置参数启动网络, 并创建三个回调函数。分别是网络启动时只能运行一次的函数、网络被关闭时只能运行一次的函数、当IP地址改变时运行的函数。通常会在启动函数里面创建自己的应用程序线程, 在关闭函数里删除创建的应用程序线程。
4 网络应用程序的开发
本NDK网络通信实在DSP6455芯片上开发的。因为NDK的API和Windows SOCKET API函数名和功能都是十分相似, 所以开发起来还是比较容易的。下面程序固定配置IP, UDP协议传输数据, 如下代码所示。首先初始化DSP6455的PLL、网口驱动等。主要通过设置寄存器PERCFG0和PERCFG1;其次进行NDK驱动, 程序可以参考TI自带的Stack Test任务设置;最后在动态TSK中创建用户应用网络程序。
每次向PC机传送码流最好不要超过1380Bytes, 这是由最大传输单元决定的, 对于大于1380Bytes以上的码流可以采取分割的方法分批传送, 并且在每次传送之后调用TSK_sleep () 使socket底层传输缓冲区有缓冲时间, 这样可以有效防止丢帧。
5 NDK开发注意点和性能影响因素
用户在开发NDK时经常会参考TI自带的NDK开发例程。通常跑单个网络TSK系统能够稳定运行。但是, 当系统中还有很多其它TSK, 特别是有大数据量信号处理的多线程TSK处理系统时。必须设置好整个工程 (project) 的空间分配单元。主要涉及到总stack, heap;各个任务TSK的stack。NDK占用了很大一部分heap资源。如果不能很好地合适分配空间, 则整个程序容易发生栈溢出, 致使程序跑飞。一般如果发生空间冲突或者溢出情况, 需要修改总stack大小和heap大小。
DSP6455上影响NDK性能的因素主要有以下几个因素。
socket API:NDK既支持基于缓冲区的典型socket, 也支持非拷贝的数据包socket, 甚至非拷贝的直接接收的TCP数据流。性能随着所采用的策略而变化。
socket缓冲区:socket缓冲区影响TCP发送和接收的窗口大小, 并且决定每次发送发送数据流大小, 这对网络性能有很大的影响。
CPU cache:cache的大小对网络性能有巨大的影响。一般要求最低32K。但是如果太大有影响DSP的内存减小, 导致整个DSP应用程序内存空间不足。
网络硬件设备:以太网硬件设计的好坏直接影响DSP的网络接口的速度。
6 结语
TI推出的NDK网络工具不仅可以使技术人员快速开发基于DSP的网络应用程序, 而且具有十分可靠的性能, 这使得TMS320C6455芯片完全可以胜任大数据量网络传输的要求。
参考文献
[1]Texas Instrument.TMS320c6455 Fixed-Point Digital Signal Processor.
[2]Texas Instrument.TMS320C6000 TCP/IP Network Developer’s Kit (NDK) User’s Guide.
[3]Texas Instrument.TMS320C6000 Platform Porting Guide.
320C 篇2
摘要:RSA算法是基于数论的公钥密码体制,是公钥密码体制中最优秀的加密算法。本文介绍RSA算法的基本原理以及用以TMS320C5402芯片为核心的硬件去实现RSA算法;提供了应的硬件、软件的接口设计,取得了较好的安全性和速度性能。关键词:DSP RSA算法 公钥密码体制 模运算
引言
在当今的电信时代,由于采用大规模的电子计算机对数据进行处理,使得信息的传递大大加速,但是,也随之出现了令人最为担心的问题,就是信息的安全性。对信息进行保护的方法就是数据加密,通过对网络上传输的数据和系统内存储的数据进行加密,可以大大提高网络和信息的安全性。以较高的安全性而被广泛采用的RSA公钥密码体制,在现代安全性制中占有重要地位。RSA算法由于在加密和解密过程中要进行大量的数值运算,存在难以实现的问题;而采用纯软件的方式实现RSA算法,虽然降低了解密的强度,但却增加了运算时间。本文采用一种软硬件相结合的方式来实现RSA算法。
DSP(Digital Signal Processor)芯片,即数字信号处理器,是一种特别适用于进行实时数字信号处理的微处理器。TMS320C54x系列是一种有特殊结构的微处理器,其内部采用程序与数据分开的哈佛结构;具有专门的硬件乘法器,广泛采用流水线操作,使用特殊的DSP指令,可以用来快速地实现各种数字信号处理算法。正因为TMS320C54x系列的这些特点,比较适合RSA算法使用,实现对串行数据的加、解密。
1 RSA算法
RSA算法是由Rivest、Shamir与Adleman三人于1978年合作开发的,并以他们的名字命名的公开密钥算法。其加密密钥是公开的,而解密密钥是保密的。它是基于一个非常简单的数论思想:“将两个素数乘起来是很容易的,但是分解该乘积是非常困难的”。
RSA算法的特别为利用素数(也就是质数)的因式不可分解性,选用很大的素数(一般为几百位到几千位),为了使政府部门与军事部门的数据保密,大多采用几千位以上的素数作为加密的密钥。RSA算法的要点与难点有二:①算法主要为求模取余运算,这给此算法的应用增添了实际的应用难度,因为给一个几千位的素数进行求模取余运算是很难的;②判断一个数是否为素数也是数学界几百年来一直讨论与研究证明的难题,虽然费马提出了著名的“费马猜想”,但一直却未得到过完全的证明,基于此要找一个几千位的素数更是难上加难。
(1)RSA算法原理
RSA算法是基于数论中的同余理论。如果用m代表明文,c代表密文,E(m)代表加密运算,D(c)代表解密运算,x=y(mode z)表示x和y模z同余,则加密和解密算法简单表示如下:
加密算法 c=E(m)=me(mod n)
解密算法 m=D(c)=cd(mod n)
其中n和密钥e是公开的,而密钥d是保密的。
下面讨论密钥的求取:
①选取两个随机大素数p和q(保密);
②设n=p×q;
③欧拉函数φ(n)=(p-1)(q-1)(保密);
④选取与φ(n)互素的正整数e,即满足gcd(φ(n),e)=1和0 ⑤计算d(保密),使满足e×d=1(mod φ(n)),即d和e相对于模φ(n)互为逆元素。 由RSA算法原理可知,RSA算法的核心是求模取余运算,其安全性是建立在大合数因子分解困难的基础之上的。 (2)模运算的实现 RSA算法的核心操作也是最耗时的操作是模运算,所以开发一种快速指数和取模运算是解决运算速度的关键。通常的模运算都是利用加减法来实现的,因为加减法指令的执行速度快。但对于TMS320C54x系列芯片,内部有专用的17位×17位乘法器,使得乘法指令的执行与加减法指令的执行所用的时间完全相同,所以在此设计中采用乘法完成模运算。 在进行模运算时,一般先将指数e(长度为kbit)改写成二进制数组的形式e,即 (本网网收集整理) 其中:ei∈{0,1},i=0,1,Λ,k-1。 >这样,在计算me(mod n)时,先做一次平方运算,然后根据ei的值,再做一次乘法运算,以此来简化模运算的复杂性。 由于实际中的e值非常大,为了提高运算速度,可以将e进行分组后运算。设对e以四位一组(十六进制)的形式计算me(mod n),那么: 其中:ei∈{0,1,2,…,15},t=k/4; ②求出m2,m3,…,m15(mod n); ③设置变量c:=1; ④对于i=t-1,t-2,…,1,0重复计算: c:=c2(mod n)(平方); c:=c2(mod n)(四次方); c:=c2(mod n)(八次方); c:=c2(mod n)(十六次方); e.若ei≠0,则c:=c×mei(mod n)。 ⑤所得c即为所求。 由上面的模运算方法分析可知,该算法的运算所需的平方和乘法次数是最少的,因此选择这种算法来实现模运算可提高运算速度。有了基本运算思路和步骤以后,就可以利用TMS320C54x DSP芯片来开发RSA算法了。 2 软硬件的实现 在嵌入式应用场合,对于大规模的乘法运算,采用单片机来实现显然力不从心;而TMS320C54x DSP芯片的特点恰好满足RSA算法的要求,是实现此算法的首选芯片。本课题中所选用的`是德州仪器公司生产的TMS320C5402芯片。 (1)TMS320C5402芯片概述 TMS320C54x芯片是为实现低功耗、高性能而专门设计的定点DSP芯片,主要应用在无线通信系统和远程通信嵌入式系统中。本文所用的TMS320C5402芯片是此系列的一个典型产品,除了继承老产品的优点外,还增加了更多的硬件资源,该芯片的主要特点有: ①速度快,指令周期为10ns,运算能力为100MIPS; ②强大的寻址能力,1M×16位最大可寻址外部存储空间,内置16K×16位RAM,4K×16位ROM; ③40位的算术逻辑运算单元(ALU),包括2个独立的40位累加器和1个40位的桶形移位寄存器; ④1个17位×17位的硬件乘法器和1个40位的专用加法器,乘法器/加法器单元可以在一个流水线状态周期内完成一次乘法累加(MA)运算; ⑤先进的多总线结构(3条数据总线、1条程序总线和4条地址总线),多条数据总线可以同时读取多个数据,使得指令集的功能强,效率更高。 (2)硬件设计 在本设计中,外设提供的串行数据是标准RS232电平,经过电平转换后达到可以处理的TTL电平,直接与DSP芯片的异步接收发送引脚相连;DSP将接收到的数据进行加、解密处理,并存储在外部数据存储器中,等待中断程序进行读取。 电路原理框图如图1所示。 在本DSP系统中,SRAM与DSP芯片的接口构成32K字的外部程序存储器和16字的外部数据存储器,其中外部程序存储器的地址范围是48000H~4FFFFH,外部数据存储器的地址范围是4000H~7FFFH;并行8位EPROM与DSP芯片的接口构成32KB的引导装载EPROM,可以使DSP系统成为独立运行系统,其地址范围是8000H~FFFFH。 当DSP芯片工作在微计算机方式(MP/MC=0)下,复位时,外部并行8位引导装程序从外部EPROM中读取引导装载表,并且装载程序代码到DSP片外程序存储器中。在外部并行8位引导装载模式下,可对软件等待状态寄存器(SWWER)和切换控制寄存器(BSCR)进行配置,使高速DSP芯片能从相对较慢的外部EPROM中读取数据,缺省的设置是7个等待状态。 硬件的设计是最为重要的,必须严格分析DSP工作过程中的时序问题,而且还要考虑到指令在执行时所消耗的时间;要考虑到该时间与外围器件的运行速度是否匹配等诸多因素,若单个软件设计成功而支持软件的硬件未设计成功,也就意味着整个设计等于零。 (3)软件设计 软件开发过程包括:利用任何文本编辑器编写源代码文件,然后通过编译、汇编和链接,生成DSP可执行的COFF目标代码,最后将生成的可执行目标代码通过仿真器下载到DSP目标系统中运行,再利用调试工具进行调试,达到设计要求。待程序调试通过后,就可以将所调试通过的程序代码利用Hex转换工具转换为二进制文件,再用编程器将程序写入外部EPROM中,形成独立的DSP系统。 开发语言分为汇编语言与高级语言两类。其中汇编语言编译器的效率高,但是由于生产DSP芯片的厂家开发出的DSP芯片所支持的汇编语言差异较大,其指令、寻址方式差异更大,并且可读性与可移植性不强。为克服这个缺点,厂家大都开发出支持高级语言的工具,典型的如“C语言”;而C语言的编译器效率比不上汇编语言;特别是在处理低层硬件中就显得苍白无力,所以一个优化高效的DSP应用程序都采用高级语言与汇编语言共同完成。 结语 【关键词】 DSP;流水线;冲突与优化 【中图分类号】TP311 【文献标识码】A 【文章编号】1001-4128(2010)09-0090-02 1 引言 DSP处理器执行程序指令,可以直接执行,也可以采用指令流水线的方式执行。TI DSP处理器一般都采用指令流水线方式, 该方式将一条指令分为若干个阶段按顺序分别执行,这样处理的优势就像工厂里组装电脑的流水线上的情形,同一时刻流水线上的各个岗位(阶段)都在操作对应的工序, 而流水线上的每个工序分别对应着在顺序执行着组装任务的一台电脑。也就是说,采用指令流水线的执行方式, 可以实现多条指令并行处理,大大提高系统的执行效率, 使得系统可以低延迟或“无延迟”地执行较复杂的指令。因此,更多的DSP处理器开始采用指令流水线的执行方式[1]。 2 C54x DSP的指令流水线 2.1 流水线结构 C54x系列DSP是TI TMS320C5000中应用比较广泛处理器,C54x DSP采用指令流水线的执行方式,其流水线周期分为6个操作阶段(或操作周期),各阶段相互独立。因此,在一条流水线中,在任一操作周期,最多可以存在6条指令同时处于流水线的不同阶段进行各自的操作。C54x DSP流水线结构的6个阶段是:预取指令、取指令、解码、访问、读与执行(写)阶段,如图1所示。 2.2 流水线与C54x总线 C54x的结构围绕8组16位总线(4组程序/数据总路线,4组地址总路线)建立,流水线中并行的6条指令在执行时,需要访问这些总线。按照流水线的6个阶段依次顺序,对总线访问的具体过程是:①将所要取指的地址放在程序地址总线(PAB)上;②从程序总线(PB)上取指令字,并装入指令寄存器(IR);③待指令寄存器中的内容经过译码后,可以确定所要操作的存储器的类型、数据地址产生单元和CPU的控制信号等信息;④DAGEN在数据地址总线DAB或同时在数据地址总线CAB上输出读操作数的地址,同时更新间接寻址模式中的辅助寄存器和堆栈指针(SP);⑤从数据总线DB和控制总线CB读操作数(读操作),同时在数据写地址总线(EAB)上装入写操作数的地址,对于映像寄存器,从存储器中读操作数,并从DB上将其写入选定的映像寄存器中;⑥从数据写总线(EB) 上写数据[2]。 在分析C54x DSP汇编代码时,为了方便盘查流水线冲突与优化代码,可以从功能上将流水线6个阶段归纳为两个顺序的阶段, 即“取指阶段”和“执行阶段”。在取指阶段, 主要是将指令取入指令寄存器(IR), 取指阶段包括预取指令、取指令、解码等阶段;在执行阶段, 主要是对解码指令的执行, 执行阶段包括访问、读与执行(写)等阶段。实际上,在取指阶段是对指令本身进行操作,并且此阶段的操作不去改写存储器等有关资源的内容,所以,一般情况下在取指阶段可以不用考虑其流水线冲突与代码优化的问题。但是,如果一个存储器块同时被映射在程序和数据空间,指令取指和操作数读会发生冲突,这要视存储器的具体配置确定;在执行阶段相关的操作比较多,要访问相关的寄存器、存储器等资源,比如地址(包括辅助寄存器和堆栈指针)更新、写存储器、读存储器等,此阶段容易出现流水线冲突的问题,存在优化程序代码的问题。 2.3 C54x流水线的存储器操作 3 流水线的冲突与优化 C54x DSP的片内存储器可以分为双访问存储器(DARAM)与单访问存储器(SARAM、ROM及DROM)。对于双访问存储器,C54x可以在一个单周期内对每个存储器块访问两次,前半周期第一次访问,后半周期再次访问。当流水线中的一条指令访问一个存储器块时,处于同一阶段的另-条指令可以无冲突地访问另一个块;处于流水线中不同阶段的两条指令,可以同时(单周期内两次分别)访问同-块。然而,如果两次访问是同时访问同一存储器块,就会有冲突。 对于单访问存储器,在一个单周期内只能对存储器访问一次。流水线中的指令同时访问不同的单访问存储器块不会发生冲突,即当处于流水线的一个阶段的一条指令访问一个存储器块时,另一条指令在同一个周期可以无冲突地访问另一存储器块。但是,如果同时访问同一存储器块就会发生冲突。 流水线可能会有冲突,有些冲突CPU可以自己调整,但有些操作需要通过调整程序代码来解决。在C5000 CCS下实现一个代码段,先将61H装入到累加器A中,然后再存入辅助寄存器AR2,并使用间接寻址方式将61H单元的内容(*AR2)装入到累加器B。在CCS的Simulator上运行该段代码(如图3所示,斜体部分为修改前部分),并得不到想要的数据。通过插入NOP指令,调整指令执行的时间,可以解决此代码的流水线冲突问题。依照流水线的各个阶段,解释如下:在①在执行时,②在访问阶段,③间接寻址模式中的堆栈指针(SP)同时更新;③在执行时,⑤在访问阶段,⑤间接寻址模式中的堆栈指针(SP)同时更新;⑥在执行时,⑦在读阶段,ar2是映像寄存器,从存储器中读出操作数,并从DB上其写入选定的映像寄存器ar2;⑧从数据写总线(EB)写数据到b寄存器。 4 结束语 DSP处理器专为应用数字信号处理设计,其内部结构有鲜明特点,代码按流水线方式执行,效率很高。在DSP工程的开发中,经常用到C语言与汇编语言的相互嵌套编程,目的还是为了提高代码的执行效率。通过对流水线的认识与了解,流水线中并行执行的指令有冲突的可能,CCS虽然具有优化代码的功能,但有些代码仍然需要手工调整。通过对C54x DSP冲突代码的调试,进一步了解了流水线的相关概念与规则。下一步,将在此基础上研究流水线的延迟。 参考文献 [1] 梁俊. TMS320C55x的指令流水线及其效率的提高[J]. 单片机与嵌入式系统应用,2003(05):11~13 典型的DSP(数字信号处理器)内部采用改进的哈佛结构和流水线技术,可以在单指令周期内完成乘加运算,具有较高的处理能力。一个典型的基于DSP的信号采集处理系统,通常由DSP、A/D转换器、存储器和相应的接口电路组成,大都做成PCI(外设部件互连)接口插卡形式和主控计算机一起工作。各种控制信息通过PCI发送给DSP,采集处理后的结果再通过PCI接口发送回主控计算机。PCI接口部分一般需要采用接口芯片来完成,这样会显著增加系统的设计调试难度,并使成本增加。而选用本身带有PCI接口的DSP处理芯片就可以省去这一部分额外的电路,不但降低了开发难度,也降低了设备成本。TMS320C6205就是这样一种带有PCI接口的DSP芯片,本文重点讨论基于这种芯片的信号采集处理系统的实现方法。 1TMS320C6205芯片的技术特点 TMS320C6205是基于TMS320C6000平台的高性能DSP,TMS320C6205源自TMS320C6201B,一种有新的PCI接口且性能提高的DSP芯片。TMS320C6205工作在200 MHz时的最大处理能力达到了1 600 MIPS(百万条指令每秒)。所有TMS320C6000系列DSP芯片在代码上都有兼容性,TMS320C62x定点DSP都基于相同的CPU核心设计,通过指令的并行性获得了较强的处理能力。该系列DSP芯片具有8个处理单元,包括2个乘法器和6个ALU(算术逻辑单元),所有的处理单元都可以并行工作,因此在每一个时钟周期内最多可以同时执行8条指令。 TMS320C6205和TMS320C6201及TMS320C62-01B具有高度的兼容性,这几种DSP芯片在以下几个方面完全相同:TMS320C6205的CPU与TMS320C620-1B完全相同,因此为TMS320C6201所写的代码可以不加修改地在TMS320C6205上运行;多通道缓冲串口(McBSP)、时钟、中断选择也完全相同;TMS320C6201与TMS320C6205的内部存储空间也相同,都具有64 kB的程序和数据存储区。与TMS320C6201相比,TMS320C6205通过升级具有了更强的处理能力,升级后的TMS320C6205和TMS320C6201有以下不同[2]: a)EMIF(扩展存储器接口总线)做了简单修改,减少了芯片的引脚数。SDRAM(同步DRAM)和SBSRAM(同步猝发SRAM)在EMIF上共用了相同的控制信号。这两种信号是互斥的,因此在系统中只能在两种类型的存储器中任选一种。 b)为提高DMA(直接存储器访问)的数据吞吐量,4通道的DMA控制器为每一个通道都配备了专用的FIFO,这样就无需对FIFO信号进行仲裁。 c)用PCI模块代替了TMS320C6201B的HPI(主机接口),PCI模块具有高性能的32 bit主/从PCI即插即用功能,支持33 MHz的桌上电脑PCI接口,与PCI本地总线规格2.2版兼容,该接口模块可作为具有33 MHz、32 bit宽度地址数据的PCI主从对象使用,该模块包含配置寄存器、校验生成、校验和系统错误检测和报告(PERR#,SERR#)以及电源管理能力。 d)具备4线EEPROM串行接口,这样,PCI的控制空间寄存器就可以从外部的串行EEPROM加载配置,PCI模块无需DSP的干涉就可以实现自动初始化。 e)TMS320C6205的PLL有x1、x4、x6、x7、x8、x9、x10和x11等模式,这些模式可以通过CLKMODE0引脚和EMIF数据引脚的上推和下拉电阻来选择。 f)TMS320C6205使用15C05(0.15 μm)处理技术,通过电池处理技术提供更低的核电压和功耗。 g)用上推和下拉电阻实现了自举模式配置。 2信号采集处理系统硬件设计 该系统硬件部分主要由DSP、FPGA(现场可编程门阵列)和存储器构成,具体的硬件结构如图1所示。 从图中可以看出,信号采集处理系统的核心部分是TMS320C6205的DSP处理器,该DSP除了担负信号处理任务外,还担负着接收数据和输出处理结果两项任务。信号采集处理系统中的FPGA主要担负数据采集和控制信号生成两项任务。该系统的设计针对的是接收机解调后输出的TCL电平的数字信号,因此数据采集部分比较简单,就是将数据的时钟作为触发信号,根据触发时刻的数据电平值来确定输入数据是“0”还是“1”,采集后的数据在FPGA内按照McBSP的数据规格成帧,然后通过McBSP写入SDRAM中。该系统可以同时采集两路数字信号,在采集电路与DSP之间通过DMA方式交换数据,由于DSP中有专门的DMA控制器,因此在数据交换时无需DSP干预,具有较高的处理效率。DSP所需的控制信号也由FPGA产生,由于数据采集部分比较简单,控制信号产生和数据采集可以共用同一片FPGA。DSP通过PC接口模块与主机之间进行数据交换,由于PCI接口模块具有完整的PCI接口功能,无需额外添加外部电路,因此接口部分的电路设计相对来说比较简单。DSP与工控机进行数据交换时采用主从方式,DSP为主设备,工控机为从设备,两者之间利用中断响应进行数据通信,当DSP内部的输出数据缓冲区被写满后,会发送一个中断请求到主机的PCI总线上,PCI总线驱动程序响应该中断并通过Windows的事件(Event)通知主机软件读出数据。为了扩充DSP的存储空间,使DSP能满足大速率信号的处理要求,信号采集处理系统上集成了一片大容量存储器,即SDRAM,具有较高的数据存取速度。信号采集处理系统上的Flash存储器主要用来存储DSP软件,可通过PCI总线在主机端动态加载,这样该信号采集处理系统就可根据不同的输入数据进行不同处理,大大增加了系统使用时的灵活性。该系统还包括时钟电路和电源电路,这些电路可以参照技术手册的要求进行设计,电源电路可选用现成的电源模块,这样就可进一步降低电路设计难度。从总体上看,采用TMS320C6205构成的信号采集处理系统由于省去了额外的PCI接口电路,整个系统设计较简洁,开发难度低,开发周期短,是一种较理想的硬件设计方法。 3基于DSP/BIOSⅡ的实时信号处理技术 信号采集处理系统中的DSP不但要实现高速信号处理,还需要处理数据的输入输出和中断请求,这都要用到基本的任务调度和输入输出服务,DSP/BIOS实时基础软件提供了一个小的具有基本运行服务的固件核,开发者可以把这个核嵌入目标DSP中。DSP/BIOSⅡ是性能得到提升的第2代实时基础软件,利用该软件可以缩短实时信号处理软件的开发时间,并且可以显著提高代码的可重用性。 基于DSP/BIOSⅡ使信号处理技术实现起来比较简单,整个配置过程都可以利用一个图形化的界面来实现。首先,新建一个DSP/BIOS的配置文件,然后在“Syetem”文件夹下选择“MEM”,也就是存储区管理模块,在该模块增加两个新的MEM项,分别对应信号采集处理系统的SDRAM和Flash存储器,设置好SDRAM和Flash存储器的基地址和长度,至此片外存储区的设置就全部完成了。由于DSP和数据采集部分通过McBSP交换数据,因此还需要对McBSP进行设置。找到“CSL”也就是芯片支持库文件夹,在McBSP选项下的McBSP配置管理(MsBSP Configuration Manager)增加两个新的McBSP的配置控制项,这两个控制项分别对应McBSP0和McBSP1,然后设定这两个配置项的参数,最关键的是接收模式和输出模式的设置,接收和输出均采用无压扩的LSB方式,对于有压扩的话音数据,可以根据需要选择μ律或A律压扩,这样在数据读写的同时,利用DSP硬件也就完成了μ律或A律压扩。McBSP可以实现数据的双向传输,在本系统中只是从数据采集部分读入数据,没有用到其双向数据传输功能。实际上,利用其双向数据传输功能,结合μ律或A律可以很方便地实现话音的实时处理[2]。所有配置都设置完后,将配置文件存盘加入当前工程,整个基于DSP/BIOS的配置便完成,在中断响应函数配合下,就可实现整个实时处理软件的开发。 实时处理软件的数据流如图2所示。从图中可以看出,数据从McBSP通过DMA方式写入SDRAM输入缓冲区,整个输入缓冲区划分成若干片,数据处理部分按片进行处理,由于McBSP写入的数据片与DSP处理的数据片不是同一个数据片,数据处理和数据写入就可以同时进行,这是保证数据实时处理的一个关键。显然,所分数据片数越多,可以有越长的处理时间,越适合进行一些复杂的算法,这样要付出的代价就是输出延时比较长,同时需要大的DSP片外存储空间。数据处理后的结果存放在输出缓冲区,输出缓冲区的大小与输入相同,当输出缓冲区写满后,触发PCI总线中断处理函数,把处理后的结果通过PCI总线写到主机缓冲区,主机程序从该缓冲区将数据读出,存储到计算机硬盘上的制定文件中。 显然,该信号处理软软件中最关键的是McBSP的DMA中断响应函数和PCI中断响应函数,下面分别介绍这两个函数。 DMA中断响应函数的主要代码如下: 从代码中可以看出,DMA中断响应函数最核心的部分是按照给定条件初始化DMA控制器,然后启动DMA通道,开始接收数据。这里的给定条件主要是保证DMA的写入地址符合要求,特别是在循环写入的情况下不致发生地址冲突[3]。DSP与主机缓冲区之间的数据交换也是通过中断响应方式进行的,与通过DMA方式从McBSP读数据不同,PCI接口工作在猝发方式,其中断响应函数在输出缓冲区全部写满后将缓冲区内的全部数据写到主机缓冲区,因此,输出缓冲区无需分片。采用这种方式可以减少PCI接口读写次数,提高数据传输效率。 4基于多线程的主机处理技术 DSP数据采集处理系统的处理结果需要输出到主机,主机可以对处理结果进行进一步处理。主机程序最关键的部分是要将主机缓冲区的数据读出来,再写到硬盘上的文件中。DSP数据采集处理系统的驱动程序在计算机内存中开辟主机缓冲区,在一台主机上可以允许多个数据采集处理系统同时工作,这时需要同时开辟多个缓冲区。为保证多个数据采集处理系统同时工作,主机在处理时采用了多线程技术,整个主机处理软件利用C++Builder开发,在该开发环境下很容易实现多线程处理技术。 主机处理软件的核心代码如下: 从代码中可以看出,主机多线程处理技术的核心是一个线程执行函数(Execute( )),该函数将缓冲区内的数据写到文件中,在多个数据采集处理系统同时工作时,该处理函数以轮循的方式将对应缓冲区的数据写入不同的文件句柄(g_hFiles[i][0]),也就是写入不同的文件,这样就不会在数据写入时发生冲突。 主机程序除了将数据写入指定文件外,还可以控制每一个数据采集处理系统的启动和停止,并具备在线加载并配置DSP程序的能力,用户可以通过修改DSP程序的参数来执行不同的处理任务。所有这些功能都是由该系统的硬件驱动程序提供,该硬件驱动程序已封装成一个库函数,调用起来较为方便。这样,用户就可根据自己的需要开发不同的主机应用程序。 5结束语 基于TMS320C6205的数据采集处理系统已经在实际应用中获得了良好的效果,特别是该系统可以通过加载不同的DSP处理程序进行不同的数据处理,大大拓展了该系统的应用范围,充分体现了基于DSP的数据采集处理系统在应用上的灵活性。同时,由于多个采集处理系统可同时工作,整个处理系统可以适合不同应用场合的需要,可以胜任不同处理能力的需要。 参考文献 [1]NIKOLIC Z.Howto begin development with the TMS320C62-05 DSP[R].Application Report SPRA596A.Texas Instru-ment,2001. [2]董晖,姜秋喜,毕大平.采用TMS320C6701的实时音频信号处理系统[J].电子技术,2004,31(12):7-11. 关键词:PPP 嵌入式系统 网络 TCP/IP TMS320C6x 随着嵌入式应用的普及,嵌入式系统的联网问题日益引人关注。在信息化进程中,如何实现资源共享已经是几乎所有电气设备必须回答的问题,嵌入式系统也不例外。 在传统的工控领域,大量以单片机为代表的嵌入式设备,如仪器仪表、数据采集和显示设备、过程控制设备等,面临更紧迫的联网需求。因为在工业化进程中,信息化正在发挥越来越重要的作用,而网络则是信息共享的基础。在工业自动化领域,由于应用环境千差万别,如何实现设备联网也见仁见智,方案之间差异很大。由于近几年电子技术的发展,以TCP/IP为代表的通用网络技术和标准在工业环境和生产现场的应用日益增多,开始逐渐被人们接受。但是,TCP/IP协议的真正优势在上层,它适合于大范围的信息共享。如何将品种繁多的现场设备联网并非TCP/IP所长,为了解决这个难题,人们想到了PPP(Point to Point Protocol)。 在TCP/IP协议族中,PPP本来是用来实现远程联结的,其特点是适应多种传输介质和可靠性高。在工业生产现场,这是两个被非常看重的优点,所以采用PPP作为嵌入式系统的联网协议已经引起广泛的关注[1]。为了利用PPP的优点,一些系统甚至在已经具备以太网的环境中仍然采用PPP,这就是所谓的以太网承载PPP技术(PPPoE)[2]。 1 TMS320C6x网络开发环境对PPP的支持 为了加速其高档DSP的网络化进程,TI结合其C6000系列推出了TCP/IP NDK (Network Developer’s Kit)。该开发包采用紧凑的设计方法,实现了用较少的资源耗费支持TCP/IP。从实用效果看,NDK仅用200~250K程序空间和95K数据空间即可支持常规的TCP/IP服务,包括应用层的telnet、DHCP、HTTP等。所以,NDK很适合目前嵌入式系统的硬件环境,是实现DSP上网的重要支撑工具。 与常规的TCP/IP应用环境不同,为了最大限度地减少资源消耗,TI为其NDK采用了许多特殊技巧,重要的有: ① UDP socket和RAW socket不使用发送或接收缓冲区; ② TCP socket使用发送缓冲区,接收缓冲区依配置文件而定; ③ 低层驱动程序与协议栈之间通过指针传递数据,不对包进行复制拷贝; ④ 设置专门的线程清除存储器中的碎片和检查存储器泄露。 要特别注意“低层驱动程序与协议栈之间的通信”。因为在嵌入式系统中,低层驱动程序和应用程序一样均需要开发者自行设计。也就是说,在以NDK为基础的开发中,开发人员需要分别设计低层驱动程序和应用程序,这两部分程序通过NDK提供的TCP/IP包发生关联。程序的执行过程是:应用程序调用TCP/IP包,TCP/IP包再调用低层的驱动程序。 在NDK中,对低层驱动程序与TCP/IP包之间的接口作了明确规定。换言之,低层驱动程序必须符合接口约定,其要点是: ① 由低层驱动程序调用TCP/IP包函数创建PPP连接实例,在连接实例中,以回调函数的形式将用于处理数据发送的函数名传递给TCP/IP包; ② 当TCP/IP包有数据需要发送时,直接调用PPP创建时由低层驱动程序传递来的函数名; ③ 当低层驱动程序接收到网络数据时,调用TCP/IP包函数发送到IP层。 低层驱动程序直接面向硬件,为了适应硬件的多样性,在NDK中也提供了多种实现PPP的方法。 2 PPP低层驱动程序的任务和实现方案 PPP低层驱动程序在硬件和TCP/IP包之间传递PPP帧;但是,面向硬件和TCP/IP包的PPP帧是不同的。面向硬件的PPP帧由六个字段组成: ① Flag标志(7E),1字节; ② Address地址(FF),1字节; ③ Control控制(03),1字节; ④ Protocol协议,2字节; ⑤ Payload净荷,小于1500字节; ⑥ CRC检查和,2字节。 而面向TCP/IP包的PPP帧则只有④和⑤两个字段。所以,PPP低层驱动程序的任务可以归纳为:在硬件和TCP/IP包之间提供数据通道,在物理上实现链路层上的信息发送与接收,在逻辑上对PPP帧进行处理和加工。 在NDK中,通过TCP/IP 协议栈提供了三套实现PPP的函数。即低层 PPP API、HDLC API和PPPoE API。其中低层PPP API 只能从内核层调用,用户应该非常熟悉内核的操作,如llEnter/ llExit() 函数对等,对软件开发的限制较大,但应用范围宽广。HDLC API 可在用户程序中调用,由TCP/IP 协议栈实现,配合HAL层的串行驱动程序llSerial,提供在常规串口上的PPP能力,应用范围有一定局限;而PPPoE API是提供基于以太网的`PPP接口,对硬件端的要求更加严格。 为了使开发的PPP低层驱动程序具有较宽的适应能力,我们选择低层 PPP API作为开发的基础。低层 PPP API的函数包括: pppNew() 创建一个PPP会话连接; pppFree() 释放一个PPP会话连接; pppTimer() 1s的定时器函数; pppInput() 发送已接收到的PPP 输入缓冲区。 在低层 PPP API中最重要的是创建函数。通过对pppNew()的深入研究,我们可以把握住PPP低层驱动程序设计的关键之处。pppNew()的接口为: HANDLE pppNew(HANDLE hSI , uint pppFlags ,uint mru , IPN IPServe r , IPN IPMask , IPN IPClient, char *Username, char *Password, UINT32 cmap, void (*pfnSICtrl)(HANDLE, uint , UINT32, HANDLE )); pppNew包含有许多参数,重要的有:hSI 供回调函数使用的句柄、pppFlags 连接选项标志、mru 最大接收单元数以及网络地址和子网掩码、用户名称和口令等。其中,最重要的参数是回调函数的指针:pfnSICtrl 。当TCP/IP包需要通过PPP发送数据时,将使用该指针提供的函数。 回调函数由PPP低层驱动程序的开发人员负责编写,但它的接口是由pppNew的参数决定的。回调函数的接口界面为: void SIControl( HANDLE hSI , uint Message , UINT32 Data, HANDLE hPkt) 参数的含义为:hSI与特定PPP连接会话(由pppNew创建)相联系的句柄,Message描述 PPP 事件的消息代码,Data关于消息代码的附加信息。hPkt是最重要的,当消息代码为SI_MSG_ SENDPACKET时,表示发送数据包的句柄。 PPP 通常在三类情况下调用该回调函数,即: ① SI_MSG_CALLSTATUS PPP 的连接状态已经改变; ② SI_MSG_SENDPACKET PPP 正在请求一将数据帧编码和传输; ③ SI_MSG_PEERCMAP LCP 已经收到对等的 32 位异步字符映射。 3 编程举例 下面给出两段代码,说明在PPP低层驱动程序中如何接收和发送数据。 接收数据通过pppInput函数实现,核心代码如下: HANDLE hPkt; HANDLE hFrag; uint Offset,ValidSize; UINT8 *pb; // 生成1500字节payload包 if( !(hPkt = IFCreatePacket( 1500, 0, 0 )) ) return( 0 ); hFrag = PktGetFrag( hPkt ); //得到此包的存储器碎片 pb = FragGetBufParams( hFrag, 0, 0, 0 ); // 得到包头指针 Offset = PktGetSizeLLC( hPkt ); if( Offset <= 2 ) Offset = 0; else Offset-=2; pb += Offset; // 置pb指针到写数据开始处 // 利用指针“pb”向数据包中填充数据;hFrag是向PPP传 //递的句柄 FragSetBufParams( hFrag, PACKETSIZE, Offset ); return( hPkt ); 发送数据的情况要复杂一些,需要使用回调函数。回调函数的结构如下: void SIControl ( HANDLE hSI, uint Msg, UINT32 Aux, HANDLE hPkt ) {…switch( Msg ) { case SI_MSG_CALLSTATUS: if( Aux >= SI_CSTATUS_DISCONNECT ) { // Close PPP if( hSI→hPPP ) { hTmp = hSI→hPPP; hSI→hPPP = 0; pppFree( hTmp ); } break; case SI_MSG_PEERCMAP: break; case SI_MSG_SENDPACKET: // 确认数据包有效 // 取数据缓冲区参数 // 计算“净荷”(payload)的起始地址 // 发送数据 // 释放数据包 break; } } 结 语 在视频检测、医疗影像及红外图像快速跟瞄系统应用中,越来越复杂的二维、三维甚至四维的图像处理,需要并行化的处理系统,并能够运行复杂的算法[1,2,3,4,5,6,7,8]。要实现这些复杂的系统,高端FPGA+高性能DSP是目前普遍采用的方案[5,6,8],而单个DSP的性能已发展至极限,所以解决复杂的并行算法,多核DSP是现在发展的全新方向,,其中多核DSP的根加载技术是其难点之一[7,9,10]。 TI公司推出的DSP芯片TMS320C6678(C6678)具有8个内核的高性能DSP,每个内核工作频率均达1 GHz。。其支持的Boot模式有SPI、I2C、EMAC、SRIO和并口Emif16 NOR-FLASH。其中Emif16 NOR-FLASH模式是不用上位机参与、比较简单、独立成系统的一种,大多独立DSP系统采用该方式。 关于多核的加载,也有相关的文献报道[9],而文献[9]是DSP+ARM的双核。网上也能搜索到关于C64722和C6678零星一些加载资料,都是借助于第三方转换工具,太过于笼统。下面是针对C6678的并口Emif16NOR-FLASH的上电加载作详细的探讨。 1 C6678的上电加载过程 所谓上电加载(上电自举),即是当DSP复位后,正常运行用户程序之前运行的一段小程序,就像PC机的BIOS一样。多核加载同单核加载区别很大,不但要负责主核的加载而且还有其他核的加载与激活。C6678的Emif16 NOR-FLASH可以直接执行程序(XIP)(这与C641x系列DSP不同),其上电加载过程示于图1。 上电复位后,DSP首先运行固化在片上ROM位于地址0x20b00000的程序,称为片上Loader,片上Loade根据DSP硬件管脚状态,判断用户采用的Boot模式以跳转到相应模式的二级加载程序。如图1的Emif16 NOR FLASH模式中,运行片上Loader后,PC指针直接指向NOR-FLASH首地址0x70000000并开始执行FLASH上的二级Loader程序,二级Loader存储在FLASH开始地址0x70000000~0x70000400的范围内。从0x70000400开始保存应用程序的根表数据(即被烧烧写到FLASH中的应用程序的数据)。二级Loader的功能是将保存在FLASH中的Core0~Core7的根表数据搬移到DSP相应的地址段内,搬移完后,二级Loader程序PC指针跳到Core0的主程序入口地址_c_int00处,开始执行Core0的应用程序。在Core0的应用程序开始加有使其他核激活运行的代码(这也是有别于单核的特殊之处),至此整个多核加载就此完成。事实上,如果你的应用程序很小,且运行速度要求不高,图1中的2、3和4过程都可以不要,只要把应用程序的原始代码数据烧写到FLASH从0x70000000开始的位置,上电正常运行即可(这在C641x上是不行的),如此DSP的许多高性能就体现不出来,且多核工程大多采用嵌入式sysbios工程,占用存储器比较大,所以正常的Boot过程必须采用图1所示的二级加载过程。 从图1中看出,一个完整多核加载过程,开发者需要做的是二级加载器Loader的编写、FLASH中映像文件的产生、FLASH烧写器的编写,主核对各辅助核的触发代码的编写(被加载的应用程序不在本范围内)。 2 多核映像文件的组成与产生 映像文件就是用户要烧写到外部FLASH上的全部数据文件,它是由二级加载器Loader的代码数据(在文件前部)和应用程序的根表(Boot Table)数据(文件后部)的合成数据文件。单核和多核的二级Loader都一样,区别就是后部的根表数据。根表是应用程序的所有代码和数据以在片上占用的地址来分段存储的数据包,包的第一个4 B是main()函数的入口地址_C_int00,后面由若干数据段组成,每个段前4 B为该段数据的字节长度Byte_count_x(x为段序号),接着4 B Address_x为该段在片上的存储地址,后面是Byte_count_x个字节的具体数据Data_x。所有数据段结束后是4个字节0作为根表的结束标记。该根表格式如表1所示。每一个段的数据字节数可能不是4的整数倍,根表中数据区就在后面添0按4 B的整数倍向上取整,故整个根表文件字节数必是4的整数倍。 根表数据产生很简单,由应用程序最终生成的Ou文件,通过ccs自带工具hex6x.exe选择不同的参数而产生,产生的文件即是根表文件,可以选择生成二进制文件或文本文件,本研究采用二进制。其产生命令为(app为应用程序名,app.out为ccs产生的连接文件): app.bin为产生的二进制根表文件,将二级Loader程序的二进制代码加到根表文件的头部即是app应用程序的映像文件。 多核的映像文件是由二级加载器Loader和多个核应用的根表合并而成的文件。多个核对应多个独立的工程,并由CCS产生多个out文件,再由hex6x.exe产生各核的根表文件。后对Core0的根表文件先去掉末尾4个0字节,再将各辅助核的根表文件的开始的入口地址_C_int00和末尾4个0字节去掉,加到Core0被去掉了末尾字节的根表文件后,然后再将每个核的_C_int00当成一个4字节的数据段来保存到上面的合成文件的后面,而各_C_int00在片上的存放地址即为各核的专门固定地址Boot Magic Address,如Core1的Boot Magic Ad dress为0x1187fffc,Core2为0x1287fffc,…,Core7为0x1787fffc。所有根表数据段构成后,再将4个0字节作为结尾标志加到文件的最后,这样合并后的根表文件如表2所示。同样,将二级Loader的代码数据加到该文件头部即形成多核的映像文件。由hex6x生成的单核根表文件到合成映像文件的产生,全是文件操作,可以用一般的C语言工具,甚至Matlab等工具都可以完成。 同表1相比,表2仅仅只是增加了所有辅助核数据段和各核的_C_int00特殊数据段而已,表头和结束字节都相同,因此完全适用于二级Loader按统一Boot Table格式搬移数据。需特别注意,各辅助核的out文件通过hex6x.exe产生的根表数据段中,当映射到L2(0x00800000~0x0087FFFF)的范围时,与Core0的地址是相互覆盖的,产生合成根表时必须加上各核的L2基地址0x10000000+n*0x1000000(n为辅助核号),如Core1的地址0x00825000,映射为0x11825000,同样地址Core2映射为0x12825000,Core7映射为0x17825000。 3 二级Loader程序和FLASH烧写程序 二级Loader是一段小代码程序,其功能就是将FLASH的根表数据如图1中从0x70000400开始按表2的格式保存的数据搬移到DSP的RAM中。该Loader比较简单,一般是一小段汇编代码,代码如下: 需要注意的是,由于DDR没有初始化,所以二级Loader不能加载DDR数据,DDR只作数据存储器用,确实要加载到DDR中,只能将DDR数据存在FLASH一指定段中,待Core0运行开始初始化DDR后,将该数据读到RAM中。 对于FLASH的烧写程序,主要任务就是把多核的合成文件烧写到外部Emif16 NOR-FLASH存储器中。由于TI大部分的Emif并口加载都是开放式的,开发者完全可以根据自己的思路和格式来产生和烧写映像文件,故烧写器TI公司是不提供的。其实,一旦合成根表文件产生后,烧写器也显得容易了。烧写器一般使用输出legacy COFF格式的CCS工程即可。从图1的加载过程看,要烧写的映像文件内容包括二级加载器Loader的代码和表2的根表文件两部分。二级Loader可以放到烧写器的开头main()函数之前,也可以放到Core0的应用程序同样位置,本研究采用前者,将二级Loader代码映射到烧写工程中指定的存储器.boot_load段。烧写器的编程流程如图2所示。 4 辅助核的触发 多核的加载,如果图1中仅仅只是进入Core0_C_int00地址运行而其他核还未激活,加载仍然是失的。辅助核的触发,必须两个条件,一是将各核工程入口地址_C_int00写到各核的Boot Magic Address处二是向各核的核间中断触发寄存器IPCx(1 5 结语 多核DSP加载是一项比较复杂但又很重要的过程[7,9,10],也是多核技术的应用难点之一,一个多核DSP开发人员,如果要成功走向应用,上电加载这一关是必须要过的。各核的应用工程可以是输出elf格式sysbios工程,也可以不是sysbios工程。上面的多核Emif16NOR-FLASH加载方法,在自研的C6678图像信号处理系统中已成功加载。 摘要:对于多核DSP应用技术来说,BootLoad技术是一个关键点,也是应用难点之一。针对8核高性能DSP——TMS320C6678的根配置问题进行了研究,包括上电加载过程,单核和多核的emif NOR-FLASH存储器的映像文件的产生,二级加载器的编写和FLASH编程器的构成等。其中,关键是在多核映像文件中,将辅助核的入口地址作为特殊数据来处理,使其他核触发更容易,这也是其他文献未涉及的。该项技术已经用在某图像处理系统中。 关键词:多核DSP,TMS320C6678,BootLoad,映像文件 参考文献 [1]汪东,陈书明.一种面向异构多核DSP的数据流传输控制引擎设计与评测[J].国防科技大学学报,2009(5):19-23. [2]方幸福,梁利平.一种适用于多核DSP片外扩展的网络接口的设计[J].微电子学与计算机,2010(5):9-13. [3]徐力,史少波,王沁.面向SDR应用的多核DSP低功耗设计[J].电子科技大学学报,2012,41(1):136-141. [4]孙科林,周维超,吴钦章,等.光纤实时传输的多核DSP图像处理系统[J].光电工程,2012,39(4):136-144. [5]李乐,熊志辉,王斌,等.DSP+FPGA折反射全景视频处理系统中双核高速数据通信[J].电子与信息学报,2010,32(3):649-654. [6]刘章文,卢朝政,张生帅,等.基于数字复制和数字上变频的高速信号的产生[J].电子技术应用,2012,38(8):73-75. [7]王旭智,张怀柱,宋建中.TMS320VC5416在系统并行引导的研究与实现[J].电子器件,2007,30(1):248-251. [8]穆文争,朱德智.基于FGPA和DSP的雷达模目信号设计[J].现代电子技术,2011,34(11):13-15. [9]刘慧,林海虹,刘智.多核DSP的BootLoader程序的实现[J].电子技术应用,2003,29(6):72-74. TMS320C64x系列DSP芯片是TI公司C6000系列产品中的一种, 该系列芯片为定点DSP芯片, 主频为600 MHz~1 GHz, 但其外设工作频率最高为133 MHz, 通过研究发现, 必须在外设数据采集及软件编程设计方面进行优化设计, 才能大幅度提高算法的运算速度, 发挥芯片主频提高的真正潜能。该芯片具有很高的操作灵活性和速度, 同时如何充分利用它的硬件结构及资源, 发挥它的高速处理能力, 是软件设计人员首要考虑的问题。软件优化技术对实现系统的开发具有重要意义[1,2,3,4]。 1 优化设计 1.1 开发系统配置 CCS 2.0 (C6000) 是TI推出的专门开发C6000系列DSP的集成开发环境。CCS集成了工程管理工具、代码编辑器、代码产生工具、代码调试工具等。编译器的设置, 是软件优化的先决条件, 在程序代码编译前, 需要在工程文件的Build Options控制编译器选项中选择-o2/-o3选项, 这样可以使编译器最大限度地进行分析和优化。 1.2 C代码的优化方法 为了使C代码获得最好的性能, 编写时应遵循下述规则: 1) 对于定点乘法输入应尽可能使用short型数据, 该数据类型可以有效利用C64x的16位乘法器; 2) 对循环计数器使用int或unsigned int类型, 避免不必要的符号扩展指令; 3) 使用restrict关键字限定一个指针、引用或数组; 4) 使用内联函数可以快速优化C代码, 其使用方法与调用函数一样。 1.3 线性汇编代码优化方法 编写高效的汇编代码应遵循下述规则: 1) 使用并行的汇编代码, 充分利用某些指令的延时间隙, 执行代码; 2) 使用打包数据处理, 充分利用C64x宽的存储空间通路, 用字或者双字的读取和存储操作数来进行字或者半字数据访问; 3) 合并多操作为单个操作指令, C64x提供了许多能将一些一般操作结合在一起的指令, 这些指令能减少代码中的指令数, 减少代码长度, 利于简化编程。 1.4 交叉汇编代码使用 由于C语言灵活性强、便于阅读, 在编写程序代码时, 可以用C语言编写代码的主体框架, 将代码中耗时最长的部分抽取出来, 用并行汇编代码编写, 这样可以大幅提高代码的执行速度。 1.5 软件流水方法 软件流水就是编排循环指令, 使循环的多次迭代能够并行执行。软件流水应从4个方面进行考虑, 分别是循环次数、冗余循环、循环展开和推测执行。 1) 循环计数 最有效的软件流水的循环是按递减计数形式对循环进行计数。可以选择编译器的-o2或-o3选项优化循环。 2) 消除冗余循环 冗余循环的存在使代码尺寸增加, 也对代码性能有影响。因此, 运用编译器的-mh或-mhn选项可以减少冗余循环, 提高编译器完成优化的能力。 3) 循环展开 当单次迭代操作没有充分利用C64x结构的所有资源时, 可使用循环展开提高性能。有3种循环展开的方法: (1) 编译器自动执行循环展开; (2) 在程序中使用UNROLL伪指令建议编译器做循环展开; (3) 用户自己在代码中展开。 4) 推测执行 运用编译器的-mh选项有助于编译器消除软件流水的填充和排空, 间接地减轻寄存器压力, 可以获得更简洁的代码和更佳的性能。 2 优化设计中注意的问题及解决方法 2.1 软件流水限制条件 在以下3种情况中, 不能进行软件流水: 1) 如果一个寄存器值存在的时间过长, 这个代码不能进行软件流水; 2) 如果循环体内有复杂的条件代码, 对于C64x超过6个条件寄存器时, 这个循环不可以进行软流水; 3) 一个有条件增大的循环控制变量的循环不能进行软件流水。 2.2 避免交叉通路阻塞 避免交叉通路阻塞的方法有2种: 1) 通过安排指令, 当操作数被更新至少一个周期以后再进行交叉通路操作数读取操作, 交叉通路阻塞可以避免; 2) 适当的编排, C64x能够在每个时钟周期、每个数据交叉通路进行一次源操作数读取操作, 可以避免交叉通路阻塞。 3 仿真验证 以计算两个16×16像素图像的灰度绝对差为例, 分析程序优化前后的运算耗时情况。两个16×16像素图像的灰度绝对差公式为 式中:R (u, v) , S (u, v) 分别表示16×16像素的图像矩阵, 每个像素为8 bit数据。优化前, 每次加载一个8 bit数据处理, 测试代码运行时间后, 发现速度提高不明显, 因此, 需要对代码进行改进。选用3种不同的打包数据处理方式对代码进行优化: 1) 方法1, 用1条16 bit数据加载指令 (LDHU, 2LDB) 实现一次加载2个8 bit (字) 数据处理。 2) 方法2, 用1条32 bit数据加载指令 (LDW, LD-NW) 实现一次加载4个8 bit (双字) 数据处理, 并且运用一组DOTPU4, SUBABS4指令进行运算。 3) 方法3, 用1条64 bit数据加载指令 (LDDW, LDNDW) 实现一次加载8个8 bit (4个字) 数据处理, 并且运用两组并行的DOTPU4, SUBABS4指令进行运算, 同时使用并行的汇编代码, 充分利用某些指令的延时间隙, 执行代码。 优化前后运算时间对比见表1。 从表1中可以看到, 软件优化设计主要是通过利用数据并行加载、寄存器流水并行处理、减少循环次数的方法, 可以大大减少运算时间, 提高运行速度。 4 结论 在TMS320C64x系列DSP芯片应用中, 大部分每秒百万次指令运算发生在紧凑的循环中, 所以对于C64x代码产生工具来说, 在重要的循环中充分利用片内的硬件资源, 时分组码值得进一步研究, 比如改进最大似然译码、简化译码复杂度;还可以将先进的信道编码和空时编码级联, 来提高误码率精度。总之空时编码技术在未来的通信中有着广阔的应用前景。 参考文献 [1]Texas Instruments Incorporated.TMS320C6000优化编译器用户手册[M].田黎育, 译.北京:清华大学出版社, 2005. [2]Texas Instruments Incorporated.TMS320C6000程序员手册[M].朱梦宇, 译.北京:清华大学出版社, 2005. [3]Texas Instruments Incorporated.TMS320C6000汇编语言工具用户手册[M].何佩琨, 译.北京:清华大学出版社, 2005. 1 基于灰度投影的电子稳像算法 1.1 电子稳像基本原理 电子稳像(ElectronicImageStabilization,EIS)是集电子技术、计算机、数字信号处理、视频图像处理等为一体的实现数字图像序列稳定的技术。电子稳像技术中最基本的是像移补偿技术是直接从像面上通过检测参考图像和被比较图像的运动矢量,然后利用算法进行补偿的技术。稳像的基本原理:(1)根据图像序列或视频的各种信息进行局部运动估计。(2)进行全局运动估计。(3)经过运动估计后取得运动参数,然后进行综合评价根据综合评价的结果进行运动补偿,并最终取得稳定的输出序列。由此可知,获得图像的全局运动矢量是电子稳像的前提条件。基本流程如图1所示。对于全局运动矢量可以通过灰度投影算法获得[1]。 1.2 灰度投影算法 灰度投影算法(ProjectionAlgorithm,PA)是利用图像灰度分布变化的特点得到图像帧间运动矢量。对于灰度细节丰富、直方图无明显特征、对比度差的图像难以识别特征量,寻找特征量不仅无法保证所需的稳像精度,更难以满足稳像的实时性要求。针对此种图像序列,用灰度投影法来实现图像运动矢量的准确获取从而达到稳定图像序列的目的视频图像序列是图像的灰度发生变化的图像序列,各种运动矢量估计算法均是以灰度变化为依据。投影算法能充分利用图像的灰度变化这一特点,较准确地估计出图像的运动矢量。此算法的优点是:灰度曲线匹配速度快,从而提高了稳像速度,适用于图像照度变化导致的灰度变化的情况[2]。灰度投影算法是实现只含平移运动或旋转运动较小的图像序列电子稳像的较理想算法。 (1)灰度映射。 灰度映射就是把每一帧输入的初始的二维图像信息映射成为两个独立的一维波形,如下为列投影的映射方法 式(1)~式(3)中,Colk(j)为第k帧图像第j列的灰度值;Curk(i,j)是第k帧图像上(i,j)位置上的像素值;NC是列数,ColProjk(j)是第k帧图像第j列修正后的投影值。行方向灰度投影映射的算法可以同理推出。 (2)投影滤波。 投影滤波是为了降低边界信息的幅值,保留中间区域的幅值,使用滤波器经行滤波。由于边缘信息在互相关计算时会对互相关的峰值产生不利影响,因此要将边界处的投影值去除。由于图像移动量大时,边缘信息在每一幅图像上是惟一的,所以通过对投影值进行滤波可提高算法精度。 (3)互相关运算。 互相关运算就是将当前帧图像的行、列投影曲线与参考帧图像的行、列投影曲线做互相关计算。运算后得到的相关值曲线中的惟一峰值即为补偿运动矢量所求的位移值。得到了水平方向和垂直方向的位移矢量后,就将当前图像向位移矢量的反方向平移相应大小的像素距离,从而实现图像序列的稳定。行、列相关运算的计算如式(4)所示 式(4)中Colk(j)为第k帧图像第j列的灰度投影值;NC为列的长度;m为位移矢量相对于参考帧在一侧的搜索宽度。设wmin为C(w)最小时w的值,则第k帧图像相对于参考帧图像在垂直方向的位移矢量如式(5)所示。 得到了水平方向和垂直方向的位移矢量后,就可以把当前图像向位移矢量的反方向运动,响应大小的像素距离,从而实现图像序列的稳定。 2 基于TMS320DM 642系统的设计 2.1 TMS320DM 642介绍 TMS320DM 642是TI公司推出的一款DSP芯片,这款芯片是专门面向多媒体应用而设计开发的32位定点DSP芯片,是目前业界公认的性能良好的视频处理器。良好的处理性能和丰富的片上外设,可以满足实时视频处理的要求。DM 642采用两级缓存结构,第一级,包括相互独立的L1P(16kB)和L1D(16kB),只能作为高速缓存使用。第二级,L2(256kB)是一个统一的程序、数据空间,可以整体作为SRAM映射到存储空间,也可以整体作为第二级Cache,或是二者按比例的一种组合来使用。DM 642具有64个独立通道的增强型直接存储器访问控制器,负责片内L2与外设之间数据高速传输。具有丰富的外围设备接口:3个可配置的双通道视频端口VideoPort;64bit的外部内存接口EMIF;10/100Mbit以太网MAC;66MHz32bit的PCI接口[3,4]。 2.2 系统设计 本系统的硬件框图如图2所示,仿真图像通过CCD摄像设备取得,对于取得的图像信息,通过数字视频解码器处理,把模拟图像转换成数字图像,再将数字信息存入到DM 642芯片中,经过DM 642芯片的处理,得到相邻帧之间的运动矢量,进而实时准确地对运动矢量经行补偿,得到输出视频序列,最后将处理后的视频图像显示到显示器上。 3 算法仿真结果分析 如图3和图4所示,分别反映的是稳像前后图像的列投影曲线,稳像后的列投影曲线的形状和位置基本一致,说明补偿后图像的相似度提高了,其稳定性也提高了。同时,可以使用峰值信噪比(PeakSiginal toNoiseRatio,PSNR)来评价准确度的品质因子[5]。试验结果表明,准确性达到了好的满足要求,但实时性稍差还需要进行程序优化,以达到较好的效果。 4 结束语 文中使用灰度投影算法,基于TI公司的TMS320DM 642嵌入式系统实现了电子稳像。试验结果表明,文中采用的算法不仅稳像效果好,而且达到了准确性的要求。对于不同的应用场景,具有一定的使用价值 摘要:介绍了一种解决视频图像抖动问题的电子稳像方法,系统利用灰度投影算法和德州仪器公司的定点数字信号处理器芯片TMS320DM642实现电子稳像。文中提出了电子稳像性能的基本要求,介绍了稳像的基本原理,根据要求选择了稳像算法,从而设计了系统的硬件框图,并完成了算法的仿真。实验结果表明,该算法稳效果好,且达到准确性要求。 关键词:电子稳像,灰度投影算法,数字信号处理器 参考文献 [1]李慧娟,郭宝龙.基于DM642的电子稳像的研究与实现[J].微电子学与计算机,2009,26(11):120-123. [2]赵天云,郭雷,余博.基于灰度投影的快速电子稳像算法[J].微电子学与计算机,2008,25(11):233-237. [3]Manufacturer,Texas Instruments.TMS320DM642 Video Im-aging Fixed-Point Digital Signal Processor[Z].Texas,USA:Manufacturer,Texas Instruments,2002. [4]邹彦.DSP原理及应用[M].北京:电子工业出版社,2007. 关键词:视频图像压缩,C64X,小波变换,编码,解码 1、引言 视频图像信息丰富, 采集的数字视频信号的数据量很大, 标准的PAL信号的速率为216Mb/s, 如果不压缩基本上不可能传输, 即使压缩到2Mb/s时也只能在通信干线上传输, 不能扩展到终端用户。因此需要提高压缩效率, 一方面通过图像质量的降级实现, 但主要还是提高编码效率。例如, 用于较高速率视频编码的MPEGl (VCD、1.5 Mb/s) 、MPEG2 (DVD/广播级、4~10Mb/s) , 一部DVD-5的视频素材也要约5 GB的存储空间, 目前的网络现状难以接受。 2、TMS320C6000DSP硬件结构概述 TMS320C6000是TI公司生产的TMS320系列产品中新一代高性能的DSP芯片, 适用于高速数字信号处理。TMS320C6000主要由三个部分组成:CPU内核、外设和存储器。CPU中8个功能单元可以并行工作, 这些功能单元被分成类似的两组, 每组由四个基本功能单元组成。CPU有两组寄存器, 每组寄存器由16个32位寄存器组成。由于在运行期间不做硬件数据相关性检查, 所以程序运行时可以同时执行8条指令, 极大地提高了芯片处理速度, 这使得该系列的芯片在电子测量、测控、图像、雷达、声纳和无线电等领域得到了广泛的应用。 3、压缩算法研究 小波变换是在傅立叶分析和STFT (短时傅立叶变换) 基础上发展起来的一个新的数学工具, 它可以在多种尺度 (分辨率) 下对信号在时域和频域进行局部分析, Mallat的多尺度分析理论[1,2]是小波变换的核心算法。对图像采用变换域编码的方法, 就是把图像所包含的信息从一种空间变换到另一种空间, 变换后要求图像的信息和能量不损失。小波变换具有良好的时、频局域性, 并且由于其在非平稳图像信号分析方面的灵活性和适应人眼视觉特性的能力, 已经成为图像编码的有力工具。应用三维小波变换进行视频压缩编码, 需考虑选用时、空域两组小波滤波器组。时域选用阶数较低的滤波器组, 而空域的滤波器组的选择与静止图像变换编码相似, 常用的是双正交滤波器组, 但是它的计算量较大, 因此采用提升方法来实现, 并且对提升格式的参数进行调整, 可进一步减少运算量。 目前, 基于小波变换的视频压缩算法可分为三类: (1) 基于空域运动补偿的小波视频压缩 (MC-DWT) ; (2) 基于变换域运动补偿的小波视频编码压缩 (DWT-MC) ; (3) 含运动补偿的三维小波视频编码压缩 (MC-3DWC) ; MC-DWT算法在空见域进行运动估计和运动补偿, 对残差图像以及帧内编码采用小波变换进行编码。由于运动补偿后的残差图像不同于传统的自然图像, 若采用一般图像的小波变换不能显著地提供压缩效率。另一个缺点是预测误差帧中存在面显的边界。 DWT-MC算法首先对图像进行小波变换, 在变换域中进行帧间运动估计和运动补偿, 对残差信号在进行编码。由于小波变换不具有空间不变性, 这使得小波域内无法达到精确的估计而导致大量的补偿误差。 三维小波分解所提供的多分辨率数据结构为支持可伸缩编码提供了一个良好的条件。这正是计算机网络和无线网络视频应用所需要的。所谓伸缩性是指改变一下已经压缩码流的分辨率或码率以满足在视频压缩时不能预见的要求能力, 伸缩性包括空间分辨率可伸缩、时间分辨率可伸缩、码率/信噪比可伸缩、解码可伸缩等以及他们的融合。如图1为三维小波变换视频编码系统框图。 本文采用的视频编码系统主要是由含运动补偿三维小波变换、量化、熵编码和码流组装四个部分组成, 如图2所示。设图像序列有M×N×L个像素, M, N分别为图像的列、行数, L为一组中的帧数。首先, 对输入的L帧图像进行三维提升型小波变换。然后用基于人类视觉系统 (HVS) 的视觉阈值曲线对各个子带的小波系数进行量化, 且把每个子带进一步分成固定大小的块。之后对每个子块进行位平面熵编码, 并得到各块的率失真曲线。最后, 在码流组装过程中进行码流分配。该系统的解码过程就是其逆过程。 4、视频压缩算法 (1) 小波分解:本文采用提升型小波变换对视频信号进行3级的三维小波分解得到垂直、水平和帧方向的三维小波子带。得到一个低频分辨率的图像逼近LLL3和代表不同分辨率、不同方向上的视频序列细节信息的高频三维小波子带 (LHHm, LHLm, LLHm, HLHm, HHLm, HHHm, HLLm, 其中m表示级数, 即m=1, 2, 3) 。低频子带LLLm代表视频序列时间轴方向的上下文信息, 包含图像大部分的能量, 需重点保护。对于时间轴上的高频子带采用本文的阈值量化法进行量化。时间轴低频子带的能量要高于高频子带, 当运动剧烈时, 经小波分解后的时间轴高频子带内的系数会急剧增大, 会影响算法的整体压缩效果, 而时间轴低频子带其积聚了图像信息的大部分能量, 所以不能引入太大的失真。 (2) 基于HVS的阈值量化:本文采用的量化方法是利用视觉门限曲线与小波系数的关系来构造单位小波变换系数的量化矩阵。空间变换小波是双正交滤波器组, 文献中给出图像压缩中最佳小波基阈值量化因子矩阵, 以该矩阵为基础推断三维小波变换系数的量化矩阵。当视频图像序列中物体的运动变化很快时, 在三维小波变换系数时间轴上的高频子带中会产生较大的系数值, 其量化后的数值依然很大, 所以采用如下量化方法。在量化中设立一个阈值T, 以小波分解系数的均方误差作为判断准则, 设量化矩阵为Q, 对系数按照下式量化: 其中R为量化步长。具体过程为:设PD是1个比特位, 当M≤TPD=1时, 输出码流中输出一位PD=0, 则解码器以量化矩阵Q对输入码流进行反量化;当M>T时, 输出码流中输出PD=1, 然后输出量化步长R, 用2个字节来表示, 则解码器以量化矩阵Q (1+R) 对输入码流进行反量化。 (3) 熵编码:量化后的每个子带被进一步分成固定大小的块, 并对每个子块采用位平面技术分别进行熵编码。嵌入式位平面编码器按照位平面从最高有效位N-1~0降序地进行编码, 因此在截取压缩码流时, 先保证所有系数的最高有效位平面的优先传输, 保证码流的解码质量。在每个编码之后都同时记录当前编码的码率R和对应的失真D, 得到的率失真曲线将用于后面的码流组装。 (4) 码流组装:在所有的系数块完成编码后, 根据最小化全局失真的原则用码流组装对各个块的码流进行码率分配。原始的码率控制方法采用全局最优的码率控制, 会导致帧方向上质量的颤抖。本文结合率失真优化和帧方向上质量平稳两方面的要求, 沿帧方向上采用新的码率分配方法, 同时在沿水平和垂直方向上保持了率失真优化的方法。即对于同一时间轴小波子带的分块都采用同一斜率来选取截断点;对于不同时间轴小波子带的分块, 按照不同的斜率来截断以调整时间轴方向的稳定性。可以根据式 (2) 的失真比例条件来调整截断点的斜率。 在中高码率环境下, 各时间轴子带的衰减系数β近似相等, 因此可以简单的依照下等式通过控制各时间轴子带的率失真斜率来控制失真的比例。 此处δi为等式 (2) 给出的理论失真值, m为时间轴的小波子带个数。 前面的熵编码过程中已经计算并保存了每个块的率失真曲线。为了使先传输的码率对信息失真度的降低最快, 需要保证率失真的凸性, 因此按照文献中方法对每个块的率失真曲线采取凸包络处理。每个块的失真根据所处的小波子带乘上一个能量权重, 以利用小波域的失真估计图像空域的失真: 此处w表示提升型小波合成滤波器带来的能量增益。对于双正交滤波器, 低通增益wL=1.299, 高通增益为wH=0.787。在三维方向上共经过n个低通和m个高通提升型滤波器的小波子带, 能量增益为各层增益的乘积w=wnlwmH。对所有的块的率失真曲线, 找出联合最优的率失真斜率点, 并将码流在该点截断, 然后将所有块中在同一斜率切点截断得到的码流片断组合成最终的压缩码流。最优斜率能够得出最接近目标码率的公共斜率, 每个系数块的截断码率长度也作为头信息记录在压缩码流中, 作为对压缩码流随机解码时的索引。 5、利用TMS320C64X芯片进行视频压缩实现 每帧视频图像数据通过I/O接口送入数字信号处理板, 由DSP芯片中的DMA控制器负责将数据放入输入缓冲区中, DSP对缓冲的视频图像数据进行压缩后, 通过HPI接口将压缩数据送出。 本文所采用的是基于H.264编码标准的视频压缩方法, 编码器要求进行压缩的文件格式应为YUV格式视频文件, 视频采集用微软提供的VFW (Video For Windows) 软件包来实现, 而VFW采集到的视频文件是最原始的AVI格式, 因而要进行格式的转换[3]。 从AVI格式到YUV格式的转换, 并没有直接的公式, 而AVI视频文件流的每一帧对应一个BMP (RGB) 文件, 则可以利用公式转换成YUV文件, 转换的公式如下: 其中, Cb对应U, Cr对应V, 分别表示构成彩色的两个分量 编码流程如图3所示: 6、结语 本文利用视觉特性曲线对三维小波变换后的系数进行量化, 采用具有时间轴稳定性的码率控制方法, 均衡控制解码后时间轴信号的失真。实验结果表明, 该方法的运算复杂度低, 有效降低存储空间并提高运算速度。而且该编码器压缩的视频具有良好的时间轴平稳性, 因而更加适合用户的视觉要求。同时, 对于以往小波编码中质量较差的一些帧, 压缩质量有所提高。 参考文献 [1]Mallat S.A thereory for signal decomposition.The waveletrepresentation[J].IEEE Transactions on Pattern And MachineIntelligence, 1989, 11 (7) , 67~93 [2]Mallat S.Multiresolution approximation and wavelet orthonor-mal bases of L2 (R) [J].Transactions on Mathematics Society, 1989, 6~7 [3]邵丹, 韩家伟.YUV与RGB之间的转换长春大学学报2004 [4]沈庭之, 方子文.数字图像处理及模式识别[M].北京理工大学出版社, 1998. [5]http://flydragon.ccnt.com.cn/bencandy.php?id=29135. 信息技术高速发展的今天,各种高性能的处理器层出不穷。其中,TI公司的TMS320C6000系列DSP(数字信号处理器)以其高速处理速度、出色的对外接口能力,使得它在雷达、声纳、医用仪器和图像处理等领域具有非常大的应用潜力。 TMS320C6000系列属于高性能DSP,集成了大量片上外设,包括:DMA/EDMA(直接存储器存取/扩充的直接存储器存取)控制器、McBSP(多通道缓冲串口)、McASP(多通道音频串口)和HPI(主机接口)等。多功能的片上外设极大地简化了计算机系统设计。本文主要讨论McBSP的功能扩展,介绍将其用做GPIO、UART、GPIO和SPI的方法。 1 McBSP简介 TMS320C6000的McBSP基本功能包括:全双工串行通信;双缓冲数据寄存器,允许连续的数据流;收发独立的帧同步信号和时钟信号;数据传输时的时钟利用片内或片外可选;利用DMA为McBSP服务时,串口数据读写具有自动缓冲能力[1]。其包含的接口信号有:发送时钟CLKX、发送帧同步FSX、数据发送DX、接收时钟CLKR、接收帧同步FSR、数据接收DR以及外部时钟CLKS[1]。由于McBSP所具有的这些功能,设计中可方便地将McBSP配置为UART(通用异步收发器)、SPI(串行外围接口)和GPIO(通用输入输出)接口等。 下面详细介绍将McBSP扩展成为GPIO,UART和SPI的具体方法。 2 McBSP配置为GPIO GPIO在系统设计中,通常要用来简单地设置标志或监控状态。具体使用中,通过把信号的某一位设置为“1”或“0”,或是采集某一输出的状态,来触发或是响应某一事件。McBSP可轻松实现GPIO功能。 在将McBSP配置成GPIO时,只需把SPCR寄存器中的undefined和undefined位设置为0,同时PCR寄存器中的XIOEN位和RIOEN位设置为1。此时的McBSP处于复位状态,串口引脚即为GPIO。通过设置PCR寄存器中相应位的值,CLK、FSX、DX、CLKR和FSR可配置为输入或输出,而DR和CLKS固定为输入[1]。当然,某一信号初始化为输入时,必须经过重新初始化设置才能由输入变为输出。GPIO引脚上输入输出的值映射在寄存器PCR的对应位上。某一引脚的初始化程序为: //发送端处于复位状态 RESET_BIT(MCBSP_SPCR_ADDR(1), XRST); //接收端处于复位状态 RESET_BIT(MCBSP_SPCR_ADDR(1), RRST); //设置CLKX为GPIO输出 SET_BIT(MCBSP_PCR_ADDR(1), CLKXM); 3 McBSP配置为UART UART是计算机系统中常见的通信接口,用做数据的串并转换。实际中,通常使用8252或专用的UART器件(如16C450)实现。通过把McBSP配置为UART接口,可极大地带来系统设计的灵活性,并减少外围芯片的使用和降低系统功耗。 TMS320C6000的McBSP本身不具备UART功能,但可通过一些设置,将其配置为标准的UART接口。 如果外接电平转换电路,即可配置为标准的RS-232或RS-422协议接口,可轻松实现与PC机的连接[3]。 从工作原理分析,UART为异步传输,因此在传输过程中不需要时钟。其传输协议包含开始位、数据位、校验位和停止位4个部分。在UART的数据传输时序中,由高到低的电平转换指示的开始位,刚好提供给McBSP检测数据的契机;McBSP本身也是异步接口,软件配置的数据格式灵活多变。因此,通过软件配置的McBSP,可轻松地设计为UART。McBSP配置为UART的方法有两种:一种为串行接口模式;另一种为GPIO模式[2]。 3.1 串行接口模式UART 3.1.1 基本原理 McBSP在接收UART数据时,串行异步数据既包含帧信息,又包含数据信息。为了完整地检测到发送的数据,UART的Tx必须同时连接到McBSP的DR和FSR。而发送数据端,直接由McBSP的DX连接UART的Rx。因此,硬件连接图如图1所示。 在数据处理的格式上,TMS320C6000把1 bit的UART数据当做一个16 bit字处理,即UART的1 bit数据需扩展为16 bit的McBSP数据,扩展方法见图2。 因此,一个8 bit的数据要从McBSP接口发送出去,必须按照图2的方法扩展,同时还要加上开始位(0x0000)和停止位(0xFFFF)。但是,停止位是按照8 bit处理的,这样处理可方便地设置1.5个停止位。在实际的设计中,McBSP接口并没有这样的数据扩展功能,因此,设计者必须考虑通过编程来解决这一问题。从图2可以看出,首先发出的是LSB。 传输过程中,McBSP数据采样的时钟可由内部的采样率发生器分频CPU时钟提供。按1 bit UART数据对应16 bit McBSP数据的格式,McBSP时钟应为16倍UART波特率。波特率对应SRGR寄存器的设置可按下式计算: undefined 在发送数据时,必须先把1字节的待发送数据扩展为连续的8个16 bit数据,并且在数据段上添加UART的开始位和停止位。扩展数据后,才能把数据写入McBSP的发送寄存器DXR中,通过UART的格式发送出去。同时,接收到McBSP数据后,要经过解析才能得到真正的数据,0x0000表示“0”,而0xFFFF表示“1”。在解析过程中,必须抛掉开始位和停止位,才能正确解析接收数据。 在实际使用中,如果CPU把大量的时间花费在数据的“搬运”上,势必会降低其使用效率。因此,这里启动DMA或EDMA来搬运数据,将极大地节省CPU处理的时间。发送时启动DMA,数据由缓冲区写入McBSP的DXR;接收时启动DMA,McBSP接口接收到的数据传送至用户设定的数据缓冲区中。传输完成前,CPU可处理其他事项。 3.1.2 具体配置 按照3.1.1节中介绍,首先要把McBSP配置为UART传输格式,然后再启动DMA或EDMA传输。McBSP的配置中,MCR、RCER和XCER三个寄存器为缺省模式,而SPCR、RCR、XCR、SRGR和PCR寄存器的配置非常关键。DMA或EDMA的配置根据选择的通道来决定。TMS320C6000系列DSP都提供多个通道的DMA或EDMA,另一个McBSP的UART传输需要两个DMA通道,一个负责发送,另一个负责接收。发送时,DMA向McBSP_DXR写入一个16 bit数据,并等待McBSP_DXR为空后写入第2个数据,数据缓冲区为空后触发中断,通知CPU可进入下数据段的发送程序;接收时,McBSP_RXR寄存器有数据后启动DMA一次传输,11次DMA传输完成后可触发中断,中断服务子程序ISR解析数据,1个字节接收完成。 处理过程中,发送数据的扩展和接收数据的解析非常关键,直接涉及收发数据的正确与否。发送扩展的具体处理可参考如下程序: //指到发送缓冲 xmitbufptr=(unsigned short *)xmitbuf; for(i=0;i<(sizeof(xmitbuf)/sizeof(unsigned int));i++) { //清空缓冲区 xmitbufptr[i]=0x0000; } xmitbufptr =(unsigned short *)xmitbuf; for (i = 0; i < BUFFER_SIZE; i++) { //取出要扩展的1个字节 xmit_char = xmit_msg[i]; //具体扩展 for (cnt = -1; cnt < 10; cnt++) { if(cnt == -1) *xmitbufptr++ = 0x0000; else if (cnt == 8 || cnt ==9) *xmitbufptr++ = 0xFFFF; else if (xmit_char & (1 << cnt)) *xmitbufptr++=0xFFFF; else *xmitbufptr++=0x0000; } } 在数据的接收过程中,抛掉开始位和停止位是解析数据的关键,其具体处理过程可参考如下程序: //指到接收缓冲区 recvbufptr= (unsigned short *)recvbuf; //处理所有接收缓冲区中的数据 for(i=0; i < BUFFER_SIZE; i++) { recv_char = 0; //处理每个UART数据 for (cnt = -1; cnt < 10; cnt++) { //抛掉start位和stop位 if(cnt == -1 || cnt == 8 || cnt == 9) { *recvbufptr++; } else { //取一个16bits数据 raw_data=*recvbufptr; recvbufptr++; //0x0000为0,0xFFFF为1recv_val=VoteLogic(raw_data); //解析1bit UART数据 recv_char+=recv_val< } } //解析后的数据存如recv_msg[i] recv_msg[i]=recv_char; } 3.2 GPIO模式UART 3.2.1 基本原理 TMS320C6000 McBSP的CLKX、FSX、DX、CLKR、FSR、DR和CLKS引脚配置为GPIO模式后,通过软件的配合,也可与UART接口连接。这里主要讨论DR和DX作为GPIO,与UART连接的情况。其具体电路图如图3所示。 当工作在GPIO模式下,McBSP的其他寄存器都不用设置,缺省模式即可。此时,以下问题值得关注: a) UART波特率的检测:自动波特率检测,通过测试开始位和第1个数据位的长度,得到1/2的波特率。检测的方法是读取PCR寄存器的DR_STAT位,并且软件计时。 b) UART接收数据处理:接收数据时,等待1/2波特率后,读取DR_STAT位的值即为UART的数据位。 c) UART发送数据处理:写PCR寄存器的DX_STAT位,即发送数据;写“0”表示开始位,写“1”表示停止位,中间的数据发送按位进行,发送的频率按检测的波特率。 3.2.2 设置方法 McBSP配置为GPIO后,通过软件收发UART数据。数据收发过程中,按位解析数据的步骤必不可少。通过编写波特率检测,数据收发子程序,可极大地简化接口数据处理。波特率检测子程序如下: unsigned int SoftUartSpeedDetect(void) { volatile unsigned int speedcounter,i; MCBSP_IO_ENABLE(1); speedcounter=0; while( (int)MCBSP_DRSTAT(1)); while(!(int)MCBSP_DRSTAT(1)) { //计数开始位 speedcounter++; } while( (int)MCBSP_DRSTAT(1)) { //计数第一个数据位 speedcounter++; } MCBSP_DX_IO_H(1); /*wait long enough for one char*/ for(i=11*speedcounter;i>0;i--) { //计数数据除2得到实际波特率 speedcounter>>= 2; return(speedcounter); } 4 McBSP配置为SPI SPI为常用的4线串行外围接口,包括MISO(主设备输入、从设备输出),MOSI(主设备输出、从设备输入),CLK(移位时钟)和SS(从设备使能),分主、从两种工作模式。McBSP的数据同步时钟具有停止控制选项,因此可以与SPI协议兼容。McBSP支持2种SPI传输格式,可在SPCR寄存器的CLKSTP位中设置,以此控制SPI_CLK的时钟是半波高电平或半波是低电平开始。 4.1 基本原理 McBSP初始化为SPI,需小心设置McBSP的寄存器。McBSP寄存器的设置不但要正确无误,还要按一定的顺序。McBSP_CLKX要配置为SPI_CLK,时钟频率的选择根据系统需要;数据格式的选择,可灵活设置8 bit,12 bit,16 bit,32 bit;McBSP配置为SPI模式后,分为主模式和从模式,系统设计时需根据要求设置。 4.2 具体配置 McBSP配置为SPI,必须按照特定流程,对其寄存器进行设置。数据传输的长度以及波特率的设置,根据系统需求配置。其初始化程序如下: //收发端口复位 RESET_BIT(MCBSP_SPCR_ADDR(0),XRST); RESET_BIT(MCBSP_SPCR_ADDR(0),RRST); //配置SPCR PCR RCR XCR SRGR寄存器 spi_config(); //启动采样率发生器 SET_BIT(MCBSP_SPCR_ADDR(0),GRST); asm("nop 2"); //时钟开始的延迟位数 LOAD_FIELD(MCBSP_SPCR_ADDR(0),3,CLKSTP, CLKSTP_SZ); //使能串口的收发 SET_BIT(MCBSP_SPCR_ADDR(0),XRST); SET_BIT(MCBSP_SPCR_ADDR(0),RRST); asm("nop 2"); 5 结束语 在系统设计中尽可能使用DSP集成的片上外设,是提高系统性价比的有效方法之一。TMS320C6000的McBSP具有强大的接口功能,配置为不同的模式后,可完成不同的系统连接。在TMS320C6000广泛应用的今天,多功能的McBSP可极大地增加系统设计的灵活性。本文介绍的McBSP功能扩展方法已在多个嵌入式计算机系统设计实现。实际应用表明,McBSP工作稳定可靠,并且McBSP接口之间的工作模式互不影响。 参考文献 [1]李方慧,王飞,何佩琨,等.TMS320C6000系列DSPs原理与应用[M].2版.北京:电子工业出版社,2003. [2]Texas Instruments Incorporated.Application Report SPRA633B[M].2004. 【320C】推荐阅读:320C 篇3
320C 篇4
320C 篇5
摘要:PPP是TCP/IP协议族中的重要协议之一,它能适应多种传输介质,安全性好,适合在嵌入式系统中使用。本文结合TMS320C6x的网络开发包,研究基于PPP的嵌入式网络接口设计方案,介绍一种以低层PPP API为基础的设计方法。320C 篇6
320C 篇7
320C 篇8
320C 篇9
320C 篇10