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

.Net Micro Framework移植基础(STM32)

[复制链接]
大石头-349572 发布时间:2012-11-9 12:12
如果对MF移植之前的东西有疑问,请看论坛置顶帖.Net Micro Framework导航总贴(新手必看)
7 Y/ q+ a7 l  L. @# s$ g8 j- Y4 [) n! M
硬件:STM32F103ZET6/STM32F103VET6,采用这两种MCU的任何开发板、学习板、核心板……/ T! j8 m8 t& L$ h( b8 I6 X2 |5 e
: [5 x( B( g: x( ]
软件环境:/ k; p, h  M4 D
系统:Win7 x86    其它系统我不肯定行不行,我两个都是Win7x86,估计WinXP也行。操作系统的影响应该不大!
, }' s+ m$ y: u
http://msdn.itellyou.cn/
5 {) r: K7 f2 ?7 l3 l
开发:Visual Studio 2010 C#/C++    必须安装VC++,很多人可能只有C#,那是不行的。vs2008据说可以,而vs2012没试过。' y. h5 v8 L4 f0 v1 x' `3 v  S
http://msdn.itellyou.cn/' ^3 u3 e" [" O$ e! N4 o* d6 G' R% b
cn_visual_studio_2010_ultimate_x86_dvd_532347.iso (2.5 GB)) W. }& g2 B$ q1 ]1 Y
汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高
& J8 ^- P0 M9 B/ l$ F! d
https://pan.baidu.com/share/link?shareid=109154&uk=2432978109
, s  J. I- m# C: U) ]- jhttp://www.kuaipan.cn/file/id_2378544298640124.htm

