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

.Net Micro Framework移植基础(STM32)

[复制链接]
大石头-349572 发布时间:2012-11-9 12:12
如果对MF移植之前的东西有疑问,请看论坛置顶帖.Net Micro Framework导航总贴(新手必看)5 F8 D) _: Z* v" q& ^4 n$ w& S
9 f. m5 M2 v- w" h9 g% W) i; {
硬件:STM32F103ZET6/STM32F103VET6,采用这两种MCU的任何开发板、学习板、核心板……7 k% ^4 Z5 Q* ?$ c

+ J4 F: P$ I) _0 L( [- G0 V软件环境:, l' N( Z+ n( M4 j* N7 C( L
系统:Win7 x86    其它系统我不肯定行不行,我两个都是Win7x86,估计WinXP也行。操作系统的影响应该不大!9 {7 a) b+ i2 x: e+ p; t, x+ e$ k+ q
http://msdn.itellyou.cn/6 b- p! O" L$ R0 Q+ A  J
开发:Visual Studio 2010 C#/C++    必须安装VC++,很多人可能只有C#,那是不行的。vs2008据说可以,而vs2012没试过。8 t$ j7 J5 N/ v& \: B4 F6 n
http://msdn.itellyou.cn// \  h  d1 j, ]
cn_visual_studio_2010_ultimate_x86_dvd_532347.iso (2.5 GB)
3 U- T+ B; M! W- M汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高
0 H. o7 b5 D% E- O
https://pan.baidu.com/share/link?shareid=109154&uk=24329781092 Q; B/ N$ k4 G
http://www.kuaipan.cn/file/id_2378544298640124.htm

) u5 l$ H" y* z/ H, [+ W和谐包http://www.kuaipan.cn/file/id_2378544298617835.htm) z0 `  a* [9 O# m' Q

/ ?3 @6 X5 N" i! Q5 N% I- p.Net Micro Framework Porting Kit 4.2(RTM QFE2)
+ y) c- L+ c' o& w; m6 A! Y7 k, R
(我们称之为MFPK422
9 }3 Z$ I, o5 W( ehttp://netmf.codeplex.com/releases/view/91594
% [7 d7 O# Z5 A3 ^
https://pan.baidu.com/share/link?shareid=109166&uk=2432978109
% A* {5 ~0 `$ w, ~. B# K
6 K" V2 t% ^" B) H" n另外,你还需要一个高级的文本编辑器,我用的是Notepad++0 W- C  f; F6 M8 A
强烈建议你把MFPK安装到有固态硬盘上!!!(为此我专门买了三星64G,419块)
6 D2 d+ w7 J7 v$ `, J. K
2 |* `# |& y$ P1 }1 ]一、安装) v4 B1 M4 ]. h. L/ l$ d
Keil MDK安装到C:\Keil,一会我们要用C:\Keil\ARM,如果不是这个位置,一会就自己用Win7建立软链接,或者修改编译脚本,我不负责!. }. w  b# i4 R2 C9 ^
自己河蟹,否则一会编译出错可自己负责。(今天果真就有人犯错,怎么换MFPK和MDK都是报两百多个错误)
3 n# q$ n, h- g7 ]( a$ k) c
MFPK安装到C:\PK或者E:\MF\PK都行。+ W" D# \  @3 f9 d
" a4 n) e1 K) G( k) U! m( [0 T
二、编译脚本- H( y: j8 N, n% F; g6 Y" b& Z
把编译做成了双击可用的批处理脚本,跟别人的有些不同,大家统一按照我的做。0 n" Y# d! X2 K8 j2 |4 i$ D
建议大家建立自己的SVN,托管整个PK目录,还可以记录每一次修改历史
/ |4 s! c" b, A8 z  H2 L5 }1,PK根目录下有个setenv_MDK.cmd,如果没有,就新建一个,如果Keil安装目录不对,也是这里修改
,整个文件就这两行!
8 j0 o1 K$ T" @6 t8 O, G- J
@echo off
9 C) e/ s& F) f* t; C0 D/ A; \) O3 ~. g2 w5 C. R
setenv_base.cmd MDK PORT %* C:\Keil\ARM

9 r# x8 C% N+ _$ }9 R- \. h5 G' y
, X1 C% x- @4 H! }/ x! L* d2,修改根目录的setenv_base.cmd; M8 v& ]$ l3 S: z7 W, e9 F
大概在14行,加上一种编译器MDK,因为写MDK4.12之类的太累了,也不方便升级MDK
0 g9 ~2 P- k) S5 r, T
:ERROR1 ]0 s5 X6 L3 b7 p7 D
@echo.% O5 l' Q5 J/ }2 F+ c
@echo Error: Invalid Arguments!
5 I9 b& U$ L9 B5 G7 d; Q@echo.' T5 @3 E9 F7 |
@echo Usage: setenv_base COMPILER_TOOL_VERSION
3 u1 `5 h; `3 b' w( J) D@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, k4 B, g' C* a% J; Z
@echo.+ b6 t5 E$ r1 S. c
! H, o- J2 Q5 l5 A
大概89行,增加这种MDK编译器
5 q! d$ g9 Y- r* e0 t- @/ G
IF /I "%COMPILER_TOOL_VERSION%"=="ADI5.0"   CALL :SET_BLACKFIN_VARS+ x" B' j: P# I% u- m# A/ Q
IF /I "%COMPILER_TOOL_VERSION%"=="GCC4.2"   CALL :SET_GCC_VARS - E: D7 L6 o! f* Q* L% t
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1"   CALL :SET_MDK_VARS+ |- m  m+ W! P7 o3 E. E
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS( G$ p, u3 X# |( k# ]3 l! Q$ D
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.12"  CALL :SET_MDK_VARS  L7 p( [, T& P# D8 G
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.13"  CALL :SET_MDK_VARS. R, c$ v. I/ c- z: D. b7 E. F
IF /I "%COMPILER_TOOL_VERSION%"=="MDK"   CALL :SET_MDK_VARS
' G1 s) R2 _+ ~! k6 p0 a

' `. q- \4 X' k1 h- ~3,Solutions目录里面,就存放着针对不同板子的编译方案。为了方便编译,我们直接在每个方案里面放置一个编译批处理脚本,这个脚本是通用的,拷贝到不同方案目录都可以。
4 i  x# G$ H+ q0 X- h
这里以
STM32Stamp为例,路径是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat
$ J1 b& S+ d: ~) x* ^: I9 Z% |, ^6 g* e
:echo off7 B/ g" X' T# L  l" N& {% z
:: 设置一些参数
: G1 Z$ L6 }$ l" h. fset x_flavor=release0 o1 l$ f7 r0 m1 p' ~; m7 D
set x_memory=flash
% b2 {1 C8 Q0 c! j2 Pset x_root=..\..\7 W4 U/ s3 R+ c+ _. U

. x$ L* J: z3 W:: 先尝试取得当前目录名,作为方案名
1 d4 R  u$ d2 q  A  V) Q+ O) f* _8 u" ?: x( B
for %%i in ("%cd%") do set x_name=%%~ni
2 w0 t- R) q% {
( x7 \- f' s6 a; V2 E  mtitle 编译MF方案[%x_name%][%x_flavor%][%x_memory%]
/ x) q9 C" ?1 s& E7 ?2 ]5 [& ]9 }7 I; L) U9 _( f% b/ Z
pushd %x_root%
/ _: `) Z" N" Z/ _+ C6 @call setenv_MDK.cmd: d8 ^4 x" @& M. M& p9 k- l/ d
popd/ J6 Y- A/ D$ b9 M
# @; G1 W3 e3 ]# w# k( H+ K
call msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%) q! |- H7 e$ h% t0 v% {
:: > build.log) s+ O; T: n8 ?$ l& j
' W, u  h: P9 k; c/ \
echo 编译完成; H7 R5 T8 U! {9 S9 p; d& l' m$ u
# {: V* ]9 _- R9 L% b0 {9 d' u9 `
:copybin
. v' ~* d- I2 {. \+ R9 {5 i; U:: 把生成的文件复制出来
; b9 z; C0 Q4 Gset x_buildout=%x_root%BuildOutput\THUMB2\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin
- b) N  R! K6 W8 y. Jif  not exist %x_buildout% set  x_buildout=%x_root%BuildOutput\THUMB2FP\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin5 ~; _, r; }* @8 l: V/ s
set x_bindir=%x_root%..\MFBin\%x_name%
1 x: m+ [) P, c9 H/ C* {1 W8 w% l
! ?2 v/ |% `/ Y+ H! M* dif not exist %x_bindir% md %x_bindir%9 y1 D, F4 i0 F) u/ w1 n" X
:: 复制TinyBooter.bin8 x/ g0 P% H0 M
copy %x_buildout%\*.bin %x_bindir%\ /y
  n0 r( [+ x+ X8 q- n! j' {& `copy %x_buildout%\*.axf %x_bindir%\ /y
+ i% _1 T* ?/ c- E" Z# v4 b0 _( s
del %x_buildout%\*.bin /f/q
1 M3 g8 E9 K' @2 ^( ~2 Rdel %x_buildout%\*.axf /f/q/ }6 L& ?# I' ], ?# M
* @7 i  ]# Y. _) U1 o
:: 复制ER_FLASH和ER_CONFIG
! B9 v: N' b8 d6 Xset x_buildout=%x_buildout%\tinyclr.bin, j- `8 ~, o: K1 i" m
copy %x_buildout%\*.* %x_bindir%\ /y
& G. r" U$ M- M: q7 rcopy %x_bindir%\ER_FLASH %x_bindir%\TinyCLR.bin /y2 M4 `% L* t8 n
8 U4 C, P9 M3 b
del %x_bindir%\ER_FLASH /f/q+ M- ?3 S3 x" |2 g6 m2 G- O
/ t2 k+ p- k: g9 i) v8 e' ?
echo 输出已复制到 %x_bindir%\
5 D7 i3 I6 n% t2 Q4 G) \6 A1 H% M
pause

