【.Net Micro Framework PortingKit – 15】移植总结(兼谈MF未来发展)

时间:2021-11-12 02:42:29

从元旦开始,便利用业余时间从事基于Cortex-M3内核上的.Net Micro Framework的移植工作。虽然到现在算起来有一个多月的时间,但是我平日的正常工作时间大部分都花在和同事一起做WiFi驱动的开发上了,除去写这一系列文章的用时,真正在Cortex-M3内核上移植时间最多也就十几天。这并不说明我在嵌入式方面的功底多么深厚,虽说我PC平台上的软件开发时间有十几年的历史,但是做真正嵌入式的开发才是最近一两年的时间(以前虽说开发过PLC程序和WinCE平台上的组态软件,但充其量仅仅算是嵌入式应用开发),这也并不代表我对.Net Micro Framework有多了解,虽然进微软的工作主要就是做.Net Micro Framework开发,但一年多的时间里,有近半年的时间是做MSN Direct的相关工作(主要和SQLWeb服务打交道),唯一可说明的是移植.Net Micro Framework系统其实是件并不那么难的事,特别是针对那些真正的嵌入式开发高手来说。

为什么选择了基于Cortex-M3内核的芯片?一是因为这是ARM公司最新的技术结晶,代表了ARM公司的未来技术走向,二是通过了解发现,Cortex-M3从结构上颠覆了以前ARM7ARM9ARM11设计,不仅性能优异,开发简单,更是对不同公司出品的基于Cortex-M3核的芯片做了更为严格的限制(比如内存映射,前15个系统中断),使今后针对不同厂家的芯片移植工作量降到了最低。

至于为什么选择了EM-STM3210E开发板?那是因为手边有这么一块基于Cortex-M3的开发板。

我从一个普通的PC软件开发人员转为嵌入式软件开发人员(确切的说是Windows平台开发人员转为嵌入式开发人员,对Linux开发人员来说,这个过渡要容易的多)的经历,估计有很多人对此都比较感兴趣。其实这要感谢我们那个时代,我们上大学的时候,没有机会学习什么windows平台的开发,更没有那么多开发语言和架构要学习,我们可学的基本是BASICC语言(当然还有PascalFoxbasedbase等开发语言),大学有近三年的时间都花在C/C++及数据结构上了,毕业设计所开发的图书管理系统(采用Borland C 3.1开发)最终还获得优。毕业以后竟然没有想到,在Windows开发为王的时代,也还有三次采用C/C++开发DOS平台上应用的经历。第一次是开发一个计量系统,主要从ISA采集卡中读取采集数据,其图形库也是复用的我做毕业时所开发的图形库;第二次是开发济钢焦炉四大机车自动化系统时,由于采用的是AB RsLogix5000 PLC,而位置采集是采用我原公司设计的红外标尺系统,由于其通信协议不是标准协议,所以采用RsLogix5000 PLC是无法直接获取位置数据的,所以另外采购了MVI56可编程模块,该模块就是一个独立的小型嵌入式系统,其操作系统为Tiny DOS,采用Borland C为其应用开发,详细内容,感兴趣的朋友可以看我以前写的文章《AB RsLogix5000 PLC第三方模块MVI56的编程开发》;第三次是开发隧道广告系统时,需要实现TCP/IP转串口功能,当时选用的是英创公司的一款DOS开发板,其开发环境也是Borland C3.1,详细情况仍请参见我写的文章《嵌入式系统之Modbus TCP to Modbus Rtu协议转换器开发》。

不厌其烦说这么多的目的,主要是想说明对嵌入式开发来说,C/C++非常重要,因为C/C++是嵌入式开发的主要语言,相对而言汇编的比例则很小(主要是启动代码部分),如果没有C/C++语言功底,学习嵌入式开发将是一个很难并且是很漫长的过程。

为什么选择.Net Micro Framework作为嵌入式开发的切入点?因为.Net MF相对其它嵌入式系统,即不简单(相对于UC/OS-II)也不复杂(相对于WinCE,嵌入式Linux),并且包略万象,知识面涉及很广,不仅包含一个小巧的操作系统,还包括CLR的精简运行时,难的可贵的是还包含一个强大的调试系统,真可谓 “麻雀虽小,五脏俱全”。

