关于LOAD

来源:百度文库 编辑:神马文学网 时间:2024/03/28 18:23:12
关于LOAD_START, LOAD_END, RUN_START
(2009-11-16 16:59:06)转载
标签:杂谈
首先, Flash28_API 和 ramfuncs 是两个段名,{...}大括号中表示这个段的内容,如果为空则表示全部内容。
其次,LOAD和RUN是段的两个属性,分别规定段将装载在存储器内何处以及在存储器内何处运行。
再次,LOAD_START, LOAD_END, RUN_START 这几个并非是参数,而是能够生成指全局符号的指令,生成的全局符号(你这里是:Flash28_API_LoadStart, Flash28_API_LoadEnd 和Flash28_API_RunStart)决定了装载地址、运行地址、段长度
最后,要了解以上的工作只是在cmd中定义了段的属性,意思是说,Flash28_API 这个段将装载入FLASHA,而需要在RAM中运行。因此要把FLAHA中的地址复制到RAM区中去,那么你需要再做一步工作:在main中的初始化代码段中,调用支持库里面的函数memcpy()将上面定义的段从FLAHA中的地址复制到RAM区。
memcpy(&Flash28_API_RunStart, &Flash28_API_LoadStart,
&Flash28_API_LoadEnd-&Flash28_API_LoadStart)
这样才算完整。
补充:为什么需要将一些段从FLASH中复制到RAM中运行
1,初始化中断向量。由于上电时,外设扩展中断(PIE)的中断向量必须位于非易失性存储器(如Flash)中,因此初始化时必须要把中断向量从FLASH中拷贝到PIEVECT RAM中,完成中断向量表的初始化。
2,初始化Flash控制寄存器。Flash控制寄存器FOPT、FPWR、:FSTDBY-WAIT、FACTIVEWAIT、FBANKWAIT、FOTPWAIT的初始化代码不能从Flash存储器当中运行.否则就会有不可预料的结果出现。所以,Flash控制寄存器的初始化函数在运行时必须从Flash(它的装载地址)拷贝到RAM(它的运行地址)。同时要注意的是,Flash控制寄存器由Code Security Module(CSM)保护。如果CSM被保护起来了,那么必须从被保护的RAM(例如:L0或者L1 SARAM)运行Flash控制寄存器的初始化代码,否则Flash控制寄存器的初始化代码无法访问Flash控制寄存器。
3,性能最优化。由于分立式嵌入式系统要求所有的初始化数据最初都是位于非易失性存储器中(如FLASH),访问片上RAM中的常数与常数表必须花费多个时钟去访问FLASH,为提高效率,必须为想访问的RAM中的常数建立独立的装载和运行地址。在运行时把这些常数从片上Flash中拷贝到RAM中。