netmf的開發環境確實很簡陋,而且由於項目已經停擺很久,本就稀缺的開發資料現如今更是難以尋找。
netmf這個項目的編譯,是要依靠msbuild編譯系統來執行的,由msbuild讀取項目文件(.proj)和目標文件(.targets),進而執行一系列的操作。因此,只要是配好了面向arm平臺的編譯系統,理論上都能編譯出固件來。netmf已經對gcc、mdk等編譯工具做了適配,在這裏我選擇mdk。
下面是我使用的編譯環境:
- Windows10 專業版 64位
- Visual Studio 2013
- Keil MDK 5.11
Windows10很多人說他不穩定,經常崩潰什麼的,其實我覺得還好吧,用到現在還沒出過什麼問題。
keil這個軟件需要自己想辦法破解,否則你只能編譯很小的代碼文件。
之所以選擇VS2013,一是因爲我擔心再新版本的VS可能不支持netmfSDK,二是VS2015似乎並不能成功完成編譯,相同情況下VS2013編譯成功而VS2015滿屏飄紅,VS2017/19也都不用費時間嘗試了。
軟件安裝好之後,還要對netmf進行一些修改才行。
修改tools\targets\Microsoft.Spot.system.mdk.targets文件
先備份,然後再大概40多行位置添加如下代碼(打開文件一看就明白了,排好隊形即可)
<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\armasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\armlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\armar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">"$(MDK_TOOL_PATH)\ARMCC\bin\fromelf.exe"</FROMELF>
<MdkCrtLibLinkSwitch Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.11'">$(MdkCrtLibLinkSwitch) $(SWTC)libpath $(MDK_TOOL_PATH)\ARMCC\LIB</MdkCrtLibLinkSwitch>
然後在大概310行左右改一個參數
<Exec Command="$(FROMELF) $(FROMELF_FLAGS) $(SWTC)m32 -o $(EXEName).hex @(EXEOutput)" />
改爲
<Exec Command="$(FROMELF) $(FROMELF_FLAGS) $(SWTC)i32 -o $(EXEName).hex @(EXEOutput)" />
這樣,編譯出來的文件就能被各種ISP工具識別了。原因很簡單,m32參數要求fromelf程序將固件編譯成摩托羅拉hex格式,而使用i32參數則會編譯爲大多數isp程序支持的IntelHEX格式。
修改項目文件
進入solutions\stm32stamp文件夾,有一個settings文件,我們打開它,發現裏面有2行包含“FLOATINGPOINT”的內容。我們需要將true改爲false,將1改爲0,然後保存。因爲stm32f1芯片不支持硬件浮點運算,浮點運算只能軟件模擬,若不更改這兩個選項編譯則會報錯。
嘗試編譯項目
stm32stamp項目經過上述簡單的修改之後,已經沒有“硬傷”了,能夠通過編譯。編譯報錯,只能說明環境還是沒配好。
如果恰巧你把keil安裝在了默認位置(C:\Keil),那麼將下面的代碼保存成一個bat文件放在stm32stamp目錄下,雙擊就能開始編譯了。全新編譯大概一刻鐘,快的機子10分鐘就能出結果,紅色失敗,綠色成功,固件文件會被複制到當前目錄。
@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat"
pushd ..\..\
call setenv_mdk 5.04 C:\Keil\ARM
popd
:Build
msbuild /t:build /p:flavor=debug;memory=flash /maxcpucount /noLogo /v:minimal /fileLogger /flp:Verbosity=normal
if %errorlevel% EQU 0 goto Succeed
goto Failed
:Succeed
color 0a
::move build binaries
set "lj=%~p0"
set "lj=%lj:\= %"
for %%a in (%lj%) do set wjj=%%a
copy /Y ..\..\BuildOutput\THUMB2\MDK5.04\le\FLASH\debug\%wjj%\bin\Tinybooter.hex Tinybooter.hex
copy /Y ..\..\BuildOutput\THUMB2\MDK5.04\le\FLASH\debug\%wjj%\bin\Tinyclr.hex\ER_FLASH TinyCLR.hex
copy /Y ..\..\BuildOutput\THUMB2\MDK5.04\le\FLASH\debug\%wjj%\bin\Tinyclr.hex\ER_CONFIG TinyCLR_Config.hex
echo *******************************************************************************
echo * *
echo * 編譯完成,文件已複製。 *
echo * *
echo *******************************************************************************
pause
exit
:Failed
color 04
echo *******************************************************************************
echo * *
echo * 編譯失敗,請檢查錯誤! *
echo * 已在msbuild.log文件中保存編譯日誌。 *
echo * *
echo *******************************************************************************
pause
exit