此外学习.Net Micro Framework也是Windows平台开发的人员顺利的过渡到真正嵌入式开发的最佳渠道,从这一点出发,你很容易过渡到其它嵌入式系统上来,如UC/OS-IIucLinux、嵌入式Linux等系统;而WinCE则不然,学过WinCE的人都知道,WinCE开发比较难的就是驱动开发和平台移植,而这种代码编写、编译和调试都是基于微软自己的PB开发环境(目前已作为插件成为Visual Studio的一部分),你很难接触到什么MDKRVDSGCC等等开发工具,你为学WinCEWinCE,你将被绑定,很难转入到其它嵌入式系统,至于WinCE应用开发,那和PC平台开发几乎没有什么区别,也许你已经开发了几年的WinCE应用开发,严格意义上讲,你仍不是一个真正的嵌入式开发人员。当然如果仅仅学习嵌入式Linux的应用开发,那么你也称不上一个真正的嵌入式开发人员,真正的嵌入式开发人员至少要有和中断和芯片的寄存器打交道的经历。

我学习.Net Micro Framework也不是为了学而学(下一步我就要深入研究一下UC/OS-II,再往后就是嵌入式Linux,我最终的目的就是把.Net Micro Framework移植到各个平台,无论是否嵌入式,至于背后真正的目的是什么,继续看下面的内容就知道了),就如我前面所说,这仅仅是个窗口,是个渠道,最终的目的是为了深入了解和掌握嵌入式开发的技能。就像一个练功夫的人,不仅仅要会用刀或剑,还要十八般兵器样样精通,当然对*的高手来说,其境界已经到了手中无剑,心中有剑的地步了。对真正的嵌入编程高手来说也是这样,无所谓WinCE,无所谓嵌入式Linux,更无所谓.Net Micro Framework,在他们眼中,这些都是一些用C/C++开发的应用程序而已。C/C++就是功夫界中的内功,有它作为基础,学习什么都将事半功倍。

但毕竟成为功夫高手的是少数,对嵌入式开发来说也是这样,真正的高手也是少数,不过一件可手的兵器在握,也能增加胜算不少。更何况是屠龙刀和倚天剑式的兵刃,但我们也知道,如果你功力不高,拥有这样的武器,对你来说往往不是福气,更可能会引来杀身之祸。当然对我们嵌入式开发来说,没有什么杀身之祸可引,但是太过于迷信屠龙刀和倚天剑式的工具毕竟不是一件好事。有那个时间,真不如提升一下自己的“内功”,多多学习C/C++

对开发人员来说,追求的是技术,但是对公司的*或产品开发和设计人员,却不一定是这样,他们更在意的是如何在最短的时间内,花最小的代价开发出最符合用户要求的产品。从长远看,如果公司有一个这样的团队,常时间对某一种嵌入式系统研究颇深(这个系统绝大部分是嵌入式Linux),当然也可能是针对自己公司的产品系列而开发的框架,那么他们将很容易达成自己的目的。但是养这么一个团队,不仅需要资金,更需要长时间的磨合,有这样的团队的公司并不多,如果有的话,那么这样的公司也是非常有实力的,在嵌入式领域一定有自己的一席之地。

但是对一些小公司,或者是有了项目需要而没有开发团队的公司来说,他们需要的就是短、平、快式的开发,这时选对一个合适的开发平台比什么都重要,但是这种饮鸩止渴式的做法我并不推崇,公司要想发展,一定要从长远着眼,针对嵌入式LinuxWinCE系统来说,一两个高手很难把握其发展走势(大部分个中高手,仅仅做些移植工作,而对公司产品的未来架构设计和发展却着力不多),所以类似UC/OS-II.Net Micro Framework的轻量级嵌入式系统,倒值得选择,语言和系统没有高低,高低仅在于使用的人,又所谓熟能生巧,深入研究类似系统,不仅有助于产品的升级换代,即使转入到其它嵌入式系统到时候也不是难事,甚而开发出专属于自己公司产品的开发框架也不是不可能的事。

此外.Net Micro Framework系统和其它系统不同,与其说.Net Micro Framework为系统,不如称之为框架更为合适(正如其名),我们知道.Net Framework可跨平台,我们没听说过,WinCE可移植到嵌入式Linux,反之亦然。即使有,也类似于虚拟机技术。