# C/ u! `, A. ^; c' I2 K; c" O和谐包http://www.kuaipan.cn/file/id_2378544298617835.htm! D! B3 I- A2 V+ W0 V/ C
3 m% l+ Z8 d& U: V( Y# y
.Net Micro Framework Porting Kit 4.2(RTM QFE2)$ a2 T8 V; `, I9 N8 c- h8 u9 q
(我们称之为MFPK422)* \$ F7 R4 f+ S: ~  d
http://netmf.codeplex.com/releases/view/91594

/ v6 H7 N) a* _8 ~' m3 D; k# z; Fhttps://pan.baidu.com/share/link?shareid=109166&uk=2432978109
$ ~$ Q( |7 D: X. Q# m4 D
8 ^  `/ `" |0 _另外,你还需要一个高级的文本编辑器,我用的是Notepad++!4 }: G3 \2 \9 ]! G! d
强烈建议你把MFPK安装到有固态硬盘上!!!(为此我专门买了三星64G,419块)" L# V9 s0 M: d( U. X; N9 X/ b1 Q

' z2 h7 U. n4 L5 Q: R; {一、安装3 ~6 l) a8 Q: ?0 K2 n- ?
Keil MDK安装到C:\Keil,一会我们要用C:\Keil\ARM,如果不是这个位置,一会就自己用Win7建立软链接,或者修改编译脚本,我不负责!# Z$ h; j' x9 Y4 I- e- b5 Z
自己河蟹,否则一会编译出错可自己负责。(今天果真就有人犯错,怎么换MFPK和MDK都是报两百多个错误)  t1 `: _8 f2 [9 ^# l2 Q# v
MFPK安装到C:\PK或者E:\MF\PK都行。
5 Q" A; F1 x; V% L) y  O0 G. g' I# L4 Y. ]6 P& y- K; n4 f
二、编译脚本: T/ W. l; o" W  Q1 o7 {4 l7 t
我把编译做成了双击可用的批处理脚本,跟别人的有些不同,大家统一按照我的做。3 P0 v% n0 t  a* k" T% x2 D8 ^5 N
建议大家建立自己的SVN,托管整个PK目录,还可以记录每一次修改历史!
% M- d1 g0 [/ m; b! ~. G- i1,PK根目录下有个setenv_MDK.cmd,如果没有,就新建一个,如果Keil安装目录不对,也是这里修改
,整个文件就这两行!

! K: F) E- B+ l5 b% b9 A( g1 l* J
@echo off
; p. a8 i# q2 F* r7 x9 W& Y7 ?- E9 u( L
setenv_base.cmd MDK PORT %* C:\Keil\ARM

* P  i2 c  S: |- |- C4 B0 [8 C' A( a, K
2,修改根目录的setenv_base.cmd
7 r1 [# J0 e6 M! j6 i
大概在14行,加上一种编译器MDK,因为写MDK4.12之类的太累了,也不方便升级MDK
$ c6 {+ L7 V# {$ V( I
:ERROR
1 X$ l; p3 T# Q1 p5 W@echo.$ h0 j0 ~% a( v5 y5 r( c! m0 F0 A
@echo Error: Invalid Arguments!
. N% Q  u1 q9 y& j& ?@echo.
- O  \) }3 r; a6 y' U@echo Usage: setenv_base COMPILER_TOOL_VERSION
  K5 V  J' s% w1 U1 t, G( }7 I@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
% }6 r# o9 q. S/ A+ F5 S: G@echo.4 K7 D% ~. K. i
& |+ y9 m+ J" _9 C3 C2 ?4 y2 P
大概89行,增加这种MDK编译器1 ?- A" Y  l. N# f
IF /I "%COMPILER_TOOL_VERSION%"=="ADI5.0"   CALL :SET_BLACKFIN_VARS, N/ l2 Q. Y+ f. |: }9 Y2 J' |  l) K
IF /I "%COMPILER_TOOL_VERSION%"=="GCC4.2"   CALL :SET_GCC_VARS
6 h- _; L+ E/ ^; b6 S- D6 NIF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1"   CALL :SET_MDK_VARS2 Y6 \: r! X* [6 Z
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS
' H) u5 a/ A: b5 UIF /I "%COMPILER_TOOL_VERSION%"=="MDK4.12"  CALL :SET_MDK_VARS2 Z& j! g( f; ^$ ~0 n
IF /I "%COMPILER_TOOL_VERSION%"=="MDK4.13"  CALL :SET_MDK_VARS
+ j1 m& F, I" K. bIF /I "%COMPILER_TOOL_VERSION%"=="MDK"   CALL :SET_MDK_VARS
& ]) U, j1 H5 ^  H+ }8 M5 T( O" f: n

! v4 i( {( q! a# Q  G3,Solutions目录里面,就存放着针对不同板子的编译方案。为了方便编译,我们直接在每个方案里面放置一个编译批处理脚本,这个脚本是通用的,拷贝到不同方案目录都可以。( p" N2 E1 }2 n# M
这里以
STM32Stamp为例,路径是:E:\MF\PK\Solutions\STM32Stamp\Release_Flash.bat
6 {7 u0 v% e2 G  b; Z$ P
:echo off
- f& g6 U- {2 |6 b; j; g:: 设置一些参数
  r9 a3 b/ {  r& k9 Uset x_flavor=release
: d& c8 b' H/ n6 bset x_memory=flash7 _- e1 K# z+ t3 Q/ R/ c
set x_root=..\..\2 e* U+ e9 o" c2 x8 w* _+ f% A' ]( g
6 O( h" {2 r' x- L0 z
:: 先尝试取得当前目录名,作为方案名+ [3 G1 S7 @1 V  K/ e* l: d1 S

- K* Y: m8 a- n! g2 t& Ffor %%i in ("%cd%") do set x_name=%%~ni8 |/ U! u- n+ R

  T8 ^, d1 F& G) d3 Y: vtitle 编译MF方案[%x_name%][%x_flavor%][%x_memory%]/ M! I& {' }3 D8 J1 \  M

5 n: H; ]5 @( P2 V) U  ]: jpushd %x_root%
" S2 B1 |$ E$ n3 J$ l& i" I7 B# Rcall setenv_MDK.cmd
' k- b. y- n1 o: B, c8 N3 D9 S4 xpopd% ^+ U; f1 h  i/ _9 q6 P  j9 `# O) G
4 d* X1 Q: K& B$ F7 T0 Q
call msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%0 f; d% l4 q0 t: X
:: > build.log8 |/ ]0 m: B4 K# s7 Q2 b, [6 Q

; Y. E- _' [( _echo 编译完成
) ~5 W* w( n" l  o$ X. H5 l+ |+ q4 i
& c1 S9 [1 ?6 h6 Z% b:copybin
2 ?4 K& B8 h/ O, h" _:: 把生成的文件复制出来
0 B4 p. |# P6 {( W9 \" o# gset x_buildout=%x_root%BuildOutput\THUMB2\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin$ D/ m9 h5 [* r6 I1 g5 {. N. f
if  not exist %x_buildout% set  x_buildout=%x_root%BuildOutput\THUMB2FP\%COMPILER_TOOL_VERSION%\le\%x_memory%\%x_flavor%\%x_name%\bin
# v, J, G: w4 ?7 U2 Cset x_bindir=%x_root%..\MFBin\%x_name%5 y+ O3 I* @, b3 I* R: d- p
* A' Y, t$ F, J  Y4 I
if not exist %x_bindir% md %x_bindir%
9 f% n4 M- t; V; t- P4 v:: 复制TinyBooter.bin
. Z" _$ ]6 d2 u8 |$ _copy %x_buildout%\*.bin %x_bindir%\ /y
' q# F* [' d' H! g$ ucopy %x_buildout%\*.axf %x_bindir%\ /y
" R/ L  g: N9 l" S5 c& ]1 g; x- @! s; Y2 W9 t( O
del %x_buildout%\*.bin /f/q
8 ?+ a  ]" O9 f- }! `2 fdel %x_buildout%\*.axf /f/q
+ ~% Z4 h5 o; {% P1 m8 ^; Z: P: j6 A, H
:: 复制ER_FLASH和ER_CONFIG  S& U8 {% M  e3 d% m+ I" s
set x_buildout=%x_buildout%\tinyclr.bin
6 j7 C$ v9 p- Y+ J  \( y0 x% r! Qcopy %x_buildout%\*.* %x_bindir%\ /y
- n0 E* W+ M5 f. Ucopy %x_bindir%\ER_FLASH %x_bindir%\TinyCLR.bin /y; D$ o" j, `4 l$ `1 ~( z& m; _

: F6 z  u4 `8 O4 Kdel %x_bindir%\ER_FLASH /f/q
: b( @5 g) F' C' n7 ^$ q6 g
+ g- d7 P- L; j: X; Q4 Qecho 输出已复制到 %x_bindir%\
( U4 V. U: I  L- ]9 k0 V5 b6 M/ f$ W0 T3 L; n
pause
+ G) Y, [- }% L6 D3 }+ V2 q
编译完成后,会把输出赋值到E:\MF\MFBin目录,MFBin目录与PK并排!
; J" X/ ^+ s  i& R
3 w0 h7 _- e2 I0 c0 {4,既然我们前面增加了一种MDK编译器,那么还有一个地方要修改9 P8 }% i( ~6 T) @
MFPK是采用MSBuild这个编译系统的,所以我们要修改E:\MF\PK\tools\Targets\Microsoft.Spot.system.mdk.targets,大概40行增加
* f, A. k1 ~7 i) I5 g
<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># O& P9 I) V" F* K* e- p" k
脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于MF4.2(RTM QFE2)以上版本!
$ q: I/ h" B/ L/ D.Net Micro Framework移植编译脚本0 i+ ^9 y9 ]' k0 u* R4 t) \
, x. ^  @5 O! n3 r
三、编译8 n& x8 c! i/ q" U
没错,到了这里,可以编译了!双击
STM32Stamp里面的Release_Flash.bat,编译就开始了!
1 G8 H4 K% [8 g/ m( e输出目录是E:\MF\PK\BuildOutput1 m9 K+ ~3 J% o7 f' I( P
第一次编译,需要非常非常久,传统SATA超过半个小时,SSD也得二十多分钟。' ]+ H/ s3 ?5 Z' u
后面编译就快了,SATA需要5到10分钟,SSD需要两三分钟' ^( B. _, d) e* X& R
然后,第一次编译,基本上会有错误,这个不用管它,再来一次,多编译几次,直到没有错误或者错误个数恒定下来为止!4 }; D6 b' c& y" ~8 p$ i" B4 l: }
在这一步,可能会产生各种各样的问题,只要我们找到问题所在,就可以使用相应的招数来对付!
& \! @. D  p" w# B/ l5 I  [编译脚本详解请看:" l5 t% N/ }8 u+ @
.Net Micro Framework移植编译脚本7 q/ U& w2 k6 O

+ h4 w- k- O, j( B/ q1 ]0 K- D. X
为了尽可能的保持跟大家一样,我通过SVN把代码更新到刚安装PK的时候,2012年5月1日!2 W6 d( ?3 n" u' q
还删除了输出目录BuildOutput!
+ H, b2 H4 C5 I$ c3 O+ A  ^- S我很幸运,编译一次性成功
,这标志着MF移植的第一步已经完成!
3 e% z+ G% a* G4 Z7 K* y

. |* `+ j. \' J2 j6 M) T
在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件!: K5 B% q6 b, ^$ I
赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看
《开发板通用刷机教程》
6 x- h9 j3 d4 }2 x% }0 B6 U" |* u3 |接上串口,上电,开机,串口软件显示出来MF的启动信息:

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