1. 程式人生 > >.NET Core 對龍芯的支援情況和對 .NET Core 開發嵌入式的思考

.NET Core 對龍芯的支援情況和對 .NET Core 開發嵌入式的思考

目錄

  • .NET Core 對龍芯的支援情況和對 .NET Core 開發嵌入式的思考
    • 一,遺憾的嘗試
    • 二,.NET Core在嵌入式下的幾點不足
    • 三,.NET Core 龍芯移植的進展和資料

.NET Core 對龍芯的支援情況和對 .NET Core 開發嵌入式的思考

一,遺憾的嘗試

前些天看到了張隊公眾推送的《Asp.Net終於可以在龍芯伺服器上執行啦:Jexus成功完成對國產系列CPU的適配》,聯想到上一週與朋友在龍芯搗鼓 .NET Core,就想寫一下關於 .NET Core 在龍芯下的資料。

Jexus Web Server 能夠在龍芯伺服器上跑,但是 ASP.NET 呢?.NET Core 呢?安裝什麼版本的 Mono ?Jexus 作者的文章表達有點模糊呀~

上一週與朋友在龍芯上面為了部署 .NET 專案,頗費心機。朋友公司中標政府專案,開發好 .NET Core 做的專案後,才發現要部署的伺服器是龍芯的,.NET Core 無法在上面執行。

伺服器有什麼有 Mono 4.x,可以建立簡單的 Proparm.cs ,編譯出程式,使用 mono xx.exe 執行,可是把專案放進去編譯不出來~想編譯安裝 Mono 6.x 也不行,中間有些過程報錯。

.NET Core 自然不用想了,完全無法編譯,通過 Google 查詢資料,要重寫 C++ 部分(移植),才能在 龍芯 下編譯出 CoreCLR。

官方 CoreCLR 原始碼庫,可以看到一些指令碼和編譯工具鏈。

https://github.com/dotnet/coreclr/

RISV-C 是精簡指令集,MIPS 是指 基於 RISC-V 的 CPU 架構,龍芯伺服器使用 MIPS 架構。

最終,無法部署 .NET 軟體,朋友公司改用 Java 開發。。。

之前筆者為了在 Armel 的 CPU 下執行 .NET Core ,花了很多時間手動編譯 .NET Core,最終還是失敗。我將編譯過程詳細寫了一篇文章,地址《瞎折騰實錄:構建 Armel 版本的 .NET Core 教程和資料資源》。

二,.NET Core在嵌入式下的幾點不足

18年7月張隊來我校組織了大灣區 .NET 交流會,從那時起開始學習 .NET ,19 年三月月份進入敢為實習轉正至此。

使用 .NET Core 開發半年的時間裡,在嵌入式開發中,我個人總結當前 .NET Core 在嵌入式領域有幾個問題/建議。

1,不支援前幾年的CPU

.NET Core 無法在樹莓派 Zero上執行(Arm v6);

無法在華為海思A9晶片上執行(Armel Armv7);

這兩種晶片雖說是幾年前出的晶片,但是 .NET Core 大張旗鼓的說要搞 IoT,卻不相容舊一些的 CPU,目前很多舊式裝置依然會在未來一段時間內是主流的存在 。

微軟官方也說了:

Note: .NET Core 2.1 is supported on Raspberry Pi 2+. It isn’t supported on the Pi Zero or other devices that use an ARMv6 chip. .NET Core requires ARMv7 or ARMv8 chips, like the ARM Cortex-A53.

Arm 方面的支援還是不夠廣。

2,測試的硬體裝置較少

官方對嵌入式裝置的測試,主要在 樹莓派 2 / 3,還有很多開發板沒有測試~

3,支援相容的系統版本較少

.NET Core 支援很多 Linux 系統,但是對應這些系統的支援,都是以最新版本的系統為主,例如 .NET Core 3.0 在Ubuntu 上是支援 16.x、18.x,14.x 和 17.x 被無情的拋棄了。

.NET Core 3.0 支援的系統如下:

https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md

4,體積依然太大

對於嵌入式開發來說, .NET Core 的體積依然太大,.NET Core 3.0 也拯救不了。。。哪怕只有一行 Hello World,也要 70MB+ 以上。

5,依賴庫比較傷腦筋

經常會出現 ICU、libssl、gcc 等依賴庫版本不一致或沒有安裝這些庫時的報錯資訊,石頭哥曾經被這些問題搞得掉頭髮。

三,.NET Core 龍芯移植的進展和資料

根據大佬們的移植,在 11 月 9 號時,已經實現了 在龍芯上面執行 .NET Core 的 Hello World 例項,

The code base was upgraded to 3.0. Hello World and serveral tests in coreclr can run on MIPS64 now. 

這是對於 CoreCLR 的移植,還有很多問題等待大神解決。

對於 .NET Core 在 MIPS 上的移植討論,可以到 Issue 檢視

https://github.com/dotnet/coreclr/issues/969#issuecomment-550129085

不過,微軟官方目前沒有移植計劃,只能靠社群去完成了。

Microsoft currently has no plans or work in progress to support MIPS. Of course, we would be willing to accept external contributions towards that goal as appropriate. Note that it is, certainly, a significant amount of work to port .NET Core to a new platform.

還有另一個大神的作品

https://github.com/reignstudios/IL2X

This project will focus on translating .NET IL for non-supported .NET targets. Portibility is a huge focus.

  • .NET Standard compatibility
  • Native C performance
  • C89: modern, legacy and embedded platforms (x86, MIPS, SPARK, RISC-V, PPC, AVR, etc)
  • CC65: 6502 platforms (Atari, C64, NES, Apple II, etc) [CS2X may be better suited]]
  • SDCC: Many targets (ColecoVision, etc) [CS2X may be better suited]
  • Assembly: CP1610 (Intellivision) [CS2X may be better suited]]
  • Retarget: Custom assembly targets via plugin system (FPGA CPU, 16bit bytes, etc)
  • Custom Standard lib(s) for various targets.
  • Documentation