您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

.NET Micro Framework初体验

发布日期:2011-04-22

     .NET Micro Framework终于在正式命名一年之后, 于2月13日,在德国纽伦堡被发布。NETMF是针对嵌入式设备开发的.NET系统,可以运行在ARM7不带MMU的版本上,目前还没有报道,说NETMF可以运行在8位单片机或者其他的嵌入式CPU中,不过感觉这只是一个时间问题。

     NETMF比Windows CE要小,而且可以完全脱离操作系统环境运行,这个非常符合嵌入式系统的要求。目前,NETMF已经被应用到微软的SmartWatch和Vista的SildShow中。可以说,NETMF是目前微软最小的.NET系统。

     NETMF与.NET CF相比,.NET CF需要依赖于Windows CE的操作系统环境,而且现在还不能被移植到Windows CE之外的操作系统中(不过最近XBOX 360的XDA是支持.NET CF的)。而NETMF则不受这样的限制,可以被移植到任意的硬件平台上。不过目前NETMF公布的还只是SDK,还没有公布移植到其他平台上的指导文件,市场策略还需要进一步观察。

     NETMF的移植,目前没有资料可寻,不过英飞凌等几家公司已经公布了支持NETMF的开发板。所以,我们可以相信,.NET MF的移植不会比Windows CE的移植工作还要难。
现在,我们可以在下面的连接中下载到NETMF的SDK:
http://www.microsoft.com/downloads/details.aspx?familyid=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&displaylang=en

     SDK安装需要有Visual Studio 2005和MSDN。安装完成之后,我们可以在C:\Program Files\Microsoft .NET Micro Framework中找到NETMF的文件,还有一些示例代码会被安装在“我的文档”的\Microsoft .NET Micro Framework\Samples目录下。

     Samples中包括7个工程文件,其中Presentation工程会显示一个NETMF的UI界面,以前盛传NETMF的显示工作是由WPF/E来完成的,现在看起来似乎只是一种传闻了。

     SocketClient与SocketServer是一个介绍Microsoft.SPOT.Net程序集下,Socket如何使用的例子。而SampleEmulator中包括的是NETMF模拟器的源代码,目前看起来,这个模拟器还十分简单。可见NETMF还有一段很长的路要走。

     接下来,我们来看一下C:\Program Files\Microsoft .NET Micro Framework中的文件,NETMF目前的版本号是v2.0.3036,不知道是不是为了和.NET版本号一致?Assemblies目录下包括的是NETMF的程序集,Documentation是文档,Fonts中是NETMF使用的字体,扩展名为tinyfnt,可能是使用了自己的字体格式,也不知道能不能添加中文字体的支持?Tools目录下是模拟器和Debugger工具。

     我们来看Assemblies目录下的文件,除了我们熟悉的dll文件外,还有pdbx和pe为扩展名的文件,其中以pe为扩展名的文件是允许开发者进行再发布时使用的。不过我现在还不太了解再发布的方式。

     借助Reflector,我们可以大致了解程序集中所包括的内容。其中mscorlib.dll和System.dll是Native Dll,无法通过Reflector进行查看。

     托管程序集中,Microsoft.SPOT.TinyCore显示是NETMF的核心程序集,其中包括了Microsoft.SPOT.Input,负责处理用户输入;Microsoft.SPOT.Presentation中包括的主要是窗体管理,显示区域等,下面还有Controls、Media和Shapes三个命名空间。其中在Controls下面能够看到的控件有ListBox、Text、Panel和ScrollViewer。Media下面是Colors、Pen和SolidColorBrush,.NET下的类结构依稀可见。

     Microsoft.SPOT.Net下面比较简单,实现了Socket。

     Microsoft.SPOT.Hardware是很重要的一个程序集,用于直接操作硬件。呃,直接操作硬件,感觉回到了DOS时代一样,不过NETMF连操作系统都不需要,难道能直接操作硬件不合理吗?现在能够看到的类有Battery、CPU、GPIO、I2C、SerialPort、TristatePort(这是什么意思?)等硬件设备。如果这样看起来,微软只是实现了最基本的一些工作,那么要实现操作更多的外设、文件系统、多媒体设备,这些工作似乎需要有人干。再出现一个新的OpenNETMF也不是没可能的:)诸位要加油了。

     Microsoft.SPOT.Native中包含的类很多,有许多我还没搞清是做什么的,从名字上看,有扩展的Timer、数学库(实现了Random、Sin和Cos)、SystemTime之类。其中还有一个Cryptography的命名空间,竟然还实现了RSA加密……还有SystemID,Message等类没闹清楚做什么的,不瞎说了。

     Microsoft.SPOT.Graphics程序集下,最主要的两个类是Bitmap和Font,这显然是Microsoft.SPOT.Presentation的一个辅助类。

     NETMF中包括的程序集基本上就这么多,从产品本身看,NETMF无疑是具有超凡想象力的,很久前听说过Java有一个SmartCard版本,但一直无缘得见,如今NETMF确实是实现了嵌入式系统中托管代码。嵌入式领域的软件一直无法做大做强的一个很重要原因就是缺乏统一的开发平台,在不同平台间移植应用程序代价高昂。我们不能说NETMF就是济世的良药,但他至少是我们未来的选择之一。也许将来也会出现专门开发嵌入式软件的专业软件公司,而不像现在这样,软件工程师必须依赖于硬件系统工程师的工作成果。

     当然NETMF是否成功,除了技术本身之外,微软的推广政策也是很重要的因素。用惯了免费系统的嵌入式工程师,如果没有明显的好处,他是不愿意付钱的,可是现在的NETMF肯定是有很长的路要走。如果让微软Open Source似乎也不太现实……不过如果微软不采取行动,出现一个Embedded Mono也不是不可能的。

     写这么多废话,其实也是让大家知道,我这几天没研究刚发布的Windows Mobile 6.0,是因为什么?Windows Mobile 已经到了6.0,我也不太指望能有什么新意了,还是多看看未来吧。
 

     下面我们以Presentation为例,来看一下NETMF程序的结构,以及Visual Studio 2004对NETMF的支持。

     使用VS 2005打开Presentation工程,程序入口点在Presentation.cs中,MyApp类是继承自Microsoft.SPOT.Application类。在静态的Main函数中,调用MyApp的Run方法。需要注意的是,在OnStartup函数中,程序创建了MainMenuWindow对象,也是程序的主窗体。

     MainMenuWindow类也在Presentation.cs中,间接派生自Microsoft.SPOT. Presentation.Windows类。在MainMenuWindow类的构造函数中,程序创建了Panel、TextFlow、ListBox、Button等控件。

     结合运行后的效果,这些代码都是十分好理解的。在GpioButtonInputProvider.cs中,是与硬件相关的代码,Button的控制是通过GPIO的Pin来实现的。不过实话说,这部分代码我没怎么看懂。

     代码说到这里,下面来说编译。我们直接点击Run的Button,就可以启动模拟器并且进行运行。这个和.NET CF程序启动模拟器调试的方式差不多,不过,启动速度比.NET CF的模拟器要快很多了,这个大概是因为NETMF的模拟器并没有真正模拟硬件环境,只是在.NET Framework中模拟NETMF的行为吧?

     模拟器是五个Button,程序界面也十分简单。主要是一些控件使用和GDI绘制(我不知道NETMF的绘制函数是不是也叫GDI)。

     关闭模拟器,退出调试环境,我们选择Project菜单下的工程属性,我们可以看到,在最后增加了Micro Framework的选项。我们可以在这里选择输入设备,默认是模拟器,此外还支持USB、串口、TCP/IP的调试程序。另外,在Application页里我们可以看到,目前的示例代码都是命令行程序,这个我不太理解。

     最后来看看创建工程向导,选择File  New Project,我们可以在Visual C#下面看到一个新的类型“Micro Framework”其中包括,Class Library、Console Application和Window Application,这几个都比较好理解。此外竟然还有一个Device Emulator,难道我们可以自己编写模拟器?想不明白。