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

.Net Micro Framework移植基础(STM32)

[复制链接]
大石头-349572 发布时间:2012-11-9 12:12
如果对MF移植之前的东西有疑问,请看论坛置顶帖.Net Micro Framework导航总贴(新手必看)/ g) A. M6 R9 i& _' t
$ R9 r, U5 ~7 h9 i8 f
硬件:STM32F103ZET6/STM32F103VET6,采用这两种MCU的任何开发板、学习板、核心板……
+ k3 u1 f- ~) Z% H. b
1 o  u% k% _/ k- y2 M0 y软件环境:
4 X' q7 d6 o% X! Y* ^1 |% _系统:Win7 x86    其它系统我不肯定行不行,我两个都是Win7x86,估计WinXP也行。操作系统的影响应该不大!
# c- B( ^- A' W: T9 A% s2 Y0 g
http://msdn.itellyou.cn/5 t3 S) y$ L+ \9 z, `8 C) P  N2 F
开发:Visual Studio 2010 C#/C++    必须安装VC++,很多人可能只有C#,那是不行的。vs2008据说可以,而vs2012没试过。( P, M" }+ B& d7 t' b
http://msdn.itellyou.cn/
; z5 k0 @* s) ?1 J1 m0 x- _2 o, S! @cn_visual_studio_2010_ultimate_x86_dvd_532347.iso (2.5 GB)5 Z8 C9 n1 b. b8 o9 o8 H
汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高
* ~+ p8 I. X3 t, ?3 L* C- w6 u3 U
https://pan.baidu.com/share/link?shareid=109154&uk=2432978109
4 `0 [7 d  n6 m8 lhttp://www.kuaipan.cn/file/id_2378544298640124.htm
$ r; z7 }, H) ?6 L
和谐包http://www.kuaipan.cn/file/id_2378544298617835.htm6 `% q$ f+ `9 @! Q/ {# V

) K9 H! `7 K# ]4 ~* W.Net Micro Framework Porting Kit 4.2(RTM QFE2), r2 a4 N9 [" Z
(我们称之为MFPK422$ B# {$ h9 n( E
http://netmf.codeplex.com/releases/view/91594

! D8 r- V3 Q% ^( Mhttps://pan.baidu.com/share/link?shareid=109166&uk=2432978109; {  d  W* Q+ |) J' U" w
. n9 @5 i; w! M
另外,你还需要一个高级的文本编辑器,我用的是Notepad++
: y4 E6 Q9 {$ G& q% E6 o强烈建议你把MFPK安装到有固态硬盘上!!!(为此我专门买了三星64G,419块)3 p; t; j- m+ O! `- `1 L$ x

, h' K, ^& d( P) _4 K* j一、安装% Z$ c+ r2 t, |
Keil MDK安装到C:\Keil,一会我们要用C:\Keil\ARM,如果不是这个位置,一会就自己用Win7建立软链接,或者修改编译脚本,我不负责!, y( O1 S- N5 i* N: Q
自己河蟹,否则一会编译出错可自己负责。(今天果真就有人犯错,怎么换MFPK和MDK都是报两百多个错误)( c: s  a+ B' X
MFPK安装到C:\PK或者E:\MF\PK都行。
0 z" M6 ]( b3 a/ K, y$ p# R6 F
& ^: l4 p' h, I  Q二、编译脚本: I  A1 Z/ ~/ D6 T3 k7 ~0 k
把编译做成了双击可用的批处理脚本,跟别人的有些不同,大家统一按照我的做。# ^# J  _/ {& U8 b- {/ Y& L+ L
建议大家建立自己的SVN,托管整个PK目录,还可以记录每一次修改历史3 X- k$ A/ R2 Z: s3 e9 }
1,PK根目录下有个setenv_MDK.cmd,如果没有,就新建一个,如果Keil安装目录不对,也是这里修改
,整个文件就这两行!

# _& z5 d1 ]9 }$ g: U
@echo off
- P1 x6 \+ [4 b& |7 b- W1 ~
7 R3 B( e$ `3 S! r) Ksetenv_base.cmd MDK PORT %* C:\Keil\ARM
( t3 K( L, a7 L' E
6 C4 U% o" N' `6 _) F
2,修改根目录的setenv_base.cmd/ F0 ^* s0 \( k% L7 f7 W! {# e0 H
大概在14行,加上一种编译器MDK,因为写MDK4.12之类的太累了,也不方便升级MDK3 {7 e% O6 Q* K& w. k! X& }
:ERROR
* g" @5 V$ F* p7 o+ _5 M6 I@echo.' J  ?0 W7 {1 u& k6 X1 q0 s" [
@echo Error: Invalid Arguments!
" P6 }% U' ], H7 n2 R@echo.9 @) r; w: g" B' W1 M/ u& `2 Z5 O
@echo Usage: setenv_base COMPILER_TOOL_VERSION" r5 i3 e4 M7 z& P
@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
! V3 f4 r$ t" @- j/ T" _* N  ]0 X  _@echo.' a$ R9 X: n# R. ?! q/ S9 j! ?

4 C1 O" o- u4 x$ g大概89行,增加这种MDK编译器$ T( a) u7 j, i+ }% I' v# G: u
IF /I "%COMPILER_TOOL_VERSION%"=="ADI5.0"   CALL :SET_BLACKFIN_VARS
4 F7 \8 u( e5 O& iIF /I "%COMPILER_TOOL_VERSION%"=="GCC4.2"   CALL :SET_GCC_VARS
3 z, t( G+ a) N% H1 X% NIF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1"   CALL :SET_MDK_VARS# F: y0 o' X1 p, S# {: K: Y
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS9 [: _+ A1 f* H
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.12"  CALL :SET_MDK_VARS& ?# \  f. z% {1 Q
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.13"  CALL :SET_MDK_VARS! @- I3 J% b4 ^( ?" M
IF /I "%COMPILER_TOOL_VERSION%"=="MDK"   CALL :SET_MDK_VARS! [* S! \' ?' j
, p9 N( A! Z) {) l8 P6 H" N4 M# `
3,Solutions目录里面,就存放着针对不同板子的编译方案。为了方便编译,我们直接在每个方案里面放置一个编译批处理脚本,这个脚本是通用的,拷贝到不同方案目录都可以。: W7 o- B% R/ t" b
这里以
STM32Stamp为例,路径是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat2 N, }% s0 o4 E8 _8 z
:echo off
. ]% I- x2 q" ^! Q* @5 Q8 p$ C4 r:: 设置一些参数
% r2 r' {, G1 q2 z% k# aset x_flavor=release
- C/ w+ {3 b7 a" k0 @set x_memory=flash
" F2 H" o! t4 U2 c& Hset x_root=..\..\
$ W+ S8 Y  W+ ~5 }$ m  n2 b+ H9 a/ X7 z8 [- K' f& r. x- x( J
:: 先尝试取得当前目录名,作为方案名# n  i' \5 w+ e' t

& N  A2 H! E" `2 ?for %%i in ("%cd%") do set x_name=%%~ni* F" p6 {' [  G# M

0 v1 v) ?! x8 K* {7 Q) }% Ttitle 编译MF方案[%x_name%][%x_flavor%][%x_memory%]4 C4 ]' E9 C$ M! l1 O
+ r0 Q# U/ b7 ]5 i9 s; ~
pushd %x_root%! A  l  {- V! j4 s! k1 \, \& a! ~
call setenv_MDK.cmd
9 @5 J4 \/ ]/ y5 V3 lpopd: K* r- a" i: T0 k! h# n  u& s6 Z$ v

+ R5 V' x; n* Ycall msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%9 F% h& Y# j) c% ~
:: > build.log
; p8 ]9 Z1 M* |$ m! y4 ~
# l+ X% f7 x6 M, D7 p& |echo 编译完成
; [6 n* E& p  t) Q5 ?
) R$ Q( @: c+ j1 M: F- h2 D" i:copybin
- b. {) j" o7 x7 Y. ]# W:: 把生成的文件复制出来
) @+ I4 t/ {9 e0 _set x_buildout=%x_root%BuildOutput\THUMB2\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin
6 r" {0 v% A  b2 g! Jif  not exist %x_buildout% set  x_buildout=%x_root%BuildOutput\THUMB2FP\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin: G0 T0 k% b7 v/ j" W9 Z
set x_bindir=%x_root%..\MFBin\%x_name%
! y: ^% z6 z9 k( A* R
, M) t$ w4 }3 r5 O3 [if not exist %x_bindir% md %x_bindir%
& u8 }  ]$ [: ~% E& j:: 复制TinyBooter.bin
+ S) f# `* ~2 o0 `  Z7 t1 E, hcopy %x_buildout%\*.bin %x_bindir%\ /y2 q% Y& ?5 |* u+ n  G2 ~
copy %x_buildout%\*.axf %x_bindir%\ /y3 H; R& n3 }4 U+ ]
9 p+ u# f6 N3 ^6 O5 \
del %x_buildout%\*.bin /f/q
) ^$ W3 R8 y1 T  O6 vdel %x_buildout%\*.axf /f/q1 e) e8 D4 |8 Q! i" D/ C
% s7 n9 o7 Y. K2 a* q5 }5 Q
:: 复制ER_FLASH和ER_CONFIG
; P# Z4 D, o8 J% ^  wset x_buildout=%x_buildout%\tinyclr.bin
; {# X: Z7 B: B: h6 [- Z6 ycopy %x_buildout%\*.* %x_bindir%\ /y- @" N$ j' @7 M9 V% a  U, u. e
copy %x_bindir%\ER_FLASH %x_bindir%\TinyCLR.bin /y
% g! @4 n' O: p; H% Y6 m& ], _: [0 M  q9 `5 R9 ^! \( L/ P
del %x_bindir%\ER_FLASH /f/q) y. R) V0 ~- p; ]8 f, t3 S8 Q; V

