将DSP23335中的FLASH代码拷贝到RAM中去运行

关键点:

代码段的含义是将FLASH中的段ramfuncs 必须调入到RAML0 中运行

其装载在Flash中的地址是 RamfuncsLoadStart RamfuncsLoadEnd

在RAML0中的运行地址是 RamfuncsRunStart

 

Memcopy函数的写法

 

Void Memcopy(Uint16 *SourceAddr , Uint16 *SourceEndAddr , Uint16 *DestAddr)

{

While(SourceAddr<SourceEndAddr)

{

*DestAddr ++ =*SourceAddr ++;

}

 

 

}

 

 

问题1 为什么需要将一些段从FLASH中复制到RAM中运行 ?

答:有两种情况必须从FALSH拷贝到RAM中去运行

情况1 FLASH控制器的初始化必须在RAM中执行

情况2 初始化中断向量

(1)FLASH的控制寄存器FOPT FPWR FSTDBY-WAIT FACTIVEWAIT FBANKWAIT

FOTPWAIT 以上6个寄存器的初始化代码不能在FLASH 存储器中运行,否则就会发生不可预料的结果。

FLASH控制寄存器的初始化函数在运行时 必须从FLAsh(其装载地址)复制到RAM(其运行地址)

需要注意的是:FLASH控制寄存器受CSM保护。只能复制到RAM空间的L0~L3 执行初始化。

 

 

如何将代码存入FLASH 如何进行FLASH的初始化 ?

第一步 在DSP2833X_SYSCTRl.c中 通过伪指令将InitFlash函数分配至初始化自定义段

Ramfuncs

#pragma CODE_SECTION ( InitFlash,"ramfuncs")

将DSP23335中的FLASH代码拷贝到RAM中去运行

 

 

第二步

编写InitFlash()代码 ,用于初始化FLASH 状态寄存器 在DSP2833X_SYSCTRl.c中

将DSP23335中的FLASH代码拷贝到RAM中去运行

定义初始化段ramfuncs , 并通过SECTION伪指令规定段将装载在存储器的何处以及在存储器内何处运行

将DSP23335中的FLASH代码拷贝到RAM中去运行

 

LOAD RUN 是段的两个基本属性

LOAD_START LOAD_END RUN_START 这几个并非是参数,而是能够生成全局符号的指令 。

RamfuncsLoadStart RamfuncsLoadEnd RamfuncsRunStart 就是生成的全局符号

 

代码段的含义是将FLASH中的段ramfuncs 必须调入到RAML0 中运行

其装载在Flash中的地址是 RamfuncsLoadStart RamfuncsLoadEnd

在RAML0中的运行地址是 RamfuncsRunStart

 

 

第三步 : 在DC_CONFIG.C 中 定义了memcopy()函数

 

 

第4步 由于RamfuncsLoadStart RamfuncsLoadEnd RamfuncsRunStart 是在CMD文件中定义的,为了能够在C语言中被memcopy()调用 需要声明变量

extern Uint16 RamfuncsLoadStart;

extern Uint16 RamfuncsLoadEnd;

extern Uint16 RamfuncsRunStart;

 

在DSP2833X_Globalprototypes.h中 声明

将DSP23335中的FLASH代码拷贝到RAM中去运行

 

 

在主函数中 调用 memcopy()函数 实现initFlash 到RAM的复制

 

将DSP23335中的FLASH代码拷贝到RAM中去运行

 

 

 

问题2:

经常见到有些存在Flash 中的代码调入RAM运行的情况,而这些代码也并非是TI要求必须调入RAM中运行的,为何要这么做? 操作的步骤是什么

答:为了保证掉电不丢失。用户代码会存储在FLASH或者EEPROM空间,但是访问FLASH需要等待时间,大多数应用场合并无不妥,但是在系统控制环路的设计中往往需要较高的实时性。因此会极大地限制系统的控制精度。例如电力电子控制环路。

内部RAM存储器具有零等待状态,但他掉电会都是数据,如果能够将两者有机的结合在一起,从而可以解决这两者的矛盾。

一般而言,不会将所有函数都调入RAM中运行,。 也就是说不会为整个.text 段指定独立的装载和运行地址。为了节省RAM空间,在运行时,有选择的将那些参与控制器环路调节的函数调入RAM中。

 

例如:SVPWM 发波函数GenerateSVM()从FLASH调入RAM运行。可以按照如下步骤操作:

  1. 使用伪指令CODE_SECTION 将GenerateSVM()放置在名为.ramFast 的自定义段中

     

    #pragma CODE_SECTION (GenerateSVM ,"ramFast")

     

    Void GenerateSVM()

    {

    ……………………………….//SVPWM 程序代码

     

    }

     

     

     

  2. 使用伪指令SECTION 连接ramFast段。并将其从FLASH装载到RAM中运行 生成全局符号来实现存储器复制。

     

    SECTION

    {

    ramFast :LOAD =FLASHBCDEFGH,

    RUN=RAML1,

    LOAD_START(_ramFastLoadStart),

    LOAD_END (_ramFastLoadEnd),

    RUN_START(_ramFastRunStart),

    PAGE=0

    }

     

  3. 在C文件中声明运行地址并调用Memcopy()

     

    Extern unsigned int ramFastLoadStart

    Extern unsigned int ramFastLoadEnd

    Extern unsigned int ramFastRunStart

     

    Memcopy (&ramFastLoadStart , & ramFastLoadEnd, & ramFastRunStart)

     

上一篇:网络入侵检测系统之Suricata(四)--初始化模块代码详解


下一篇:【转】STM32的FSMC详解