由于TinyCLR的相关代码与硬件无关,我们所做的就是根据实际需要,添加不同的Feature,此外就是合理配置 堆栈和代码存储位置。其主要工作,具体地来说就是搞定\Solutions\STM3210E\TinyCLR目录下的TinyCLR.proj和 scatterfile_tinyclr_mdk.xml文件。
TinyCLR.proj文件和NativeSample.proj的内容类似,不过额外要添加一些由托管代码(C#)写好的库,比较重 要的就是mscorlib.pe,它是TinyCLR的核心文件,大小大概29k。这里也许读者会奇怪,它的扩展名为什么是pe而 不是windows系统上的dll,其实.Net Micro Framework的托管代码编译和桌面版的没有什么不同,用的都是VS2008 环境中的Csc.exe,我们的MF程序所引用的Program Files\Microsoft .NET Micro Framework\v4.0\Assemblies目 录下的库(扩展名为dll的文件),其实就是由Csc.exe编译而成的,它和.Net Framework没有任何本质区别,可直 接在彼此的工程中互为引用。换句话说dll文件是给我们在PC上编译.Net Micro Framework时用的,而pe文件才是 真正下载到硬件平台给我们的嵌入式系统用的文件。
那pe文件和dll文件又是什么关系呢?其实pe文件是Program Files\Microsoft .NET Micro Framework\v4.0 \Tools \MetaDataProcessor.exe对dll再编译(更确切的说是删减和处理)后的文件,其大小大概为原dll文件的 一半,如mscorlib.dll文件为85.8k,而mscorlib.pe文件为29k。我们的TinyCLR就是这些pe文件的执行引擎(更详 尽的内容我将在以后准备写的【玩转.Net MF】系列文章中介绍pe文件的相关知识)。
我们说过,由于EM-STM3210E开发板的RAM太小,所以我们一开始就得要调试Flash版本的TinyCLR,由于TinyCLR 在创建程序集实例时,定义了一个与程序集同样大小的数组,所以我们的栈至少要大于我们我所要加载的最大的pe 文件,比如至少要大于29k。堆是给托管代码的对象用的,可以根据实际需要定义大小,针对EM-STM3210E开发板 scatterfile_tinyclr_mdk.xml的最终配置如下:
<If Name="TARGETLOCATION" In="FLASH">
<!-- 120k -->
<Set Name="Heap_Begin" Value="0x68000000"/>
<Set Name="Heap_End" Value="0x6801DFFC"/>
<!-- 8k -->
<Set Name="Custom_Heap_Begin" Value="0x6801E000"/>
<Set Name="Custom_Heap_End" Value="0x6801FFFC"/>
<!-- 32k -->
<Set Name="Stack_Bottom" Value="0x20008000"/>
<Set Name="Stack_Top" Value="0x2000FFFC"/>
<Set Name="Code_BaseAddress" Value="0x08000000"/>
<Set Name="Code_Size" Value="0x00080000"/>
<Set Name="Config_BaseAddress" Value="0x00000000"/>
<Set Name="Config_Size" Value="0x00020000"/>
<Set Name="Deploy_BaseAddress" Value="0x00020000"/>
<Set Name="Valid" Value="true"/>
</If>
其中Config是放在NandFlash上的。