"); //-->
SoPC(System on Programmable Chip)是一种特殊的嵌入式系统。首先,它是一种SoC系统,即由一个芯片完成系统的主要逻辑功能;其次,它是可编程的片上系统,即可配置、可裁减、可扩充、可升级,具有硬件系统的可编程性。采用SoPC的设计,具有很大的灵活性。它可以根据需要定制各个硬件模块,包括处理器、总线、存储器和通信模块等,这就使得在一个芯片上搭建一个按需定制的SoC系统成为可能。而Linux系统也因为其良好的可裁减、可配置的特点广泛应用于各种嵌入式系统,Linux操作系统提供了许多系统级的应用,例如网络协议的实现、进程调度、内存管理等,同时Linux是一个成熟的开源操作系统,有丰富的应用资源。利用这些资源和强大的系统功能,用户可以基于嵌入式Linux快速地开发出面向复杂应用的嵌入式系统。因此,结合SoPC和Linux优势,可以很好地满足嵌入式系统根据需求量体裁衣,去除冗余。本文给出基于Linux的SoPC应用系统的开发方法及一个具体的嵌入式应用开发实例。
1 硬件开发环境
1.1 开发平台
本文所采用的开发平台是AVNET公司生产的VIRTEX-II PRO FF1152开发板,它使用XILINX公司的Virtex-II Pro FPGA芯片XC2VP50-6FF1152C,同时开发板还有2个8MB×32的SDRAM存储器、2个RS232接口、一个以太网接口、1个LCD显示屏、8个LED灯,同时支持SPI-4.2的高速16bit LVDS接口、iSFP GbE光纤接口、System ACE接口以及一个P160标准的扩展模块[1]。
1.2 基于PowerPC的片上系统
XC2VP50-6FF1152C芯片内部含有两个IBM PowerPC 405核。PowerPC405是32位的RISC处理器,它采用IP植入架构的形式整合到XILINX公司的Virtex-II Pro FPGA器件中。
PowerPC硬核具有许多优点适合软件的开发设计[2]:具有三个定时器:即可编程的内部定时器、固定的内部定时器和看门狗定时器和灵活的存储管理和用于加强计算功能的乘法累加指令。PowerPC的强大功能可以胜任许多复杂应用系统对处理能力和运算速度的需求。同时,利用双核机制以及操作系统的进程调度可以大幅度地提高处理速度。
通过XILINX公司的EDK开发软件,可以很方便地在Virtex-II Pro系列芯片上搭建自己需要的硬件系统。处理器方面可以选择硬核IP:PPC405,或者软核IP:Microblaze;总线有OPB和PLB两种总线可供选择;同时,还有丰富的外围IP可以选择;在通信方面,分别有支持高速和低速的通信模块。支持高速的IP有:plb_etherne、opb_ethernet、opb_ethernetlite和plb_gemac等,支持低速的IP有:opb_iic、opb_spi、opb_uart16550和opb_uartlite等;在存储控制器方面,可选择的 IP有opb_sdram、opb_ddr、opb_emc、opb_sysace、plb_sdram、 plb_ddr和plb_emc等模块;其他方面还有支持中断、定时、GPIO、PCI等功能的IP模块。丰富的IP模块,加上可以利用IPIC(IP Interconnect)连接用户定制的IP,因而用户使用CPU时,不需要再另外使用一个SDRAM控制器芯片,或者另外使用一个以太网的控制芯片,极其方便。
可编程片上系统由处理器、总线互连和外围设备等组成,典型的基于PowerPC的片上系统的架构如图1所示。
1.3 CoreConnect的总线结构[3]
总线互连是片上系统的一项关键技术。本系统采用了CoreConnect的总线结构。该总线结构是IBM公司开发的一种片上通信的总线互连技术。它的应用使得系统核、外设核、处理器核的复用、连接变得更加容易。这里,系统核是针对PLB总线上的功能IP模块的,而外设核是针对OPB总线上的功能模块的。CoreConnect总线互连是由本地逻辑总线PLB(Peripheral Logic Bus)、片上外围总线 OPB(On chip Peripheral Bus)、一个总线桥、两个判决器,以及设备控制总线DCR(Device Control Register构成的,其结构如图2所示。
2 基于Linux的SoPC系统构建
系统的构建包括,硬件平台的搭建和Linux操作系统的移植。首先进行项目需求分析,决定实现系统需要的硬件IP核,继而搭建硬件平台。硬件平台构建完成之后,利用EDK软件生成相关的硬件参数文件和设备驱动文件。用户需要利用生成的文件构建Linux内核,同时需要构建适用于内核的根文件系统,最后在构建完成的操作系统的基础上开发所需功能的应用程序接口。其中根文件系统的构造要考虑内核中提供的服务和功能以及应用程序所需的系统命令等。同样所要实现的应用功能又影响着内核服务和功能的选择。根文件系统、应用程序接口以及内核三者是互相影响的。具体的构建流程图如图3所示。
2.1 利用EDK搭建硬件系统
利用EDK8.2软件搭建硬件系统,因为基于Linux的操作系统设计中,CPU、RAM和总线是必须的。由于芯片内部的BRAM只有128kb/s, 而下载Linux内核的.elf文件通常远大于这个容量,因此需要使用外部的存储单元。本文使用opb_sdram存储控制模块实现此功能。本文使用Uart16550控制模块,能方便地通过RS232端口观察测试的结果。为满足本文应用的需要,可以使用Uartlite模块实现RS232的COM2端口和外部设备通信的功能。添加Ethernet_Mac的IP模块,可使用以太网端口将开发板连接到网络上。为了调试的方便,可以加入GPIO模块。通过GPIO控制LED灯,可显示系统状态。若选择应用程序初始化硬件,当bit数据下载到FPGA系统正常运行时,可以观察到LED灯被点亮。另外,根据设计需求,也可以挂载用户定制的IP,以处理用户的特定的需求。
选择参数时,可以使用默认值,而存储器参数可以选择容量大一些的。使用的PowerPC 405硬核,PPC的工作频率设置为100MHz, 参考时钟和系统的总线频率也分别设置为100MHz;使用的BRAM模块IBRAM和DBRAM速率分别设置为64Kb/s。最终定制的SoPC硬件系统如图4所示。
2.2 SoPC的Linux系统构建
在SoPC的硬件系统构建完成之后,利用EDK软件生成的板级支持包(BSP)配置编译内核。BSP包含了所选定处理器架构的属性文件以及相关硬件的驱动源文件。将这些文件加入到Linux内核中,然后配置内核选项选择对应的处理器架构、所选硬件的驱动模块以及需要的其他内核模块,之后再对完成配置的内核进行编译,生成Linux的内核image文件。
生成内核image文件之后,还需要生成系统运行所需要的根文件系统。根文件系统中包含了嵌入式Linux系统的所有应用程序、库以及系统配置等相关文件。根文件系统中常用的程序和命令可利用开源软件Busybox构造。构造完成之后,在Busybox生成的目录和文件的基础上再构造根文件系统的目录树,并添加相关设备文件和配置文件以及系统运行时需要的脚本文件,从而形成最终的根文件系统。至此,就可以将文件系统作为映像编译到内核中,也可以通过网络使用NFS文件系统加载根文件系统。
3 应用举例
以一个多进程的嵌入式Web服务器用于实现控制远程设备的的开发为例,阐述在基于Linux的SoPC系统上开发应用程序的过程。嵌入式Web服务器的开发包括HTTP协议裁减和具体的应用程序实现。用户可以通过向Web服务器发送CGI请求的方式使服务器通过串口和外部设备通信,达到远程控制的目的。
3.1 HTTP协议裁减
嵌入式Web服务器主要基于HTTP协议进行设计,而HTTP协议的实现又是基于TCP/IP协议栈的。在Linux内核中,由于已经包含了TCP/IP协议栈的完整实现,从而为嵌入式Web服务器的实现提供了很好的基础。相对于在无操作系统环境的SoPC上实现Web服务器来说,基于Linux系统的开发可以节省大量的工作。
HTTP协议是一个属于应用层的面向对象的协议,由于其采用简捷、快速的方式,适用于分布式超媒体信息系统[4]。嵌入式Web服务器根据不同的需要,实现的功能也不同。相对于完整的Web服务器,它需要实现的功能要简单得多[5]。本文的嵌入式Web服务器仅实现协议中最常用的部分。考虑到嵌入式系统的存储空间和处理能力,对HTTP协议进行了裁减。这不仅可以提高Web服务器的效率,也可以减少占用的空间,具有积极的意义。
当客户机与Web服务器进行会话时,客户机首先通过SOCKET与服务器建立连接,连接之后便向服务器提出请求,请求信息包括希望返回的文件名和客户机信息等。客户机以请求头(包括HTTP方法和头字段[6])的形式将信息发送给服务器。HTTP方法常用的有GET、HEAD、POST,因此本文即采用GET、HEAD、POST三种方法。
HTTP头字段包括general-header、request-header、response-header、entity-header四大类,而每一类中又定义了多个类型[6],其中的大部分都是不常用的,所以应根据需要选定几种类型。本文设计的服务器支持以下几种头类型:Date、Host、Server、Accept、Connection、Content-Type、Content-Length、Accept-Charset、 Accept-Language。
服务器收到一个请求,就会立刻解释请求中所用到的方法,并开始处理,处理完成之后会发送应答消息。应答消息包含了状态码、一些头字段以及实体信息(即客户请求的服务器上的资源内容),其中HTTP协议的状态码也有四大类[6]。这些状态码详细说明了服务器的状态、出错信息以及对用户的指示。由于嵌入式Web服务器只需向用户提供服务,而无需向用户反馈具体的状态,因此,本文实现中只保留特定的几种错误信息,而省略了大部分的状态信息。
3.2 支持多进程的嵌入式Web服务器的实现
本系统的设计对HTTP协议进行了裁减,然后利用Linux系统提供的进程调度功能、网络通信功能(包括SOCKET、TCP连接等),使用C语言编写了一个支持多进程的Web服务器。实现的Web服务器接收客户端的请求,根据需要选择发送文件通过串口和外部设备通信,并将外部设备返回的结果发送给客户端。其功能描述如下:在指定的端口监听用户的HTTP请求,对该请求进行分析解释并执行相应的操作;将用户要求的内容或者出错信息以HTTP应答的方式返回给用户。其中,用户的请求分为CGI请求和非CGI请求,如果是CGI请求,则首先检查用户的权限和文件是否存在,然后新创建一个进程,并在该子进程中通过串口和外部设备通信,最后将串口返回的结果或者出错信息传送给Web服务器返回给用户;如果是非CGI请求,则只进行权限和文件检查,如果检查通过则发送该文件,否则给出出错信息。软件的工作流程如图5所示。
本文给出了基于Linux的SoPC开发的方法,并实现了一个具体的应用设计——嵌入式Web服务器。该设计快速、简单,而且由于基于Linux操作系统,从而保证了系统的稳定性,同时因为利用了系统的进程调度功能,加快了信息的处理速度。SoPC和嵌入式Linux操作系统二者的结合,既满足了嵌入式应用按需定制、量体裁衣的需求,又能开发出稳定而功能强大的嵌入式系统。这在嵌入式应用日益复杂的背景下,具有很大意义和良好的应用前景。
参考文献
[1] AVNET. Virtex-II Pro FF1152 development board user’s guide. https://www.em.avnet.com. 2005.
[2] 董代洁.基于FPGA的可编程SoC设计.北京:北京航空航天大学出版社,2006.
[3] IBM. Core connect bus architecture. http://www-03.ibm.com/chips/products/coreconnect/. 2004.
[4] DOUGLAS E C.用TCP/IP进行网际互联(第一卷):原理、协议与结构. 第四版.林瑶,译.北京:电子工业出版社, 2001.
[5] 刘殿敏, 李科杰. 基于Linux嵌入式HTTP网络服务器的设计与实现[J]. 计算机工程,2004,(23):193-195.
[6] FIELDING R, GETTYS J, MOGUL J, et al.RFC2616: Hypertext transfer protocol——HTTP/1.1. The Internet Engineering Task Force, June 1999.
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。