.Net Micro Framework则不然,它可以移植到任何嵌入式系统(PC平台更是可以了),它和其它嵌入式系统并不是水与火的关系,而是舟与水的关系,更甚一步,如果没有“水”,.Net Micro Framework也可以自己独立运行(正式因为具备了这个能力,很多人错误的理解了.Net Micro Framework的主要目的其实是跨平台,而不仅仅是个嵌入式系统)。

高手并不多,好钢要用在刀刃上,想想看,高手仅仅做些复杂的移植工作,而把相关变化万千的应用开发留给应用开发人员。而.Net Micro Framework提供的托管代码目的就是为了这个,不需要学习什么CC++,也不需要了解什么中断和寄存器,所需要面对的就是可自动回收垃圾的C#语言,还有对开发人员非常友好的Visual Studio开发环境(.Net Micro Framework支持其免费版本)。

什么?托管代码执行效率有问题?!好办,找出对效率比较敏感的代码,采用C/C++开发,开发完毕后,给C#人员提供一个接口来调用就可以了。

此外更难得可贵的是,对不同嵌入式系统,如果移植了.Net Micro Framework,将为应用开发提供一个一致的开发接口。这是有实际例子为佐证的,在开发隧道广告系统时,最早设计的基于DOS平台的网口转串口模块已经不能适合发展需要,所以考虑使用Moxa的系统,但类似的系统,早期产品都是基于Linux平台的,而我们公司却对Linux不熟,不敢贸然用Linux开发,直到等到Moxa出了基于WinCE的系统才购买相关产品。但是这样的产品不仅贵,并且不太稳定,毕竟Moxa公司要重新招一些WinCE开发人员,要从头去开发相关产品(当然硬件平台不用),对工业产品来说,稳定是第一位的,大量的调试和测试工作必不可少。其实我们用到功能并不多,就是用C#开发一些网口和串口应用,想想看当时移植了.Net Micro Framework,则对谁来说都是有好处的,对于Moxa,其核心代码还是Linux,稳定性和以前一样,又则.Net Micro Framework很简单,仅仅移植个CLR运行时,工作量也不大。对用户来说,还是用C#开发代码,和在WinCE平台上的开发没有任何区别,并且由于Moxa开发投入较低,其产品也必然便宜。所以对一个公司来说,无论是其产品核心是基于Linux还是WinCE,甚而是其它系统,给用户留出的二次开发接口都是一致的,这无论是对公司还是对用户都是一个福音。

我未来的梦想是希望能在机器人领域(或其它自动化领域)有所发展,所以这也是我看好.Net Micro Framework的一个原因,毕竟这些系统不是孤立的,他不仅需要用户仅仅去使用它,更多的是用户能参与二次开发,这才能各尽其长,百花齐放,目前来看.Net Micro Framework似乎是个不二人选(当然你也可以自己开发类似的接口,但是编译、运行时及开发环境都需要自己设计,这将是一个很大的工作量,并且无论是类C还是类Basic语言,用户对IED和开发语法都要有一个熟悉过程)。

当然微软研发.Net Micro Framework目的,绝不仅仅是让其作为一个二次开发接口而存在的。在物联网这个概念热炒的今天,.Net Micro Framework更是有用武之地,移植了.Net Micro Framework后,嵌入式设备将更方便地融入物联网,无论接口是串口、CANTCP/IPWifi、蓝牙、Zigbee等等接口。其实我们想想也是,设备入网,无非是实现一套协议,读写几个个IO端口而已,何必大动干戈的要用高级人才去不厌其烦地调试非常容易出错的C/C++代码,再说现在的ARM开发工具也贵的出奇,对小公司来说购买一两套就很不错了,对一般的开发人员,也许大部分时间仅仅是读读高手的代码而已,何不人尽其才,高手做高手的事情,低手做低手的事情。

所以我坚信.Net Micro Framework在未来嵌入式发展中,一定会占有一席之地(更何况现在已经开源了,并且采用更为彻底的Apache 2.0 license)。希望更多的人参与其中,把.Net Micro Framework移植到更多嵌入式平台上去,使它成为真正名副其实的“框架”。