, g  N) x/ w; Q6 Xecho 输出已复制到 %x_bindir%\3 i! e0 J2 \0 P( U8 A+ k3 X
7 F; f9 M1 }" c. f( H3 R8 d
pause

/ ]1 b0 M  N7 t1 y3 J3 a编译完成后,会把输出赋值到E:\MF\MFBin目录,MFBin目录与PK并排!, @1 ^0 @/ D4 n5 q& S# T
# d+ O+ C- g- A1 m% G
4,既然我们前面增加了一种MDK编译器,那么还有一个地方要修改* A' Q/ L5 n! N9 O4 c0 M/ j5 \
MFPK是采用MSBuild这个编译系统的,所以我们要修改E:\MF\PK\tools\Targets\Microsoft.Spot.system.mdk.targets,大概40行增加
5 A* G# ^  O" Q: Q5 ~
<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>
. s- @1 q" ~8 ]( [2 {, }) z脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于MF4.2(RTM QFE2)以上版本
& N8 ?; t" Y; V2 f0 q& V.Net Micro Framework移植编译脚本
% l# ?3 L/ a- x/ L/ ]2 ]0 B1 }& ~' w' M1 q
三、编译
! K* q& @9 Z& X没错,到了这里,可以编译了!双击
STM32Stamp里面的Release_Flash.bat,编译就开始了
2 t+ Y% \- V. Q2 Z" ?3 m' h0 ]5 s8 r6 H输出目录是E:\MF\PK\BuildOutput& t7 C* E6 A8 t6 l% z
第一次编译,需要非常非常久,传统SATA超过半个小时,SSD也得二十多分钟。. O% P0 _# n7 u7 b# T- D; \6 l
后面编译就快了,SATA需要5到10分钟,SSD需要两三分钟
7 |" q: g8 @  F% z' E- O然后,第一次编译,基本上会有错误,这个不用管它,再来一次,多编译几次,直到没有错误或者错误个数恒定下来为止# O  E  {9 ~& H4 N3 y, Z3 G
在这一步,可能会产生各种各样的问题,只要我们找到问题所在,就可以使用相应的招数来对付!
6 @7 {, o5 F# ^  {, D$ ?编译脚本详解请看:
% y1 L1 u: \( s+ _/ {& v
.Net Micro Framework移植编译脚本& e" Y5 F$ I' V& B2 f
% x" N! Q0 w- X! |1 y  \8 w
为了尽可能的保持跟大家一样,我通过SVN把代码更新到刚安装PK的时候,2012年5月1日!
" t# i! C, G" X  T) m还删除了输出目录BuildOutput!  x) B! l6 n2 h2 T5 I. p5 k# i) s
我很幸运,编译一次性成功
,这标志着MF移植的第一步已经完成
. A# C4 {5 h3 ?  [5 t" u9 S$ N

+ ^0 i% o3 R4 \! D2 V6 a
在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件!$ g+ V9 H1 u" e7 H% o
赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看
《开发板通用刷机教程》
) v) Z" r' W* w6 t+ o接上串口,上电,开机,串口软件显示出来MF的启动信息:

