在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),大家有兴趣也可以去看看。

 

 

posted @ 2010-09-27 14:41  我的一天  阅读(202)  评论(0编辑  收藏  举报