你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

.Net Micro Framework移植基础(STM32)

[复制链接]
大石头-349572 发布时间:2012-11-9 12:12
如果对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/
cn_visual_studio_2010_ultimate_x86_dvd_532347.iso (2.5 GB)
汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高
https://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

https://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行增加

<span style="color:#93c763;"CC/span      span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\armcc.exe"</span style="color:#93c763;"CC/span><span style="color:#93c763;"CPP/span     span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\armcc.exe"</span style="color:#93c763;"CPP/span><span style="color:#93c763;"AS/span      span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\armasm.exe"</span style="color:#93c763;"AS/span><span style="color:#93c763;"LINK/span    span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\armlink.exe"</span style="color:#93c763;"LINK/span><span style="color:#93c763;"AR/span      span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\armar.exe"</span style="color:#93c763;"AR/span><span style="color:#93c763;"FROMELF/span span style="color:#678cb1;"Condition/span=span style="color:black;""/spanspan style="color:#ec7600;"'$(COMPILER_TOOL_VERSION)'=='MDK'/spanspan style="color:black;""/span>"$(MDK_TOOL_PATH)\bin40\fromelf.exe"</span style="color:#93c763;"FROMELF/span>
脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于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文件;
4,不要用MF的那个什么向导,它生成出来的方案,很难编译通过

End.
收藏 评论1 发布时间:2012-11-9 12:12

举报

1个回答
xuysh1501 回答时间:2015-5-28 13:09:44
看上去不错

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版