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

.Net Micro Framework移植基础(STM32)

[复制链接]
大石头-349572 发布时间:2012-11-9 12:12
如果对MF移植之前的东西有疑问,请看论坛置顶帖.Net Micro Framework导航总贴(新手必看)- a6 [7 K7 D& k5 Q; }+ _- C# P
6 D5 z- b" }) ]) t+ D- ^2 G: Q
硬件:STM32F103ZET6/STM32F103VET6,采用这两种MCU的任何开发板、学习板、核心板……* r: r. d* ^# V
7 R4 h1 p9 v. A" J/ r
软件环境:
. l7 P+ N; T8 w  X系统:Win7 x86    其它系统我不肯定行不行,我两个都是Win7x86,估计WinXP也行。操作系统的影响应该不大!
' `/ C$ a# w# Z
http://msdn.itellyou.cn/
+ i3 j: w; o3 {! x0 ^: c, \$ h# Z
开发:Visual Studio 2010 C#/C++    必须安装VC++,很多人可能只有C#,那是不行的。vs2008据说可以,而vs2012没试过。
6 Y% i) u8 h- Zhttp://msdn.itellyou.cn/0 g1 O4 ^2 B6 F# z9 X3 o: c
cn_visual_studio_2010_ultimate_x86_dvd_532347.iso (2.5 GB)
1 n4 v$ `0 w* `1 l汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高
3 j  J( l! S( R, V
https://pan.baidu.com/share/link?shareid=109154&uk=24329781097 Q5 {. V" v* G/ K. J5 r
http://www.kuaipan.cn/file/id_2378544298640124.htm
  b% b$ L5 P3 ]# \: }: a! y
和谐包http://www.kuaipan.cn/file/id_2378544298617835.htm. r5 _  o! F* L& ~& ^7 @

3 G- Q. s9 |  Y& K  [; D.Net Micro Framework Porting Kit 4.2(RTM QFE2)* \1 Q0 k$ J/ f2 r! t/ f9 w, e: _
(我们称之为MFPK422)
6 j2 `: F, x: |http://netmf.codeplex.com/releases/view/91594
- D/ Y: e8 U8 }) ^4 a' P
https://pan.baidu.com/share/link?shareid=109166&uk=24329781092 s7 E1 a1 W& V8 a- K; D
9 `3 Y0 R- a' n) X+ S$ V& b
另外,你还需要一个高级的文本编辑器,我用的是Notepad++!
  j5 u* Y9 ?: H. u. x5 q强烈建议你把MFPK安装到有固态硬盘上!!!(为此我专门买了三星64G,419块)
, h$ J; ~4 c# B6 S
% [* F3 w: N- ]5 \- D一、安装  H% o4 V8 T: ]8 s: U, b) f
Keil MDK安装到C:\Keil,一会我们要用C:\Keil\ARM,如果不是这个位置,一会就自己用Win7建立软链接,或者修改编译脚本,我不负责!$ `) v8 R( u4 W1 W) n7 |  |
自己河蟹,否则一会编译出错可自己负责。(今天果真就有人犯错,怎么换MFPK和MDK都是报两百多个错误)3 j& Z8 ^0 r' n% ^
MFPK安装到C:\PK或者E:\MF\PK都行。
5 f' ~" j$ _8 P; u4 {7 ]2 X( s4 w8 u5 U+ E' f
二、编译脚本
; T+ C; z* j; O5 j, `; F* f/ k我把编译做成了双击可用的批处理脚本,跟别人的有些不同,大家统一按照我的做。
& K. M* I& V6 E2 P1 s# W建议大家建立自己的SVN,托管整个PK目录,还可以记录每一次修改历史!
2 p/ y( {& o1 g) }1,PK根目录下有个setenv_MDK.cmd,如果没有,就新建一个,如果Keil安装目录不对,也是这里修改
,整个文件就这两行!
& ?) k. v0 [1 z0 [* n
@echo off" G, l+ m7 z0 |' u
1 z/ p7 ^2 t/ d: t
setenv_base.cmd MDK PORT %* C:\Keil\ARM
+ I4 n; O5 y/ ~" j4 t$ Q* G
/ R. a5 R8 O8 }- \- Y
2,修改根目录的setenv_base.cmd
8 v1 H# h1 s# R! n6 @
大概在14行,加上一种编译器MDK,因为写MDK4.12之类的太累了,也不方便升级MDK
; A3 n% X: Y2 I2 W- T" Z
:ERROR6 y* M9 b2 k, Q8 s
@echo.
+ v' b# U2 R/ Z4 c/ u2 b* `@echo Error: Invalid Arguments!- a) H4 U7 e3 l, ^7 E2 J* E( e& G
@echo.0 T# S, F3 E) M9 h: v& j. J& _
@echo Usage: setenv_base COMPILER_TOOL_VERSION
5 r- I/ }1 H9 C. ?5 J" s@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' R( d1 W( q8 Q* V- ]
@echo.
% h1 g% [  @# D4 d6 V  ^$ c* O1 G

5 x/ y5 z% s6 B3 w, z大概89行,增加这种MDK编译器9 H$ d( H; Y2 q& O, {8 B
IF /I "%COMPILER_TOOL_VERSION%"=="ADI5.0"   CALL :SET_BLACKFIN_VARS* l0 m% H% K$ f2 b) ?
IF /I "%COMPILER_TOOL_VERSION%"=="GCC4.2"   CALL :SET_GCC_VARS ( D/ F8 l0 D7 s+ p! y: Y( w/ u9 x- Q) A
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1"   CALL :SET_MDK_VARS3 v. w9 T6 z; }: a% [9 I9 D
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS
4 t4 p, J# k. _, R6 W* XIF /I "%COMPILER_TOOL_VERSION%"=="MDK4.12"  CALL :SET_MDK_VARS
! |3 ~6 p3 a5 ?4 [1 WIF /I "%COMPILER_TOOL_VERSION%"=="MDK4.13"  CALL :SET_MDK_VARS# t* O3 i% Z& ]4 i9 O8 e7 p7 p
IF /I "%COMPILER_TOOL_VERSION%"=="MDK"   CALL :SET_MDK_VARS
" L0 ], _% l& e0 ]( v3 E

2 ^' n9 W0 U& h% R7 D, P3,Solutions目录里面,就存放着针对不同板子的编译方案。为了方便编译,我们直接在每个方案里面放置一个编译批处理脚本,这个脚本是通用的,拷贝到不同方案目录都可以。8 o6 M  _5 Q( q: s7 h  k
这里以
STM32Stamp为例,路径是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat2 d; R1 e  t8 z' C! J
:echo off
! }+ t$ b5 P" r" c5 S  A, e; H:: 设置一些参数, `4 ^, ~% l% A+ F2 U
set x_flavor=release4 w* s2 r2 x& ?. c; g$ ]
set x_memory=flash" b& p( _. M" l' |
set x_root=..\..\" ]8 z* p& q* Y$ i' H1 D

! S, A5 q, B3 q" F# p* |! q9 r6 D/ [% E:: 先尝试取得当前目录名,作为方案名
2 d, D+ D4 u3 W; @* H) Y* ^; }- N) H( c/ \! T# P" f
for %%i in ("%cd%") do set x_name=%%~ni
2 v2 f0 A1 F1 S% N1 B2 ~  C
) u; ]- q# q! V$ c. _$ B, Vtitle 编译MF方案[%x_name%][%x_flavor%][%x_memory%]
/ h8 V5 V- E. i
+ c% Q  V4 Q7 e6 v0 hpushd %x_root%
$ o8 V* m! N/ j; o: ycall setenv_MDK.cmd
- S) w( \- b2 e& xpopd8 {2 p- u! P9 @% y% p) }0 T/ T+ p* k

+ c! V. I3 T. v! g5 p, Ocall msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%( H# ]* X! {8 U( J+ a) S& J4 L
:: > build.log: @, E! J) T& Q% @

6 s2 C+ e, |- d2 `0 f& [6 [0 [echo 编译完成
4 d/ P1 I2 @+ w9 T  }9 z
  \4 M+ o  I1 P3 y:copybin) b- F- V+ \& M! b; B; d0 ~
:: 把生成的文件复制出来0 H8 Y1 D0 T+ t6 x$ F, j
set x_buildout=%x_root%BuildOutput\THUMB2\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin% H: {% j5 `" |& j; H% n# @
if  not exist %x_buildout% set  x_buildout=%x_root%BuildOutput\THUMB2FP\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin$ H4 A% A& |9 u  M8 S( s6 \
set x_bindir=%x_root%..\MFBin\%x_name%
* W! B- I7 q! c( H3 v' j5 S$ k7 u6 r2 m0 T
if not exist %x_bindir% md %x_bindir%
% [: r+ D- |0 H& i5 [:: 复制TinyBooter.bin3 w) `( G, F/ w1 \! H1 u& ^5 M3 l
copy %x_buildout%\*.bin %x_bindir%\ /y
' }1 ~, S% Y+ S; T, r$ U7 Ncopy %x_buildout%\*.axf %x_bindir%\ /y
$ x4 U6 w  G- G; f: |) W$ a8 [% [1 G2 K5 ]; S; {1 j
del %x_buildout%\*.bin /f/q
/ d) G" u$ b5 b7 z3 b+ _  `9 _del %x_buildout%\*.axf /f/q: P7 _  q3 o' ?* Y8 @
8 [% g8 \% ?2 M
:: 复制ER_FLASH和ER_CONFIG
. b' j5 ~+ j. C5 aset x_buildout=%x_buildout%\tinyclr.bin
1 ^, h0 O1 @% N, G; C  Q- N: `copy %x_buildout%\*.* %x_bindir%\ /y/ \, c9 t7 {, s0 F5 J1 p: Y
copy %x_bindir%\ER_FLASH %x_bindir%\TinyCLR.bin /y
2 u% D! b' Y3 t: ?7 u! ?" c% {! C6 v5 D8 K- |
del %x_bindir%\ER_FLASH /f/q
9 L. L. Q4 H0 [( B" U" n" j2 @1 W8 s7 g1 M. q; b3 ]' f
echo 输出已复制到 %x_bindir%\% H/ T$ a7 \1 Z' z- \
1 M9 L6 N, P" m2 i6 B1 ^
pause
7 {! h5 K* _# q- j. \) J
编译完成后,会把输出赋值到E:\MF\MFBin目录,MFBin目录与PK并排!
# x# i4 I( ^" }8 O; x) a' a% j" g, Y
5 x5 O- H9 G' B4,既然我们前面增加了一种MDK编译器,那么还有一个地方要修改4 a4 D+ [9 z( w* R1 ]
MFPK是采用MSBuild这个编译系统的,所以我们要修改E:\MF\PK\tools\Targets\Microsoft.Spot.system.mdk.targets,大概40行增加

% r2 T2 p% ~* L/ {5 v<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>  B5 e& d& a9 t3 S. ~
脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于MF4.2(RTM QFE2)以上版本!0 ^% S1 ^& L- t! p* ^9 A3 J
.Net Micro Framework移植编译脚本
% W" q) z5 z+ v) v$ O% C- j* Q* g; c  W! e) v9 r
三、编译
- e& e& _& }, z没错,到了这里,可以编译了!双击
STM32Stamp里面的Release_Flash.bat,编译就开始了!
9 x3 u1 R8 h4 e( u1 o6 L输出目录是E:\MF\PK\BuildOutput
( q7 s( _: O% H' H4 Z第一次编译,需要非常非常久,传统SATA超过半个小时,SSD也得二十多分钟。& {& F' E1 C: w! J8 I
后面编译就快了,SATA需要5到10分钟,SSD需要两三分钟
" ]* h) B: @0 V/ K$ b然后,第一次编译,基本上会有错误,这个不用管它,再来一次,多编译几次,直到没有错误或者错误个数恒定下来为止!
% S& H! v$ r& W+ x) n
在这一步,可能会产生各种各样的问题,只要我们找到问题所在,就可以使用相应的招数来对付!
% I0 e( y" `4 `# |- ?; \4 |编译脚本详解请看:9 Q" O! w3 i- T3 D9 Y7 H
.Net Micro Framework移植编译脚本
! e" s% p5 e5 e- B0 @# }
' N3 ^3 @# }- l( ^" O3 W
为了尽可能的保持跟大家一样,我通过SVN把代码更新到刚安装PK的时候,2012年5月1日!' c3 \+ [" l- q+ {: ?7 ]8 e
还删除了输出目录BuildOutput!/ n9 P8 S: s7 q: I  ^0 r
我很幸运,编译一次性成功
,这标志着MF移植的第一步已经完成!
3 d" ]+ o5 f% s0 H, r2 P7 Z
: O  p% j1 g. S5 f# L- y& X% b8 o
在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件!
. g$ n! n! x1 |8 d6 ^/ Z/ G赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看
《开发板通用刷机教程》" I- Q( @; k: X' P: N1 P
接上串口,上电,开机,串口软件显示出来MF的启动信息:
3 B( k" U; D/ ?5 {+ l9 G& h

5 h: J0 h: O# L* t0 d* N看到这些启动信息,标志着MF移植第二步已经完成!剩下的就是精雕细琢了!
4 k: L& y* u% y5 n& q$ m# R6 F9 Q: q: ?3 m
四、编译原理
/ @- I# o1 P! p0 d* e1 N" Z了解编译原理更利于我们的移植工作。
4 @) [6 F. B7 W3 j) A1,MFPK整个编译体系采用MSBuild,所以Visual Studio和.Net 4.0必不可少!(上面脚本中可以看到调用msbuild命令)& e, F) q, ~- k* \( F% t/ j
2,前面我们修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有兴趣的可以自己慢慢看;$ X9 o5 r5 S; ^& f- c0 y6 }, J+ [
3,每一个MF方案就是一个项目proj,它引入其它更多的项目;- W. S6 D" g1 N8 ]$ e7 ]7 G
4,编译一个方案时,它会根据先后顺序和引用关系先编译其它项目,这跟C#项目引用一起编译有点类似。首次编译需要编译所有项目,所以要很久,以后只需要编译修改过的项目即可,所以就快多了;
+ i: P5 M6 A- d3 Q3 E5 [
5,targets指定如何去编译每一个项目生成obj文件,我们这里自然就是调用MDK来编译啦;
- V3 t4 x: Z: x# }0 W7 U6,MF大部分源码由C++编写,项目文件里面除了源代码以外更重要的是头文件,也就出现了很多目录的引用,绝对能让你头晕。C++项目之间的引用是通过引用头文件来实现的,不同于C#项目只需要引用项目或者程序集即可,所以,目录结构非常重要。
( ?2 K$ w! O/ M2 Z  y- y7,MSBuild会为每一个项目源代码创建一个进程,这很浪费时间(频繁创建进程),但是很保险,相互间不干扰;4 z( o! U2 ?# `/ T, B  h

' B0 u/ ~/ d, i% |# R
五、纠错
1 \! V: z: V( K$ Z* `  w# t出错在所难免,但是MSBuild是针对每个项目逐个编译的,尽管某个项目编译出错,它也会继续往下编译。屏幕滚得太快,我们根本就没有机会查看详细错误!然后它最后之后报告有多少个错误,大概哪里错了,几乎很难知道错误的详细信息,这就是MF移植的最大困难所在!
% Y) y# J* ^- t6 d
在上面的编译脚本中,msbuild那一行后面有个注释,那就是把msbuild的结果输出到一个日志文件build.log里面去。编译完成以后我们就可以用文本编辑器打开,搜索关键字“error”,一般那里就有详细的错误信息啦!+ @! e9 C% R' A6 _
当然,具体的代码错误只能靠各人的功力了!我们欢迎交流各种常见的非代码错误!
. i% _( u( L1 L. Q9 a
& S- a1 e1 c7 J& B% l) R常见错误:
+ ~' G$ r: ^- T- J. C. m1,没有和谐MDK。新手编译直接报几百个错误的,多数就是它;
7 F9 S! R) }1 {; |' [2,VC++ 2010、MDK 4.54、MFPK 4.2(RTM QFE2)这些版本不对;$ {2 i+ z8 c2 ^0 Y# p
3,缺少碎片文件。比如不少项目就没有TinyCLR\scatterfile_tinyclr_mdk.xml文件;
& I5 q2 R9 [5 o! q+ C4,不要用MF的那个什么向导,它生成出来的方案,很难编译通过;
" z9 G6 f4 P, |  n$ ~: T9 h5 d" }

% l8 Z; c( j# i- u3 _. r9 fEnd.
赞 收藏 评论1 发布时间:2012-11-9 12:12

举报

1个回答
land.xu 回答时间:2015-5-28 13:09:44
看上去不错
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版