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