9 T% E( f0 L$ G4 H$ \- m% H0 r编译完成后,会把输出赋值到E:\MF\MFBin目录,MFBin目录与PK并排!
7 y& D5 `# Y1 }0 A9 j% u9 i( \$ _& I6 K/ ^7 M+ l  }
4,既然我们前面增加了一种MDK编译器,那么还有一个地方要修改/ m8 [1 ~& o* K8 @) ?8 W( n
MFPK是采用MSBuild这个编译系统的,所以我们要修改E:\MF\PK\tools\Targets\Microsoft.Spot.system.mdk.targets,大概40行增加

0 S6 F* C: p5 H& @5 U<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>
8 P' k/ j4 G8 O; E脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于MF4.2(RTM QFE2)以上版本
  ~" u8 e% g2 s; S* k2 _.Net Micro Framework移植编译脚本8 R( B: N) N( [  K/ f7 P6 d* |

" B8 y$ _0 L4 {  t" f三、编译& V( r6 ?5 J) g8 d9 f! ^
没错,到了这里,可以编译了!双击
STM32Stamp里面的Release_Flash.bat,编译就开始了3 \& b) e$ B/ o2 s+ r
输出目录是E:\MF\PK\BuildOutput
. n, r: A$ k! @/ x+ `4 J第一次编译,需要非常非常久,传统SATA超过半个小时,SSD也得二十多分钟。
% m2 |3 Q. z6 Z5 H; C- j) Y/ T后面编译就快了,SATA需要5到10分钟,SSD需要两三分钟
- C( J/ R" T6 f7 i然后,第一次编译,基本上会有错误,这个不用管它,再来一次,多编译几次,直到没有错误或者错误个数恒定下来为止/ _) E: e; x4 [2 ]  g: y
在这一步,可能会产生各种各样的问题,只要我们找到问题所在,就可以使用相应的招数来对付!9 t$ L# v( E9 ]
编译脚本详解请看:) j6 U1 T2 t3 J% L( e! ^
.Net Micro Framework移植编译脚本8 }3 ?7 J$ h, t2 q5 ~6 n- P
! k  j% @1 }/ Y4 Q) Q+ b/ g
为了尽可能的保持跟大家一样,我通过SVN把代码更新到刚安装PK的时候,2012年5月1日!* H; y/ l% L- n9 z, d8 c4 X
还删除了输出目录BuildOutput!- @* ?4 j- {% ^6 [
我很幸运,编译一次性成功
,这标志着MF移植的第一步已经完成

% Y, I8 B+ f: T5 @6 ~
- e# d) p7 `- s& V+ N+ z
在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件!+ U+ Z' I5 M, ~3 k. p9 S+ q3 Z6 S4 b& O
赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看
《开发板通用刷机教程》9 |/ f# H4 W2 z% _& C( e/ z
接上串口,上电,开机,串口软件显示出来MF的启动信息:

8 e8 G( H* W, {$ e% q* c. ]3 q  ^: i: s1 C0 p
看到这些启动信息,标志着MF移植第二步已经完成!剩下的就是精雕细琢了!
7 z5 U6 N1 s% M) A
- v( K3 S7 A# |! A0 b四、编译原理# P; O% y  j4 }# P$ A& h
了解编译原理更利于我们的移植工作。
& \. ^9 L2 W( Y6 l( ~( n. z1,MFPK整个编译体系采用MSBuild,所以Visual Studio和.Net 4.0必不可少!(上面脚本中可以看到调用msbuild命令)
5 Z' I2 A' |. s6 U
2,前面我们修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有兴趣的可以自己慢慢看;7 s! R" s9 |- H; ]% ?9 q0 l
3,每一个MF方案就是一个项目proj,它引入其它更多的项目;+ B( G: Z& n$ K
4,编译一个方案时,它会根据先后顺序和引用关系先编译其它项目,这跟C#项目引用一起编译有点类似。首次编译需要编译所有项目,所以要很久,以后只需要编译修改过的项目即可,所以就快多了;0 G' Z: k9 b! b4 ]2 }; }" m6 n
5,targets指定如何去编译每一个项目生成obj文件,我们这里自然就是调用MDK来编译啦, E5 y( s, z4 p
6,MF大部分源码由C++编写,项目文件里面除了源代码以外更重要的是头文件,也就出现了很多目录的引用,绝对能让你头晕。C++项目之间的引用是通过引用头文件来实现的,不同于C#项目只需要引用项目或者程序集即可,所以,目录结构非常重要。5 T! _; j7 P' [/ W
7,MSBuild会为每一个项目源代码创建一个进程,这很浪费时间(频繁创建进程),但是很保险,相互间不干扰;
' `7 b0 |* M8 ~2 [' X

& J( ?) c) y( h; V: H* {
五、纠错
2 ]+ M: x( s' r0 A: n; c$ F出错在所难免,但是MSBuild是针对每个项目逐个编译的,尽管某个项目编译出错,它也会继续往下编译。屏幕滚得太快,我们根本就没有机会查看详细错误!然后它最后之后报告有多少个错误,大概哪里错了,几乎很难知道错误的详细信息这就是MF移植的最大困难所在) n( i! q# Z2 ]& h
在上面的编译脚本中,msbuild那一行后面有个注释,那就是把msbuild的结果输出到一个日志文件build.log里面去。编译完成以后我们就可以用文本编辑器打开,搜索关键字“error”,一般那里就有详细的错误信息啦!
$ X7 s7 A' V+ S; Z  A当然,具体的代码错误只能靠各人的功力了!我们欢迎交流各种常见的非代码错误
# N" O; Z1 V+ p9 Y: J5 S
2 I8 D1 G9 W9 j- {常见错误:! P( H' \! M: y+ H6 Q
1,没有和谐MDK。新手编译直接报几百个错误的,多数就是它;
0 u/ d. `% X) C" ?4 I! E- N2,VC++ 2010、MDK 4.54、MFPK 4.2(RTM QFE2)这些版本不对;* m1 w  j9 |7 I# K$ J8 {9 @
3,缺少碎片文件。比如不少项目就没有TinyCLR\scatterfile_tinyclr_mdk.xml文件;
: O1 ?( I# E- e7 Z) x4,不要用MF的那个什么向导,它生成出来的方案,很难编译通过
+ j% g" R" T% n0 X7 v4 B) A/ R

7 t) X6 j! l8 P- tEnd.
收藏 评论1 发布时间:2012-11-9 12:12

举报

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

所属标签

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