[讨论] 【玩转C2000 LaunchPad】在FLASH里运行

dontium   2012-12-20 00:19 楼主

C2000 LaunchPad】在FLASH里运行

 

 

FLASH里运行程序,只是将程序烧写到FLASH中,与在RAM里运行没
有本质的区别。但是在FLASH里运行需要设置等待周期,对于对时间要求严
格的过程,需要拷贝到RAM中运行,以达到最高速度。这样,如果对程序处
理不当,就有可能使在RAM中运行正常的程序烧入FLASH中后就无法正常运
行。关于这方面的内容需要看这两个:《TMS320C28x Optimizing C/C++
 Compiler User's Guide》、《TMS320C28x Assembly Language Tools User's Guide
及其它相关文件。

下面在前几节实例的基础上,向大家介绍如何在FLASH里运行程序。

一、更换CMD文件

1、使用F28027.COM文件。

Project Explorer窗口右击项目名称,在出现的右键菜单里选择Properties
更换CMD文件方法如下:

 

 

也可以在Project Explorer窗口右击F28027.COM文件,在出现的右键菜单里
选择Properties,将这个文件包含在工程中:

 

 

2、去掉28027_RAM_lnk.cmd文件。右击28027_RAM_lnk.cmd在出现的右
键菜单里选择Properties,并将它打上勾:

 

 

3F2802x_Headers_nonBIOS.cmd不管在什么情况下都是要用的。它是定
义内部特殊寄存器用的,如CPU定时器寄存器。这些是固定不变的。

 

二、将需要在RAM中运行的过程拷贝到RAM中。

首先定义哪些过程(函数)需要在RAM里运行,然后使用MemCopy()将
它们搬到RAM中。

1、定义ramfuncs的过程

这里的关键字“ramfuncs”是在CMD文件中定义的:

   ramfuncs            : LOAD = FLASHA,

                         RUN = PRAML0,

                         LOAD_START(_RamfuncsLoadStart),

                         LOAD_END (_RamfuncsLoadEnd),

/*                         LOAD_SIZE(_RamfuncsLoadSize),*/

                         RUN_START(_RamfuncsRunStart),

                         PAGE = 0

由上可见,在烧写时,将定义的ramfuncs部分写在FLASHA里,系统运
行时再拷贝到PRAML0里运行,这里的RamfuncsLoadStart等,是由编
译器生成的。在文件的开头或包含的头文件中需要加上声明:

extern Uint16 RamfuncsLoadStart;

extern Uint16 RamfuncsLoadEnd;

extern Uint16 RamfuncsRunStart;

 

定义ramfuncs的过程是使用#pragma宏指令:

#pragma CODE_SECTION(SCITXINTA_ISR, "ramfuncs");

#pragma CODE_SECTION(SCIRXINTA_ISR, "ramfuncs");

以上两行代表将SCITXINTA_ISR()及SCIRXINTA_ISR()作为ramfuncs
对于其它需要指定ramfuncs的过程,参照此方法。

注意:使用#pragma宏指令要在该过程所在的文件中使用,否则无效。
可以在MAP文件中查看。

以上两行如果不在当前文件中使用,而放在主文件中时,map文件是这样的

ramfuncs   0    003f6112    00000021     RUN ADDR = 00008000

                  003f6112    0000001d     F2802x_SysCtrl.obj (ramfuncs)

                  003f612f    00000004     F2802x_usDelay.obj (ramfuncs)

如果把这两行放在过程所在的文件中时,MAP文件是这样的:

ramfuncs   0  003f6000  00000061     RUN ADDR = 00008000

               003f6000  00000040     F2802x_DefaultIsr.obj(ramfuncs:retain)

               003f6040  0000001d     F2802x_SysCtrl.obj (ramfuncs)

               003f605d  00000004     F2802x_usDelay.obj (ramfuncs)

对于使用汇编语言编制的程序,则使用sect命令,如F2802x_usDelay()过程:

       .def _DSP28x_usDelay

       .sect "ramfuncs"

 

        .global  __DSP28x_usDelay

_DSP28x_usDelay:

        SUB    ACC,#1

        BF     _DSP28x_usDelay,GEQ    ;; Loop if ACC >= 0

        LRETR

此时的sect命令的使用,也是在过程所在的当前文件中。

2、将过程从FLASH拷贝到RAM中。

使用以下方法:

    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

原形如下:

void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)

{

    while(SourceAddr < SourceEndAddr)

    {

       *DestAddr++ = *SourceAddr++;

    }

    return;

}

 

3、初始化FLASH,设置等待时钟数。此函数使用TI提供的,不需要更改。

 

 

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

回复评论 (210)

赶紧学习~
点赞  2012-12-20 09:03
良心的不错
点赞  2012-12-20 13:11
给力. 最近在实习做项目. 谢谢楼主!!
点赞  2012-12-20 15:23

回复 楼主 dontium 的帖子

感謝樓主的技術分享 ^^
点赞  2012-12-20 16:01

谢谢分享

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2012-12-20 18:46
值得学习~
点赞  2012-12-20 22:25

回复 楼主 dontium 的帖子

看看啊
你在睡觉,则你在做梦。你在努力,则你在圆梦。
点赞  2012-12-24 16:45
受教了
点赞  2012-12-27 09:38
非常值得学习,期待下一遍猛文
点赞  2012-12-27 10:33
多谢  从楼主的帖子里学习了不少 谢谢
点赞  2012-12-28 14:31
学习下
点赞  2012-12-30 21:54
看看
点赞  2013-1-3 01:30
很需要这些资料。谢谢!
点赞  2013-1-7 11:23
这个问题困扰我很久了
点赞  2013-1-12 21:02

回复 15楼 ahuzhangbo 的帖子

问题解决了没有?
点赞  2013-1-12 21:35

回复 16楼 dontium 的帖子

还没有,进不了中断,在RAM中是可以的啊
点赞  2013-1-13 10:06

回复 楼主 dontium 的帖子

点赞  2013-1-16 17:13
看看~~~~~~~~~~~~~
点赞  2013-1-31 11:31
支持楼主!!!
点赞  2013-2-3 14:18
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复