.Net Micro Framework移植基础(包编译通过)

借斯巴达之际,今天在QQ群1600838直播MF移植环境的准备工作,大家可随时询问移植相关问题! 如果对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/ ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/ 汇编:Keil MDK 4.54    这是编译为单片机固件用的,以前用4.12,后来升级到4.54,现在不确定4.12/4.50是否还可以。据说4.54成功的几率比4.12要高 .Net Micro Framework Porting Kit 4.2(RTM QFE2) (我们称之为MFPK422) http://netmf.codeplex.com/releases/view/91594 http://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行增加

<CC      Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armcc.exe"</CC><CPP     Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armcc.exe"</CPP><AS      Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armasm.exe"</AS><LINK    Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armlink.exe"</LINK><AR      Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\armar.exe"</AR><FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK'">"$(MDK_TOOL_PATH)\bin40\fromelf.exe"</FROMELF>

脚本这一步,如果没改对,就直接下载现成的吧!两个月前发布的,可能不适用于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移植的第一步已经完成

image.png

在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件! 赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看《开发板通用刷机教程》 接上串口,上电,开机,串口软件显示出来MF的启动信息:

image.png

看到这些启动信息,标志着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文件;

前前后后忙活了一天,修改了三四十次,才最终完成本文!

如果喜欢.Net Micro Framework,对C#玩单片机,对物联网和工农业自动化感兴趣,MF将是一个不错的选择!

MF是微软开源的项目,本系列移植教程将让你具有独立的移植能力,配合市场上40~300RMB的各种单片机学习板,可以让你走得更远!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

通过UDP广播实现Android局域网Peer Discovering

本文将介绍以下知识点: 1、TCP与UDP的区别; 2、单播、多播、广播; 3、Java中实现UDP的重要的类; 4、Peer Discovering方案 01...

5624
来自专栏Golang语言社区

阅读源代码的姿势:以 go-restful 为例

一般初学者确定一个方向,比如web 后端、前端等,会选择一门编程语言深入下去,比如后端java、python、go等。通过项目不断练习编程语言和编程思维,知道如...

1733
来自专栏游戏杂谈

xcode中嵌入framework(接入快用最新SDK遇到的问题)

但xcode设置中并没有找到Embed Frameworks这个选项,使用以下方式添加

1314
来自专栏Android源码框架分析

Android6.0权限适配及兼容库的实现

从6.0 MarshMallow开始,Android支持动态权限管理,即有些权限需要在使用到的时候动态申请,根据用户的选择需要有不同的处理,具体表现可以看下图:

1572
来自专栏Jerry的SAP技术分享

通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩

kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果。

1473
来自专栏安恒网络空间安全讲武堂

赛前福利①最新2018HITB国际赛writeup

FIRST 距离“西湖论剑杯”全国大学生网络空间安全技能大赛只有10天啦! 要拿大奖、赢offer,那必须得来点赛前练习定定心啊~这不,讲武堂就拿到了2018H...

4705
来自专栏高性能服务器开发

+从零实现一款12306刷票软件1.4

这里还有个注意细节,就是通过POST请求发送的数据需要对一些符号做URL Encode,这个我在上一篇文章《从零实现一个http服务器》也详细做了介绍,还不清楚...

2302
来自专栏GopherCoder

『阅读源代码的姿势:以 go-restful 为例』

5813
来自专栏ml

unbuntu系统( PC机 )中安装360wifi步骤

少说废话,每一步都经过验证:   1.  首先查看一下当前使用的linux版本: gxjun@gxjun:~$ uname -r 4.8.0-59-generi...

3513
来自专栏木制robot技术杂谈

Hexo搭建个人博客(三)—— Hexo博客的美化

通过前两节的学习,我们已经搭建好自己的博客,就像盖房子一样要对内部进行装修,也就是对博客进行美化。 ---- 安装Hexo博客主题 Hexo博客可以安装不同的...

1.4K9

扫码关注云+社区

领取腾讯云代金券