借斯巴達之際,今天在QQ群1600838直播MF移植環境的准備工作,大家可隨時詢問移植相關問題!
如果對MF移植之前的東西有疑問,請看論壇置頂帖.Net Micro Framework導航總貼(新手必看)
硬件:STM32F103ZET6/STM32F103VET6,采用這兩種MCU的任何開發板、學習板、核心板……
軟件環境:
系統:Win7 x86 其它系統我不肯定行不行,我兩個都是Win7x86,估計WinXP也行。操作系統的影響應該不大!
http://msdn.itellyou.cn/
開發:Visual Studio 2010 C#/C++ 必須安裝VC++,很多人可能只有C#,那是不行的。vs2008據說可以,而vs2012沒試過。
http://msdn.itellyou.cn/
ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/
匯編:Keil MDK 4.54 這是編譯為單片機固件用的,以前用4.12,后來升級到4.54,現在不確定4.12/4.50是否還可以。據說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
另外,你還需要一個高級的文本編輯器,我用的是Notepad++!
強烈建議你把MFPK安裝到有固態硬盤上!!!(為此我專門買了三星64G,419塊)
一、安裝
Keil MDK安裝到C:\Keil,一會我們要用C:\Keil\ARM,如果不是這個位置,一會就自己用Win7建立軟鏈接,或者修改編譯腳本,我不負責!
自己河蟹,否則一會編譯出錯可自己負責。(今天果真就有人犯錯,怎么換MFPK和MDK都是報兩百多個錯誤)
MFPK安裝到C:\PK或者E:\MF\PK都行。
二、編譯腳本
我把編譯做成了雙擊可用的批處理腳本,跟別人的有些不同,大家統一按照我的做。
建議大家建立自己的SVN,托管整個PK目錄,還可以記錄每一次修改歷史!
1,PK根目錄下有個setenv_MDK.cmd,如果沒有,就新建一個,如果Keil安裝目錄不對,也是這里修改,整個文件就這兩行!
@echo off
setenv_base.cmd MDK PORT %* C:\Keil\ARM
2,修改根目錄的setenv_base.cmd
大概在14行,加上一種編譯器MDK,因為寫MDK4.12之類的太累了,也不方便升級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目錄里面,就存放着針對不同板子的編譯方案。為了方便編譯,我們直接在每個方案里面放置一個編譯批處理腳本,這個腳本是通用的,拷貝到不同方案目錄都可以。
這里以STM32Stamp為例,路徑是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat
::@echo off
:: 設置一些參數
set x_flavor=release
set x_memory=flash
set x_root=..\..\
:: 先嘗試取得當前目錄名,作為方案名
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
:: 把生成的文件復制出來
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%
:: 復制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
:: 復制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 輸出已復制到 %x_bindir%\
pause
編譯完成后,會把輸出賦值到E:\MF\MFBin目錄,MFBin目錄與PK並排!
4,既然我們前面增加了一種MDK編譯器,那么還有一個地方要修改
MFPK是采用MSBuild這個編譯系統的,所以我們要修改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>
腳本這一步,如果沒改對,就直接下載現成的吧!兩個月前發布的,可能不適用於MF4.2(RTM QFE2)以上版本!
.Net Micro Framework移植編譯腳本
三、編譯
沒錯,到了這里,可以編譯了!雙擊STM32Stamp里面的Release_Flash.bat,編譯就開始了!
輸出目錄是E:\MF\PK\BuildOutput
第一次編譯,需要非常非常久,傳統SATA超過半個小時,SSD也得二十多分鍾。
后面編譯就快了,SATA需要5到10分鍾,SSD需要兩三分鍾
然后,第一次編譯,基本上會有錯誤,這個不用管它,再來一次,多編譯幾次,直到沒有錯誤或者錯誤個數恆定下來為止!
在這一步,可能會產生各種各樣的問題,只要我們找到問題所在,就可以使用相應的招數來對付!
編譯腳本詳解請看:
.Net Micro Framework移植編譯腳本
為了盡可能的保持跟大家一樣,我通過SVN把代碼更新到剛安裝PK的時候,2012年5月1日!
還刪除了輸出目錄BuildOutput!
我很幸運,編譯一次性成功,這標志着MF移植的第一步已經完成!
在E:\MF\MFBin\STM32Stamp目錄中,我們已經看到了一個241KB的TinyCLR.bin,這就是我們所需要的MF固件!
趕緊把它刷入板子測試一下!有JLink的同學用JLink,沒有的就用串口,看《開發板通用刷機教程》
接上串口,上電,開機,串口軟件顯示出來MF的啟動信息:
看到這些啟動信息,標志着MF移植第二步已經完成!剩下的就是精雕細琢了!
四、編譯原理
了解編譯原理更利於我們的移植工作。
1,MFPK整個編譯體系采用MSBuild,所以Visual Studio和.Net 4.0必不可少!(上面腳本中可以看到調用msbuild命令)
2,前面我們修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有興趣的可以自己慢慢看;
3,每一個MF方案就是一個項目proj,它引入其它更多的項目;
4,編譯一個方案時,它會根據先后順序和引用關系先編譯其它項目,這跟C#項目引用一起編譯有點類似。首次編譯需要編譯所有項目,所以要很久,以后只需要編譯修改過的項目即可,所以就快多了;
5,targets指定如何去編譯每一個項目生成obj文件,我們這里自然就是調用MDK來編譯啦;
6,MF大部分源碼由C++編寫,項目文件里面除了源代碼以外更重要的是頭文件,也就出現了很多目錄的引用,絕對能讓你頭暈。C++項目之間的引用是通過引用頭文件來實現的,不同於C#項目只需要引用項目或者程序集即可,所以,目錄結構非常重要。
7,MSBuild會為每一個項目源代碼創建一個進程,這很浪費時間(頻繁創建進程),但是很保險,相互間不干擾;
五、糾錯
出錯在所難免,但是MSBuild是針對每個項目逐個編譯的,盡管某個項目編譯出錯,它也會繼續往下編譯。屏幕滾得太快,我們根本就沒有機會查看詳細錯誤!然后它最后之后報告有多少個錯誤,大概哪里錯了,幾乎很難知道錯誤的詳細信息,這就是MF移植的最大困難所在!
在上面的編譯腳本中,msbuild那一行后面有個注釋,那就是把msbuild的結果輸出到一個日志文件build.log里面去。編譯完成以后我們就可以用文本編輯器打開,搜索關鍵字“error”,一般那里就有詳細的錯誤信息啦!
當然,具體的代碼錯誤只能靠各人的功力了!我們歡迎交流各種常見的非代碼錯誤!
常見錯誤:
1,沒有和諧MDK。新手編譯直接報幾百個錯誤的,多數就是它;
2,VC++ 2010、MDK 4.54、MFPK 4.2(RTM QFE2)這些版本不對;
3,缺少碎片文件。比如不少項目就沒有TinyCLR\scatterfile_tinyclr_mdk.xml文件;
前前后后忙活了一天,修改了三四十次,才最終完成本文!
如果喜歡.Net Micro Framework,對C#玩單片機,對物聯網和工農業自動化感興趣,MF將是一個不錯的選擇!
MF是微軟開源的項目,本系列移植教程將讓你具有獨立的移植能力,配合市場上40~300RMB的各種單片機學習板,可以讓你走得更遠!
End.