.Net Micro Framework移植基礎(chǔ)(包編譯通過(guò))
借斯巴達(dá)之際,今天在QQ群1600838直播MF移植環(huán)境的準(zhǔn)備工作,大家可隨時(shí)詢問(wèn)移植相關(guān)問(wèn)題!
如果對(duì)MF移植之前的東西有疑問(wèn),請(qǐng)看論壇置頂帖.Net Micro Framework導(dǎo)航總貼(新手必看)
硬件:STM32F103ZET6/STM32F103VET6,采用這兩種MCU的任何開發(fā)板、學(xué)習(xí)板、核心板……
軟件環(huán)境:
系統(tǒng):Win7 x86 其它系統(tǒng)我不肯定行不行,我兩個(gè)都是Win7x86,估計(jì)WinXP也行。操作系統(tǒng)的影響應(yīng)該不大!
http://msdn.itellyou.cn/
開發(fā):Visual Studio 2010 C#/C++ 必須安裝VC++,很多人可能只有C#,那是不行的。vs2008據(jù)說(shuō)可以,而vs2012沒(méi)試過(guò)。
http://msdn.itellyou.cn/
ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/
匯編:Keil MDK 4.54 這是編譯為單片機(jī)固件用的,以前用4.12,后來(lái)升級(jí)到4.54,現(xiàn)在不確定4.12/4.50是否還可以。據(jù)說(shuō)4.54成功的幾率比4.12要高
http://pan.baidu.com/share/link?shareid=109154&uk=2432978109
http://www.kuaipan.cn/file/id_2378544298640124.htm
和諧包http://www.kuaipan.cn/file/id_2378544298617835.htm
.Net Micro Framework Porting Kit 4.2(RTM QFE2)
(我們稱之為MFPK422)
http://netmf.codeplex.com/releases/view/91594
http://pan.baidu.com/share/link?shareid=109166&uk=2432978109
另外,你還需要一個(gè)高級(jí)的文本編輯器,我用的是Notepad++!
強(qiáng)烈建議你把MFPK安裝到有固態(tài)硬盤上!!!(為此我專門買了三星64G,419塊)
一、安裝
Keil MDK安裝到C:\Keil,一會(huì)我們要用C:\Keil\ARM,如果不是這個(gè)位置,一會(huì)就自己用Win7建立軟鏈接,或者修改編譯腳本,我不負(fù)責(zé)!
自己河蟹,否則一會(huì)編譯出錯(cuò)可自己負(fù)責(zé)。(今天果真就有人犯錯(cuò),怎么換MFPK和MDK都是報(bào)兩百多個(gè)錯(cuò)誤)
MFPK安裝到C:\PK或者E:\MF\PK都行。
二、編譯腳本
我把編譯做成了雙擊可用的批處理腳本,跟別人的有些不同,大家統(tǒng)一按照我的做。
建議大家建立自己的SVN,托管整個(gè)PK目錄,還可以記錄每一次修改歷史!
1,PK根目錄下有個(gè)setenv_MDK.cmd,如果沒(méi)有,就新建一個(gè),如果Keil安裝目錄不對(duì),也是這里修改,整個(gè)文件就這兩行!
@echo off
setenv_base.cmd MDK PORT %* C:\Keil\ARM
2,修改根目錄的setenv_base.cmd
大概在14行,加上一種編譯器MDK,因?yàn)閷慚DK4.12之類的太累了,也不方便升級(jí)MDK
:ERROR
@echo.
@echo Error: Invalid Arguments!
@echo.
@echo Usage: setenv_base COMPILER_TOOL_VERSION
@echo where COMPILER_TOOL_VERSION is ADI5.0, GCC4.2, ADS1.2, RVDS3.0, RVDS3.1, RVDS4.0, RVDS4.1, MDK3.1, MDK3.80a, MDK4.12, MDK4.13, MDK, SHC9.2, VS9, VS10
@echo.
大概89行,增加這種MDK編譯器
IF /I "%COMPILER_TOOL_VERSION%"=="ADI5.0" CALL :SET_BLACKFIN_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="GCC4.2" CALL :SET_GCC_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1" CALL :SET_MDK_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.12" CALL :SET_MDK_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.13" CALL :SET_MDK_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK" CALL :SET_MDK_VARS
3,Solutions目錄里面,就存放著針對(duì)不同板子的編譯方案。為了方便編譯,我們直接在每個(gè)方案里面放置一個(gè)編譯批處理腳本,這個(gè)腳本是通用的,拷貝到不同方案目錄都可以。
這里以STM32Stamp為例,路徑是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat
::@echo off
:: 設(shè)置一些參數(shù)
set x_flavor=release
set x_memory=flash
set x_root=..\..\
:: 先嘗試取得當(dāng)前目錄名,作為方案名
for %%i in ("%cd%") do set x_name=%%~ni
title 編譯MF方案[%x_name%][%x_flavor%][%x_memory%]
pushd %x_root%
call setenv_MDK.cmd
popd
call msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%
:: > build.log
echo 編譯完成
:copybin
:: 把生成的文件復(fù)制出來(lái)
set x_buildout=%x_root%BuildOutput\THUMB2\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin
if not exist %x_buildout% set x_buildout=%x_root%BuildOutput\THUMB2FP\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin
set x_bindir=%x_root%..\MFBin\%x_name%
if not exist %x_bindir% md %x_bindir%
:: 復(fù)制TinyBooter.bin
copy %x_buildout%\*.bin %x_bindir%\ /y
copy %x_buildout%\*.axf %x_bindir%\ /y
del %x_buildout%\*.bin /f/q
del %x_buildout%\*.axf /f/q
:: 復(fù)制ER_FLASH和ER_CONFIG
set x_buildout=%x_buildout%\tinyclr.bin
copy %x_buildout%\*.* %x_bindir%\ /y
copy %x_bindir%\ER_FLASH %x_bindir%\TinyCLR.bin /y
del %x_bindir%\ER_FLASH /f/q
echo 輸出已復(fù)制到 %x_bindir%\
pause
編譯完成后,會(huì)把輸出賦值到E:\MF\MFBin目錄,MFBin目錄與PK并排!
4,既然我們前面增加了一種MDK編譯器,那么還有一個(gè)地方要修改
MFPK是采用MSBuild這個(gè)編譯系統(tǒng)的,所以我們要修改E:\MF\PK\tools\Targets\Microsoft.Spot.system.mdk.targets,大概40行增加
<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\fromelf.exe"</FROMELF>
腳本這一步,如果沒(méi)改對(duì),就直接下載現(xiàn)成的吧!兩個(gè)月前發(fā)布的,可能不適用于MF4.2(RTM QFE2)以上版本!
.Net Micro Framework移植編譯腳本
三、編譯
沒(méi)錯(cuò),到了這里,可以編譯了!雙擊STM32Stamp里面的Release_Flash.bat,編譯就開始了!
輸出目錄是E:\MF\PK\BuildOutput
第一次編譯,需要非常非常久,傳統(tǒng)SATA超過(guò)半個(gè)小時(shí),SSD也得二十多分鐘。
后面編譯就快了,SATA需要5到10分鐘,SSD需要兩三分鐘
然后,第一次編譯,基本上會(huì)有錯(cuò)誤,這個(gè)不用管它,再來(lái)一次,多編譯幾次,直到?jīng)]有錯(cuò)誤或者錯(cuò)誤個(gè)數(shù)恒定下來(lái)為止!
在這一步,可能會(huì)產(chǎn)生各種各樣的問(wèn)題,只要我們找到問(wèn)題所在,就可以使用相應(yīng)的招數(shù)來(lái)對(duì)付!
編譯腳本詳解請(qǐng)看:
.Net Micro Framework移植編譯腳本
為了盡可能的保持跟大家一樣,我通過(guò)SVN把代碼更新到剛安裝PK的時(shí)候,2012年5月1日!
還刪除了輸出目錄BuildOutput!
我很幸運(yùn),編譯一次性成功,這標(biāo)志著MF移植的第一步已經(jīng)完成!
在E:\MF\MFBin\STM32Stamp目錄中,我們已經(jīng)看到了一個(gè)241KB的TinyCLR.bin,這就是我們所需要的MF固件!
趕緊把它刷入板子測(cè)試一下!有JLink的同學(xué)用JLink,沒(méi)有的就用串口,看《開發(fā)板通用刷機(jī)教程》
接上串口,上電,開機(jī),串口軟件顯示出來(lái)MF的啟動(dòng)信息:
看到這些啟動(dòng)信息,標(biāo)志著MF移植第二步已經(jīng)完成!剩下的就是精雕細(xì)琢了!
四、編譯原理
了解編譯原理更利于我們的移植工作。
1,MFPK整個(gè)編譯體系采用MSBuild,所以Visual Studio和.Net 4.0必不可少!(上面腳本中可以看到調(diào)用msbuild命令)
2,前面我們修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有興趣的可以自己慢慢看;
3,每一個(gè)MF方案就是一個(gè)項(xiàng)目proj,它引入其它更多的項(xiàng)目;
4,編譯一個(gè)方案時(shí),它會(huì)根據(jù)先后順序和引用關(guān)系先編譯其它項(xiàng)目,這跟C#項(xiàng)目引用一起編譯有點(diǎn)類似。首次編譯需要編譯所有項(xiàng)目,所以要很久,以后只需要編譯修改過(guò)的項(xiàng)目即可,所以就快多了;
5,targets指定如何去編譯每一個(gè)項(xiàng)目生成obj文件,我們這里自然就是調(diào)用MDK來(lái)編譯啦;
6,MF大部分源碼由C++編寫,項(xiàng)目文件里面除了源代碼以外更重要的是頭文件,也就出現(xiàn)了很多目錄的引用,絕對(duì)能讓你頭暈。C++項(xiàng)目之間的引用是通過(guò)引用頭文件來(lái)實(shí)現(xiàn)的,不同于C#項(xiàng)目只需要引用項(xiàng)目或者程序集即可,所以,目錄結(jié)構(gòu)非常重要。
7,MSBuild會(huì)為每一個(gè)項(xiàng)目源代碼創(chuàng)建一個(gè)進(jìn)程,這很浪費(fèi)時(shí)間(頻繁創(chuàng)建進(jìn)程),但是很保險(xiǎn),相互間不干擾;
五、糾錯(cuò)
出錯(cuò)在所難免,但是MSBuild是針對(duì)每個(gè)項(xiàng)目逐個(gè)編譯的,盡管某個(gè)項(xiàng)目編譯出錯(cuò),它也會(huì)繼續(xù)往下編譯。屏幕滾得太快,我們根本就沒(méi)有機(jī)會(huì)查看詳細(xì)錯(cuò)誤!然后它最后之后報(bào)告有多少個(gè)錯(cuò)誤,大概哪里錯(cuò)了,幾乎很難知道錯(cuò)誤的詳細(xì)信息,這就是MF移植的最大困難所在!
在上面的編譯腳本中,msbuild那一行后面有個(gè)注釋,那就是把msbuild的結(jié)果輸出到一個(gè)日志文件build.log里面去。編譯完成以后我們就可以用文本編輯器打開,搜索關(guān)鍵字“error”,一般那里就有詳細(xì)的錯(cuò)誤信息啦!
當(dāng)然,具體的代碼錯(cuò)誤只能靠各人的功力了!我們歡迎交流各種常見的非代碼錯(cuò)誤!
常見錯(cuò)誤:
1,沒(méi)有和諧MDK。新手編譯直接報(bào)幾百個(gè)錯(cuò)誤的,多數(shù)就是它;
2,VC++ 2010、MDK 4.54、MFPK 4.2(RTM QFE2)這些版本不對(duì);
3,缺少碎片文件。比如不少項(xiàng)目就沒(méi)有TinyCLR\scatterfile_tinyclr_mdk.xml文件;
前前后后忙活了一天,修改了三四十次,才最終完成本文!
如果喜歡.Net Micro Framework,對(duì)C#玩單片機(jī),對(duì)物聯(lián)網(wǎng)和工農(nóng)業(yè)自動(dòng)化感興趣,MF將是一個(gè)不錯(cuò)的選擇!
MF是微軟開源的項(xiàng)目,本系列移植教程將讓你具有獨(dú)立的移植能力,配合市場(chǎng)上40~300RMB的各種單片機(jī)學(xué)習(xí)板,可以讓你走得更遠(yuǎn)!
End.

浙公網(wǎng)安備 33010602011771號(hào)