开放源码的嵌入式仿真环境SkyEye(二)
——
第一种是BSD API。这种API非常像BSD标准UNIX中的socket API,所以对其这样命名。它跟普通的socket API一样,是基于open-read-write-close模型的。它提供了一种标准的方法来使用LwIP协议栈。但这种API效率较低,消耗资源较多,因此不推荐使用。
第二种称为RAW API。这种API接口实际上是直接使用了LwIP协议栈中的回调函数(call back functions),从而使应用程序和协议栈代码能够更好地集成在一起,运行同一个线程即任务中。RAW API相对于普通BSD API来说,速度更快,消耗内存资源更少;唯一的缺点是编程复杂,对程序员的要求高。考虑到我们是在嵌入式设备中工作,这样的缺点是可以接受的。事实上,BSD API就是用RAW API来实现的。
利用Berkley API实现的tcpecho_thread是一个TCP Echo服务器,监听7号端口,这实际上是实现了RFC中最简单Echo协议:收到什么,就往回发同样的内容。编译运行后,用ping IP地址命令可以得到ICMP reply响应。用telnet IP地址7(登录7号端口)命令可以看到Echo Server的回显效果。说明ARP、ICMP、IP、TCP协议都已正确运行。
5.2μC/OS-II只提供了操作系统内核,用户要自己添加文件处理、人机界面、网络接口等重要部分。大部分人认识OS都是从这里开始的。
由于SkyEye下的仿真串口UART已经实现了中断方式的接收(实际是从键盘接收输入)和输出(实际上是输出到终端屏幕),所以实现一个类似Bash的简化版Shell并不困难。其本质思想就是:Shell作为一个μC/OS-II下的任务,工作于内核之外,占用一个任务号。它接收用户输入的字符,存储到缓冲区,并回显到屏幕上,以回车键为用户输入的结束信号,随后解析用户输入的命令名称、参数,调用相应的命令函数。一直到这个命令函数运行返回,才继续Shell的人机交互界面。
我们目前在μC/OS-II下实现的Shell被命名为Genie Shell。它实现了最基本的命令输入、解析参数、调用命令函数功能,以及两条示例性的命令。这个Shell的特色是采用了一些面向对象的思路来实现Shell的各种命令。Genie Shell把每个命令看成一个对象,对象的属性是命令名,而对象的方法就是命令的执行函数本身。用户输入命令及参数后,将参数传递给对象的方法并执行。要Shell中增加一条命令,就是增加一个对象,并实现这个对象的方法,以利于今后做进一步的扩充。
5.3μClinux上的应用程序
目前μClinux-dist-20030305已经可以在SkyEye上运行。其中的sash(shell)、ping、ifconfig、telnet,telnet server、ftp、ftp server、boa(http server)、mount with nfs support等主要的应用程序都可以成功地运行在SkyEye中,而且不需要对应用程序进行任何修改。
6 SkyEye正在开展的工作
6.1 LCD仿真
作为单片机系统重要的输出设备,LCD屏幕用得非常广泛,因此,我们认为有必要为SkyEye加入LCD控制器设备仿真。我们使用GTK+图形函数库在Xwindow中模拟出一个LCD屏幕,这样在SkyEye上运行的OS,其LCD驱动程序会像驱动真正的LCD控制器一样发送控制命令,而SkyEye解释这些控制命令,并且应地在GTK+绘出的窗口中画不同灰度或颜色的点。这里对GTK+的使用仅限于绘制窗口和画点,因为这是LCD屏幕的最基本动作,其它所有的工作如画图、GUI的实现都应该由应用程序利用画点的功能去实现,与SkyEye本身无关。
LCD的buffer RAM是映射到内存RAM中的。LCD屏幕的每个点对应内存中的1位或几位,各个点所对应的内存按行序连续存放。LCD上显示什么内容,完全由这块内存决定。LCD仿真控制器会根据这块内存去刷新屏幕显示,刷新频率等参数要根据具体使用的LCD屏幕来决定。OS中的LCD驱动程序要往LCD屏幕上写东西,就是写这块内存。
6.2 基于ARM的其它体系结构的仿真
S3C4510B是三星公司推出的针对嵌入式应用的16/32位嵌入式处理器,是一款应用十分广泛的嵌入式处理器。该微控制器专为以太网通信系统的集线器和路由器而设计,具有低成本和高性能的特点。S3C4510B中内置了ARM公司设计的16/32位ARM7TDMI处理器,可以执行32位的ARM指令,也可执行16位的THUMB指令,并集成了多种外围部件。目前,SkyEye仿真的体系结构还比较少,尝试对S3C4510B的仿真,一方面是使SkyEye能够支持更多的体系结构;另一方面,通过仿真S3C4510B,有助于为SkyEye设计可扩展框架,使SkyEye更具通用性和模块化。
Intel公司的StrongARM芯片SA1110的最高运行速度可达206MHz;其内部有强大的指令操作能力、高速缓冲能力、寄存器管理能力、读/写缓冲器能力。SA1110寄存器总线接口可与DRAM、SDRAM、ROM、SMROM、SRAM以及其它潜在的I/O器件共享数据信号,其寄存器与PCMCIA模块支持4个快速大同小页操作模式(FPM)、扩展数据输出(EDO)、同步DRAM、6个静态存储器、6个ROM/SDRAM等。SA1110可提供系统支持逻辑、多个串行通信通道、1个彩色/灰度LCD控制器、2个PCMCIA插槽、28个GPIO口;内部提供定时器、电源管理、指令控制、复位控制、时钟产生、中断控制等功能。SA1110电源管理提供正常、空闲、睡眠三种工作状态,其内部包含六通道的DMA控制器,用于支持串行通信过程中的数据高速运行,如串行通道与外部寄存器、DRAM、SRAM、Flash、ROM等之间的通信;此外,还有1个用于支持LCD控制器工作的独立的DMA控制器SA1110,它有5个独立的串行通道,可分别执行半双工被动协议的通用串行总线(USB)通信、红外数据(IrDA)通信、多媒体通信口/同步串行口(MCP/SSP)通信等。SA1110通过指令和数据断点提供调试支持,还提供JTAG口,用于进行系统连续检查。通过对StrongARM芯片的仿真,除了有助于SkyEye设计可扩展框架外,还将推动下一步对Intel的XScale系列CPU的研究。
5.3 SkyEye集成开发环境的实现
集成开发环境是SkyEye的一个重要组成部分,利用它,可以直接在可视环境中编辑、编译、调试和修改OS代码,方便了软件开发和称一。由于SkyEye的用户接口是基于GDB的,所有支持GDB的集成开发环境都可以很容易地移植为SkyEye的集成开发环境。目前的Windows版本借鉴Dev-Cpp的源代码,主要与Cygwin版本的SkyEye进行通信,以进行方便的、可视化的调试。Linux版本的IDE采用的是修改过的KDevelop3.0,目前它能和SkyEye进行很好的集成,完成全以充分利用Kdevelop3.0的强大功能。
6.4 SkyEye可扩展框架的设计
目前SkyEye各个部分的仿真还是紧耦合的,各仿真模块之间的接口还不够清晰,这不利于SkyEye的扩展。如果要支持更多的CPU和嵌入式环境,需要很大的工作量,而且用户也无法进行二次开发,阻碍了SkyEye的进一步推广和应用。这就需要为SkyEye设计一个可扩展框架。目前,框架的设计要集中于定义和实现CPU的内部接口,如内存接口和协议处理器接口等,以让它支持更多的CPU;下一步会为SkyEye设计虚拟外部接口,让用户可以根据自己的硬件或者应用,来定义外设的功能,并能在SkyEye上方便地仿零点和验证,从而为用户增加二次开发的功能,让SkyEye得到更广泛的应用。
7 总结与展望
经过几个月的努力,SkyEye已经有了很大的发展,各方面的工作已经按照计划有条不紊地进行着。可以说,SkyEye作为嵌入式系统的仿真环境,已经成为学习嵌入式系统十分有效的工具。同时,SkyEye在许多方面还有待手改进:一是要提高SkyEye的易用性,这就需要完善SkyEye的集成开发环境,改善其用户接口;再就是提高SkyEye的通用性,这需要SkyEye支持更多的外围设备、更多的体系结构乃至更多的CPU类型。
在开发的过程中,SkyEye项目得到了很多嵌入式爱好者大力的支持和热情关注,项目的开发队伍也在不断壮大。作为开源项目,SkyEye真诚希望广大计算机爱好者积极参与与并对SkyEye的发展提出宝贵的意见和建议。
评论