0 H$ l6 G. T9 m5 ~" N, R6 S* n. p( ]4 A/ ^4 z6 U' \
看到这些启动信息,标志着MF移植第二步已经完成!剩下的就是精雕细琢了!
5 Q% F. }" P- {5 E& J& t; W4 G3 O+ V  R4 F
四、编译原理' R2 a+ X& n( J& P, \& j. R
了解编译原理更利于我们的移植工作。$ p& n* R( l* v" I( d' T
1,MFPK整个编译体系采用MSBuild,所以Visual Studio和.Net 4.0必不可少!(上面脚本中可以看到调用msbuild命令)
- Z& w& x0 y) Y4 A
2,前面我们修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有兴趣的可以自己慢慢看;
8 `2 |- c8 H0 Z5 v4 g/ l, h& o
3,每一个MF方案就是一个项目proj,它引入其它更多的项目;1 D5 }1 l5 [$ @9 S' P# I) \
4,编译一个方案时,它会根据先后顺序和引用关系先编译其它项目,这跟C#项目引用一起编译有点类似。首次编译需要编译所有项目,所以要很久,以后只需要编译修改过的项目即可,所以就快多了;
1 B3 q2 y) y5 M8 ]) }; M
5,targets指定如何去编译每一个项目生成obj文件,我们这里自然就是调用MDK来编译啦( {" x( @  C2 H( [$ S* f2 e! G
6,MF大部分源码由C++编写,项目文件里面除了源代码以外更重要的是头文件,也就出现了很多目录的引用,绝对能让你头晕。C++项目之间的引用是通过引用头文件来实现的,不同于C#项目只需要引用项目或者程序集即可,所以,目录结构非常重要。
* k3 S6 ?& B$ i- ]% H" b, b& M7,MSBuild会为每一个项目源代码创建一个进程,这很浪费时间(频繁创建进程),但是很保险,相互间不干扰;4 ^% D" ~8 _! x. u1 s
1 o8 Y/ u, i6 @/ k
五、纠错% i. K! B- o; P& z. m
出错在所难免,但是MSBuild是针对每个项目逐个编译的,尽管某个项目编译出错,它也会继续往下编译。屏幕滚得太快,我们根本就没有机会查看详细错误!然后它最后之后报告有多少个错误,大概哪里错了,几乎很难知道错误的详细信息这就是MF移植的最大困难所在
: i+ j# L( b% |% F; b: W
在上面的编译脚本中,msbuild那一行后面有个注释,那就是把msbuild的结果输出到一个日志文件build.log里面去。编译完成以后我们就可以用文本编辑器打开,搜索关键字“error”,一般那里就有详细的错误信息啦!( H( i7 C/ p1 p. E7 f
当然,具体的代码错误只能靠各人的功力了!我们欢迎交流各种常见的非代码错误0 h3 u, a- ]) A0 e$ D
+ P2 f9 E' T# \) q: ~2 f5 z
常见错误:
9 Q* s% ?: [; |+ R) W, Z1,没有和谐MDK。新手编译直接报几百个错误的,多数就是它;2 G7 A) r* l/ E" p2 m
2,VC++ 2010、MDK 4.54、MFPK 4.2(RTM QFE2)这些版本不对;& J( g) r8 T9 W: f& v2 Z
3,缺少碎片文件。比如不少项目就没有TinyCLR\scatterfile_tinyclr_mdk.xml文件;% a5 M3 E3 P% I; @
4,不要用MF的那个什么向导,它生成出来的方案,很难编译通过0 Y! b: H; Z' Q/ P9 ?
, X) \% @* L/ S8 J' N( n
End.
收藏 评论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 手机版