基于VDK的网络音频监控系统的设计与实现
扫描二维码
随时随地手机看文章
摘要:提出了一种基于ADI公司的ADSP-BF533和网络芯片LAN91C111的网络音频监控系统的设计与实现方案。介绍了VDK的组成与工作原理、TCP/IP堆栈移植、基于VDK的SOCKET编程、BF533和LAN91C111的电路连接,最后给出了基于VDK的网络通信程序的实现方法。
关键词:数字音频;VDK;BF533;LAN91C111;SOCKET;网络通信
0 引言
近年来,数字音频监控系统在我国发展迅猛,尤其是在广播领域,该系统担当着越来越重要的角色,另外,在保证音频信息准确度和实时性的条件下,实现音频数据的网络传输也成为一项十分重要的技术。
本系统以BF533为核心处理芯片,以软件工具VDSP++的自带VDK内核为基础,移植了LWIP作为网络主要结构,实现了TCP/IP在ADSP-BF533
上的移植。同时在VDK的基础上,通过开发Socket服务器程序,实现了嵌入式网络终端与上位机电脑直接的数据传输。
1 VDK的组成原理
VDK实际上是一种带API函数库的实时操作系统内核,这是一款规模很小但却十分健壮的内核,它是Visual DSP产品的一部分,VDK也一样会随Visual DSP进行相应的升级或改版。使用VDK从产品维护的角度来看,是十分方便的。使用VDK也小会带来附加成本。它具有任务调度和任务管理功能,一共可支持32个任务。VDK是整个软件的基础,所有其他的程序都运行在该Kernel上。VDK的组成部分主要包括线程、调度、信号、中断眼务程序设备驱动、API等。
VDK的工作原理是首先引入多任务并且为每个任务都分配自己的堆栈空间,然后由任务渊度器来决定哪个任务获得内核时间。任务调度主要涉及三种方式:
第一是合作调度厅式。该方式是最简单的调度方式,系统中所有线程被赋予相同优先级的调度权,系统中线程在运行态占用处理器资源,在阻塞态时被排列在等待队列的最后,也可以自己调用yield函数,以使线程退出运行态而进入等待队列。另外,任何系统调用都会引起当前正在运行的线程阻塞。
第二是时间片轮转调度方式。时间片调度方式给予每一个优先权相同的线程固定的执行时间间隔。VDK中时间间隔是通过设定tick参数确定的。
第三是抢先式调度方式。如果等待队列中有比正在运行的线程优先级更高的线程,则正在运行的线程阻塞后进入等待队列,等待队列中优先级最高的线程获得执行权。该方式提供了比其他两种方式更有效、而且更灵活的渊度方式。对嵌入式编程者来讲,最熟悉的调度方式就是“时间片轮转”的方式,在这种方式下,每个应用程序只占用很短的CPU时间,用户几乎无法察觉它们在进行轮换。操作系统或VDK会自动地将操作系统的控制权以轮转调度或时间片的方式在所有线程之间进行传递。每个线程所得到的处理器控制时间的长度由程序员定义。该方式的优先级可以被静态地分配,也可以被动态地分配。静态分配意味着应用程序在创建时就已经被指定好了优先级。动态分配则意味着程序的优先级在其运行时仍能被改变,也就是说,在线程实体化或运行时,其优先级都能被改变。
2 TCP/IP堆栈移植
关于TCP/IP堆栈移植,ADI提供有快速解决方案,即一个轻便型堆栈Lwip。Lwip(Light-weight Internet Protocl)是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等人开发出来的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip的主要优点是可在保持TCP/IP协议主要功能的基础上,减少其对RAM的占用。一般情况下,它只要几十KB的RAM和40KB左右的ROM就可以运行,这使得Lwip协议非常适合在嵌入式系中使用。
Lwip堆栈的调用基于ADI的驱动模型以及System Services Libraries(即系统服务函数库)。Lwip堆栈支持IP、ARP、ICMP、TCP、UDP等基本协议,同时支持一套标准的BSD Socket接口函数。
3 基于VDK的SOCKET编程
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,以区分不同应用程序进程间的网络通信和连接。生成套接字主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket的原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket的绑定,应用层就可以和传输层通过套接字进行接口,以区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket;另一个运行于服务器端,称之为erver So cket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤,即服务器监听、客户端请求和连接确认。
4 硬件电路设计
4.1 ADSP-BF533简介
ADSP-BF533处理器是Blackfin系列产品中的一员。其最大工作频率可达600MHz。Blackfin处理器内核包含有2个16位乘法器、2个40位累加器、2个40位ALU、4个视频ALU和1个40位移位器,可处理来自寄存器组的8位、16位或32位数据。
4.2 LAN91C111简介
ADSP-BF533通过以太网接口可将DSP采集的数据信息传送到远程服务器。LAN91C111是SMSC公司生产的专门用于嵌入式产品的10/100M快速以太网控制器,该器件具有可编程、CRC校验、同步或异步工作方式,并具有低功耗CMOS设计和小尺寸等特点。
4.3 ADSP-BF533与LAN91C111的硬件连接
ADSP-BF533与LAN91C111之间的信号传输连接图如图1所示。
该硬件系统由四大部分组成:其中主控芯片选用ADSP-BF533,以太网控制芯片选用LAN91C111,网络隔离芯片选用TG110-E050N5,而网口存储器则选用AT93C46。
由于LAN91C111是专为嵌入式系统设计的,因此其外围电路相对比较简单。只要将地址总线A1-A15与系统对应相连即可。其A0没有被LAN 91C111使用而悬空;数据总线D0-D15用于16位数据传输。LAN91C111端的D16-D32悬空;LAN91C111的片选信号AEN由DSP提供。字节选择引脚BE0和BE1分别接DSP的ABE0和ABE1,而BE2和BE3直接接高3.3 V电压,即选定的是16位操作模式。AEN作为片选信号,接DSP的AMS3引脚。DSP芯片利用I/O引脚和中断引脚可实现对以太网控制器LAN91C111芯片的控制和数据传输。以太网控制器LAN91C111芯片通过网络隔离芯片TG110 -E050N5并经RJ45与外面的上位机相连接,以实现数据传输。TG110-E050N5是双绞线驱动/接收器,内部有2个耦合变压器可用来传输信号,同时抑制来自介质的共模噪声/干扰。AT93C46是一片串行数据存储器,该芯片不论写入或读取数据,皆采用串行传输的模式动作,串行方式虽然没有并行传输来得快速,但是其传递远距离的数据,却可以大量减少使用传输线的需求,也缩小了系统整体的占有面积。因此,非常适合用于微控制器或是微处理器。
5 基于VDK的应用程序设计
本系统中的网络通信模块主要完成的任务是网络芯片初始化及接收应急信号,接收上位机指令帧并对其进行解析,同时将选择板卡返回指令帧发送给上位机。
分析上述任务,可将应用程序分为三个线程:其中一个Boot Thread:lwip_sysboot_threadtype的作用是上电后对系统进行初始化并创建各个线程,然后激活Echo_Server_ThreadType线程,完成与上位机的客户端建立Socket连接;其次,初始化线程级别最高;连接成功后,由Echo_Servet_ThreadType线程激活Echo Worker_ThreadType线程,Echo_Worker_ThreadTrype线程的任务为通过recv()函数接收上位机指令帧并对其进行功能解析,然后根据帧功能码判断应该发送给上位机的帧,准备好上传数据,再通过send()函数将上报帧上传给上位机并显示最终处理结果。
图2所示是基于VDK的系统线程软件工作流程。系统上电或复位后,DSP自启动后,VDK启动线程lwip_sysboor_threadtype开始运行。在线程lwip_sysboot_threadtype中进行板级初始化和Lwip协议栈和网口初始化,接下来再创建所需要线程。图3所示是VDK线程的通信工作流程图。
芯片初始化模块主要完成以下几项工作:
(1)系统时钟速率配置:包括初始化PLL,由PLL_LOCKCNT设置稳定时间,PLL_CTL控制寄存器设置VCO与CLKIN之间的倍数14,通过设置PLL_DIV决定SCLK及CCLK的时钟,使能PLL中断;
(2)同步串口(SPI)配置:如果SPI是作为主启用,SPI使用SPI标志寄存器(SPI FLG)使多达7个通用可编程标志引脚用作从选择端。并设置为0X02,SPISEL1使能。FIO_DIR中设置PF10为输入,其余均为输出;
(3)CS8420初始化:即初始化CS8420,则SPICTL设置字长为16位,当发送数据写入发送数据缓冲器时,SPI使能。设置为主模式。SPI BAUD为0x18,波特率大概为512b/s;
(4)激活Echo_Server_ThreadType线程;
(5)由线程销毁模块完成对初始化线程的销毁。
连接成功后,再由Echo_Server_ThreadType线程激活Echo_Worker_ThreadType线程。Echo_Worker_ThreadType线程的任务是通过recv()函数接收上位机指令帧并对其进行功能解析,根据帧功能码判断应该发送给上位机的帧,准备好上传数据,再通过send()函数将上报帧上传给上位机并显示最终处理结果。
图4所示是系统控制板卡与上位机之间的通信结果。
6 结语
本文以BF533为核心处理器,提出了一种基于VDK的网络音频通信系统的设计方案,同时通过实际项目的操作对该方案的可行性进行了验证。经过测试证明,该系统可以提高传输效率,而且实时性好,性能稳定。