关键点:
代码段的含义是将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")
第二步
编写InitFlash()代码 ,用于初始化FLASH 状态寄存器 在DSP2833X_SYSCTRl.c中
定义初始化段ramfuncs , 并通过SECTION伪指令规定段将装载在存储器的何处以及在存储器内何处运行
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中 声明
在主函数中 调用 memcopy()函数 实现initFlash 到RAM的复制
问题2:
经常见到有些存在Flash 中的代码调入RAM运行的情况,而这些代码也并非是TI要求必须调入RAM中运行的,为何要这么做? 操作的步骤是什么
答:为了保证掉电不丢失。用户代码会存储在FLASH或者EEPROM空间,但是访问FLASH需要等待时间,大多数应用场合并无不妥,但是在系统控制环路的设计中往往需要较高的实时性。因此会极大地限制系统的控制精度。例如电力电子控制环路。
内部RAM存储器具有零等待状态,但他掉电会都是数据,如果能够将两者有机的结合在一起,从而可以解决这两者的矛盾。
一般而言,不会将所有函数都调入RAM中运行,。 也就是说不会为整个.text 段指定独立的装载和运行地址。为了节省RAM空间,在运行时,有选择的将那些参与控制器环路调节的函数调入RAM中。
例如:SVPWM 发波函数GenerateSVM()从FLASH调入RAM运行。可以按照如下步骤操作:
- 使用伪指令CODE_SECTION 将GenerateSVM()放置在名为.ramFast 的自定义段中
#pragma CODE_SECTION (GenerateSVM ,"ramFast")
Void GenerateSVM()
{
……………………………….//SVPWM 程序代码
}
- 使用伪指令SECTION 连接ramFast段。并将其从FLASH装载到RAM中运行 生成全局符号来实现存储器复制。
SECTION
{
ramFast :LOAD =FLASHBCDEFGH,
RUN=RAML1,
LOAD_START(_ramFastLoadStart),
LOAD_END (_ramFastLoadEnd),
RUN_START(_ramFastRunStart),
PAGE=0
}
- 在C文件中声明运行地址并调用Memcopy()
Extern unsigned int ramFastLoadStart
Extern unsigned int ramFastLoadEnd
Extern unsigned int ramFastRunStart
Memcopy (&ramFastLoadStart , & ramFastLoadEnd, & ramFastRunStart)