再談.NET Micro Framework移植


     沒有想到,距第一次寫.NET Micro Framework移植文章《移植初步:環境搭建》已經快兩年半了。不過這兩年多來的時光也沒有虛度,還是做了不少工作的。從代碼角度來說,不僅STM32F103的移植代碼在不斷完善,並且也已經移植和優化了基於STM32F207和STM32F407的相關代碼。從硬件角度來說,也由最初完全借助第三方的硬件作為.NET Micro Framework開發板,演變為今天推出自行設計的開發板和物聯網產品。      

      初次移植.NET Micro Framework是基於V 4.0版本,當前最新的版本已經是V4.2了,並且官方代碼中也已經集成了第三方開發的基於STM32F103的代碼,不過該代碼移植的相對簡單一些,並且大部分代碼取之於ST官方的庫,所以代碼效率和未來擴展性方面還是有一定局限性的。

      此外在此期間深圳的莫雨也推出了基於STM32F103移植的書籍《玩轉.NET Micro Framework移植-基於STM32F10x處理器》。

      基於STM32Fxxx的代碼,我所移植的和官方還有莫雨移植的最大區別就是,沒有基於ST的庫代碼,完全按照.NET Micro Framework一貫的風格,直接根據相關芯片手冊,定義相關的寄存器結構體。此外就是對中斷的處理,采用了動態設置,直接調用的技術。另外對時鍾的處理也放棄了最初的Systick方式,采用了雙時鍾處理機制(這和官方的代碼不同),而基於STM32F207芯片的代碼,更是根據有些時鍾計時變量可以支持32位的特點,做了特別的優化。另外一大特色在.NET Micro Framework標准功能的基礎上,拓展了很多功能,比如支持TinyGUITinyIOsSystem .Windows.FormsGPRS、CAN、ModbusCamera.PTC01QuickPort等等擴展庫。

     隨着.NET Micro Framework的影響力不斷擴大(最早基於.NET Micro Framework的兩大產品系統是SideShowMSN Direct,目前由於物聯網的不斷發展,微軟開始主推Microsoft .NET GadgeteerNetduino,這兩類產品大大促進了.NET Micro Framework的發展),對.NET Micro Framework移植感興趣的人也越來越多,這中間有不少人問我,移植的難度有大?

      我在台北做.NET Micro Framework的培訓和為一些網友做移植介紹的時候都會這樣評價移植的難度。個人認為,移植由難到易分三種難度層次:

      第一種:系統架構和CPU層面的移植最難

       以前.NET Micro Framework僅支持ARM7和ARM9架構,Cortex-M3架構並不支持,這二者的最大的區別就是中斷模式,ARM7和ARM9架構有兩種中斷,普通中斷和快速中斷,而Cortex-M3的中斷模式更類似X86架構,有中斷向量表,硬件層面支持中斷嵌套。所以如果涉及到這方面的移植,相關中斷架構必須調整。

      目前官方的代碼支持的MCU類型如下:

Atmel:AT91SAM7X 、AT91SAM9RL64、AT91SAM9260、AT91SAM9261

Analog Devices:ADSP-BF537

恩智浦(NXP):LPC22XX、LPC24XX

飛思卡爾(Freescale):MC9328

英特爾(Intel):PXA271(XSCALE)

瑞薩電子(RENESAS):SH2、SH2A、 SH7216、SH7264

意法半導體:STM32F103

        如果你打算設計的硬件,所選的MCU恰好在上述列表,那么恭喜你,CPU相關層面的移植的工作就不需要做了。但是即使所選的MCU不在上述列表,移植的工作量也是有區別的,比如Atmel的 AT91SSAM9263雖然不在列表中,但是其寄存器定義和AT91SAM9260、AT91SAM9261有很大的相似性,所以工作量也相對較少。工作量最大的移植,就是MCU架構和已有的不同(非ARM7,ARM9和Cortex-M3),且MCU亦非上述列表的廠家,比如我曾經移植過的TI的DM355,這就需要你從零開始移植。

      目前不少Cortex-M3內核的MCU芯片廠家都提供了相應的支持庫,所以直接采用庫代碼也是一種省時省力的選擇。不過如果選擇庫,就對庫有了一種依賴性,如果庫本身的函數有bug,那么調試的難度就會加大,並且也受限於庫本身所支持的功能,因為你在庫的基礎上再擴展一些功能,相對比較難一些。

     第二種:外圍模塊移植次難

      如果所選擇的MCU就是第一種中所列的MCU,那么這部分工作一般情況下,就不需要做了,剩下的就看你所選擇的LCD、觸摸屏、NandFlash以及以太網等模塊了,建議還是選擇.NET Micro Framework已經支持的模塊,這樣你的工作量就會大大降低。

     第三種:模塊集成和參數調整最易

      自己設計的板子已經和官方支持的平台兼容了,所選的模塊也都是官方代碼所支持的,那么剩下的工作,無非就是個別參數調整(比如RAM的大小,地址等等),還有工程文件把各個模塊代碼進行集成了。

      所有代碼工作做好之后,最后一步,就是調試,調試,再調試了!!!這一步,老手,新手的差別就凸顯出來了。嵌入式開發就是這樣,代碼完成僅僅占移植的工作量30%左右,剩下大部分工作就是調試,所謂老手,就是指調試經驗異常豐富(其實不僅僅指調試功底,還應該包括對某些開發的原理異常清晰,比如USB,比如以太網,必須了解其運行機理,才能事半功倍的進行調試)的嵌入式開發者,所以說同樣的開發工作有人幾天就可以完成,而有人幾個月不一定搞定,其緣由也在這里了。

      周立功曾經在他的微博中這樣說,他們這樣的公司,真正會進行系統移植的不超過5個人(后來又進一步明確指出,他所謂的移植就是對新出的MCU,在沒有多少可參考的資料的情況下,進行移植)。不過這個微博發出后,不少人進行吐槽,說什么能進行移植的人一大把之類了,其實就是因為,每個人心目中移植的標准是不一樣的,大部分人所謂的移植,估計很像普通人心目中的IT高手,就是會裝機的高手一樣,而不是真正的代碼編寫級別的移植高手。

     說了以上三種代碼移植層次,其實這僅僅限於移植官方.NET Micro Framework現有的代碼和功能,如果你想自己擴展自己的接口,並且希望自己的接口靈活,參數接口支持類,也支持事件等等功能,那么移植的難度會更上一個台階,這就需要非常深入的了解.NET Micro Framework底層相關代碼了。

     總體而言,.NET Micro Framework的移植工作,比UCOSII復雜,但是比Linux和WinCE又要簡單的多。此外.NET Micro Framework不是所謂的嵌入式系統,而是一個框架,不僅可以獨立運行,還可以移植到Linux、WinCE和UCOSII等系統平台上來,這樣的好處就是基於.NET Micro Framework的代碼也許可以真正做到,一次編譯到處運行了。

     MF簡  介:http://blog.csdn.net/yefanqiu/article/details/5711770

     MF資料庫:http://www.sky-walker.com.cn/News.asp?Id=25

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM