.Net Micro Framework移植基础(包编译通过)
为什么80%的码农都做不了架构师?>>>
借斯巴达之际,今天在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要高
http://pan.baidu.com/share/link?shareid=109154&uk=2432978109
http://www.kuaipan.cn/file/id_2378544298640124.htm
和谐包http://www.kuaipan.cn/file/id_2378544298617835.htm
.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
popdcall msbuild dotnetmf.proj /t:build /p:flavor=%x_flavor%;memory=%x_memory%
:: > build.logecho 编译完成
: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%\ /ydel %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 /ydel %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移植的第一步已经完成!
在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件!
赶紧把它刷入板子测试一下!有JLink的同学用JLink,没有的就用串口,看《开发板通用刷机教程》
接上串口,上电,开机,串口软件显示出来MF的启动信息:
看到这些启动信息,标志着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的各种单片机学习板,可以让你走得更远!
End.
转载于:https://my.oschina.net/nnhy/blog/1591910
.Net Micro Framework移植基础(包编译通过)相关推荐
- 再谈.NET Micro Framework移植
没有想到,距第一次写.NET Micro Framework移植文章<移植初步:环境搭建>已经快两年半了.不过这两年多来的时光也没有虚度,还是做了不少工作的.从代码角度来说,不仅STM32 ...
- 《玩转.NET Micro Framework 移植-基于STM32F10x处理器》--微软中国.NET Micro Framework项目组工程师所作之序...
序 2006年才偶然知道.NET Micro Framework,那是无意间翻阅一本当年的<程序员>杂志,发现有一篇马宁所写的. ...
- 【.Net Micro Framework PortingKit – 14】TinyCLR编译与测试
在前面的系列文章中我们不厌其烦地一一介绍了在NativeSample中如何开发和调试驱动.从今天开始,我们将介绍TinyCLR项目的相关知识,也许读者以为这又得需要洋洋洒洒十几篇才能介绍的完,其实不然 ...
- .NET Micro Framework开发板用户简明手册(v3.0)
说明:前段时间已经先后发布了<.Net Micro Framework开发板用户简明手册>和< .NET Micro Framework开发板用户简明手册(v2.0)>,分别对 ...
- 【 Net Micro Framework PortingKit – 10】世界首款Cortex-M3内核MFV4诞生
目前在Cortex-M3平台上最常见的嵌入式操作系统就是UCOSII了,除此之外可支持的主流嵌入式操作系统就难以见到了,这是因为Cortex-M3主频较低(常见72M),不支持MMU,片内Flash和 ...
- .Net Micro Framework导航总贴(新手必看)
一.什么是.Net Micro Framework 它是一个.Net框架(微型框架),也是一个嵌入式系统OS,可以裸奔在ARM单片机上,也可以运行在别的嵌入式系统上.我们可以用VisualStudio ...
- 在Corex-M3开发板上移植.Net Micro Framework系列文章
.NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio® 的高生产率结合起来,以针对价格较低.资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Vis ...
- Nginx实战基础篇一 源码包编译安装部署web服务器
Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...
- Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛
Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览. ...
- JAVA面向对象:相关基础知识(带包编译--权限修饰符--内部类)
目录 1.带包编译 2.权限修饰符 3.内部类 1.带包编译 解决使用notepad++ 等文本编辑器编写的java类中如果需要 package 的解决方案: 手动式:手动建包,.java文件放在包外 ...
最新文章
- 格式化verilog/systemverilog代码插件
- 基于GNN,强于GNN:胶囊图神经网络的PyTorch实现 | ICLR 2019
- 5GS 协议栈 — PFCP 协议 — PDR 报文检测规则
- 详解@Builder用法
- 学习笔记——Numpy基本操作(一)
- Typora里字体如何变红
- 用 Flutter 开发真的NX
- C语言之数组探究(一):定义、大小、初始化、访问和三要素
- Mac下常用按键符号⌘(command)、⌥(option)、⇧(shift)、⇪(caps lock)、⌃(control)、↩(return)、⌅(enter)
- 两万字详解MongoDB从入门到精通
- mysql的哈希函数_mysql – 密码哈希函数抛出错误1146
- 中文域名正确注册、配置、使用
- 网元的概念 --- 分布式1
- 2021-08-05 得帆技术培训Linux作业
- codewars day1
- 【图像处理】条形码与二维码的定位与识别
- 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
- mysql声明存储过程_MySQL 声明变量及存储过程分析
- 重磅!继“智能+”120页PPT,阿里+毕马威发布4份智能经济报告(附免费下载)
- 微信小程序--地理位置获取、导航
热门文章
- linux寻找依赖文件
- 求一个序列中,第k个数
- 今天拿到一个TFS Workgroup Edition,想从B3R升级,结果开始了一天的艰难之路。。...
- Java的表达式和运算符
- LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
- Java使用笔记之stream和sorted使用
- 控制台js常用解决方案,字符串替换和抓取列表页链接
- spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版
- BZOJ2768: [JLOI2010]冠军调查
- Django自身安全机制-XSS和CSRF