接上一篇内容,为加快程序执行运行,调用MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart)函数将执行代码从FLASH移到RAM运行,现对RAM进行初步分配,后期程序越大,视情况进行调整。
一、内存分配
创建工程默认采用TI提供的28069.cmd文件,存储空间分为2部分:PAGE 0(程序存储)和FAGE 1(数据存储)
修改后
- 考虑后期需要在RAM运行的程序会比较大,因此将PAGE 1中的ARML2 - ARML4的内存全部移到ARML0,用于存储和运行FLASH转移过来的代码 ;
- FLASH仅分为2部分,FLASHH专门用来存储需要转换至RAM运行的程序,在编程时需要调用#pragma CODE_SECTION(Function name, "ramfuncs")函数;
- ARMM1重新进行定义,分配空间不变,用来存储系统的参数,编程时需要调用#pragma DATA_SECTION(para name,"Servo_Para");
SECTIONS部分修改如下
- ramfuncs 用于在FLASHH中开辟空间,存放需要复制到RAML0中运行代码;
- Servo_Para用来存储系统参数
说明
ramfuncs : LOAD = FLASHH, RUN = RAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), LOAD_SIZE(_RamfuncsLoadSize), PAGE = 0
ramfuncs : LOAD = FLASHH,//把ramfuncs段(编程决定)装载到FLASHH
RUN = RAML0,//ramfuncs段将在RAML0中运行
LOAD_START(_RamfuncsLoadStart),//定义_RamfuncsLoadStart变量
LOAD_END(_RamfuncsLoadEnd),//定义_RamfuncsLoadEnd变量
RUN_START(_RamfuncsRunStart),//定义_RamfuncsRunStart变量
LOAD_SIZE(_RamfuncsLoadSize),
PAGE = 0程序中调用MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart)即可完成从FLASHH复制到ARML0
二、变量区初始化(清零)
由上可知,内存块RAM_PARA和RAML5用于存储全局变量、静态变量,赋值之前将之清零,清零程序如下
void DataClear(int StarAddr,int DataLen)
{
int16 i,*Addr;
Addr = (int*)StarAddr;
for (i = 0; i < DataLen; i++)
{
*Addr = 0x0;
Addr ++;
}
}
本次根本CMD文件需要清零RAM_PARA和RAML5块,可宏定义如下,