以28335为例,主频150Mhz,在RAM中运行时频率还是150MHz,而放在flash中,频率会降到90-95MHz。所以对实时性要求高的函数一般放在RAM中运行。
(一)#pragma DATA_SECTION,只需要两步:
1,#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名"); //#pragma是为了防止被编译器优化
举例:
#pragma DATA_SECTION ( symbol , " ramdata ");
在C语言中,这条代码的含义就是为symbol变量申请数据空间。将symbol变量的数据存储在ramdata 对应的地址。
2,
MEMORY
{
PAGE 0 : /* Program Memory */
......
PAGE 1 : /* Data Memory */
......
RAML_XXXCMD : origin = 0x00BFF0, length = 0x000004
}
......
SECTIONS
{
......
ramdata : > RAML_XXXCMD, PAGE = 1
......
}
(二)#pragma CODE_SECTION 需要三步:
1,
#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名");
举例:
#pragma CODE_SECTION (function, "section name ")
在C语言中,这条代码的含义就是为function函数申请程序空间。将symbol变量的数据存储在section name对应的地址。
当程序遇到function,就调到section name里面去执行。
上面两个函数一般出现在C文件的开头。与宏定义放在一起。
2,
上面虽然指定了section name段,但是没有分配空间,此时需要修改CMD文件如下:
SECTIONS
{
/* Allocate program areas: */
......
section name : LOAD = FLASHD,
RUN = RAML0_1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
}
上面代码中,
LOAD = FLASHD, //指定了要加载程序在Flash里的地址段
RUN = RAML0_1, //指定了在RAM里运行程序的RAM地址段
LOAD_START(_RamfuncsLoadStart), // 所要加载程序在Flash里的初始地址
LOAD_END(_RamfuncsLoadEnd), // 所要加载程序在Flash里的结束地址
RUN_START(_RamfuncsRunStart), // 程序运行的起始地址
3,
使用memcpy()函数把程序从FLASH搬移到RAM中去。
memCopy((uint16_t *)&RamfuncsLoadStart,(uint16_t *)&RamfuncsLoadEnd,(uint16_t *)&RamfuncsRunStart);
本文参考了如下链接:https://blog.csdn.net/Ronnie_Hu/article/details/74075090