在RAM中调试NativeSample
//=====================================================================
//TITLE:
// 在RAM中调试NativeSample
//AUTHOR:
// norains
//DATE:
// Monday 27-September-2010
//Environment:
// KEIL MDK 4.0
// .NET Micro Framework
//=====================================================================
对于.NET Micro Framework来说,其代码的放置方式有两种,分别是RAM和FLASH。而作为.NET Micro Framework的样例程序NativeSample来说,自然也具备这个特性。今天我们就来看看,该如何设置,才能让MDK将NativeSample下载到RAM中并调试吧。
我这里用的是红牛开发板,所使用的CPU是STM32F103ZE,如果各位朋友所用的板子与我不同,应该也可以按照下面的例子进行相应的更改。
因为我这里用的是MDK,所以首先需要更改NativeSample文件夹下的scatterfile_tools_mdk.xml文件。如果你所使用的IDE和我不同,还有scatterfile_tools_gcc.xml和scatterfile_tools_rvds.xml可供修改。因为红牛开发板有外部RAM,为了简便,就把Heap和Stack放到外部RAM,所以设置更改如下:
<Set Name="Heap_Begin" Value="0x68000000"/>
<Set Name="Heap_End" Value="0x6800FFFC"/>
<Set Name="Stack_Bottom" Value="+0"/>
<Set Name="Stack_Top" Value="0x6801FFFC"/>
接下来就是更改代码的安置区域。因为这是放到内存中的,而实际运行也需要内存,故代码段就放到内存最后的区域,故更改如下:
<If Name="TARGETLOCATION" Value="RAM">
<Set Name="Code_BaseAddress" Value="0x20001000"/>
<Set Name="Code_Size" Value="0x0000F000"/>
<Set Name="Valid" Value="true"/>
</If>
当然,上面的设置是将Heap和Statck放到外部RAM的情形,如果要放到内部RAM也是可以的。只不过内部RAM只有64K,不仅要存放代码,还要设置Heap和Statck,运行时还要用去一部分,确实有点捉襟见肘的感觉。如果各位朋友有兴趣,不使用外部RAM,可以将scatterfile_tools_rvds.xml数值更改如下:
<Set Name="Heap_Begin" Value="0x20003BFC"/>
<Set Name="Heap_End" Value="0x20003DFC"/>
<Set Name="Stack_Bottom" Value="+0"/>
<Set Name="Stack_Top" Value="0x20003FFC"/>
<If Name="TARGETLOCATION" Value="RAM">
<Set Name="Code_BaseAddress" Value="0x20004000"/>
<Set Name="Code_Size" Value="0x0000C000"/>
<Set Name="Valid" Value="true"/>
</If>
设置完毕之后,在命令行中进入到NativeSample文件夹,输入如下命令进行编译:
Msbuild /t:build /p:flavor=debug;memory=ram
因为我们使用的是外部RAM,所以在开始调试之前必须先对外部RAM进行初始化。故这时候需要一个脚本文件,我们就将它命名为configure.ini吧!其内容如下:
FUNC void InitSRAM3(void)
{
//使能FSMC时钟
_WDWORD(0x40021014,0x00000114);
//使能FSMC相关的GPIO的时钟
_WDWORD(0x40021018,0x000001E0);
//配置SRAM数据线,NOE和NWE配置
//SRAM地址线配置
//NOE和NWE配置
//NE3配置
//NBL0,NBL1配置
_WDWORD(0x40011400,0x44BB44BB);
_WDWORD(0x40011404,0xBBBBBBBB);
_WDWORD(0x40011800,0xB44444BB);
_WDWORD(0x40011804,0xBBBBBBBB);
_WDWORD(0x40011C00,0x44BBBBBB);
_WDWORD(0x40011C04,0xBBBB4444);
_WDWORD(0x40012000,0x44BBBBBB);
_WDWORD(0x40012004,0x44444B44);
//FSMC配置
//使能 FSMC Bank1_SRAM Bank
_WDWORD(0xA0000010,0x00001000);
_WDWORD(0xA0000014,0x00000200);
_WDWORD(0xA0000114,0x0FFFFFFF);
_WDWORD(0xA0000010,0x00001001);
}
InitSRAM3();
PC = 0x20001000;
从scatterfile_tools_mdk.xml文件可以知道,程序文件是放置到Code_BaseAddress这个地址的,为了在执行时能够指向正确的代码位置,脚本文件还必须要设置PC指针。因为这里的Code_BaseAddress的数值是0x20001000,所以PC才设置为0x20001000这个相同的数值。
编写好脚本文件之后,就应该将它放到MDK中,否则就形同虚设。依次点击Option For target->debug,在Initialize File选择我们编写好的脚本文件,如图:
当这一切都准备好之后,你还是不能点击Download,因为它会提示你地址错误。所以这时候,我们需要来点欺骗手段,将Flash地址更改为RAM的地址。依次点击Option For target->Utilities->Setting,将Start改为0x20001000,Size改为0x0000F000,如图所示:
设置完毕之后,就可以点击Download,然后再点击Debug正常进行调试了!
可能最后,大家对于各个数值的关系还有点晕乎乎的,所以最后就以一副大图,来帮大家理顺这互相间的关系,请看图:
如果各位朋友并不清楚如何建立工程调试NativeSample,可以参考这篇文章:《如何调试NativeSample》(http://blog.csdn.net/norains/archive/2010/09/25/5904617.aspx)。
另外,如果大家觉得这篇文章似曾相识,那也是正常的,因为本文不少地方是抄袭(参考)叶帆的这篇文章:《【.Net Micro Framework PortingKit - 02】STM3210E平台构建》(http://blog.csdn.net/yefanqiu/archive/2010/01/02/5119171.aspx),大家有兴趣也可以去看看。