DSP2812的FLASH虽然很大,但是程序在这个FLASH区域运行的速度与在RAM中运行速度相比要慢很多,为此通常的做法是将需要快速运行的程序copy到ram中运行,通常将中断子程序以及中断中调用的其他子程序copy到RAM中运行,对于一些不需要太快速度处理的程序可以不管,让其在FLASH中运行。

   将FLASH中程序copy到RAM中的运行的RAM需要连续地址区域,而最大的连续区域仅8k,对于一些大软件来说就不够用了;扩充可用RAM区间分两个阶段,通常例程中cmd文件中的分配并未将单个8k都用起来,所以第一个阶段是将可用最大的8k RAM连起来作为一个连续区间,如下:

RAML0 : origin = 0x008000, length = 0x002000 /* on-chip RAM block L0 */

同时将与其相邻的另外段RAML01屏蔽,如下:

// RAML1 : origin = 0x00A000, length = 0x000000 /* on-chip RAM block L1 */

   通过以上修改可以将RAML0调整到最大的8k,这样对应着可copy子程序的ramfuncs就是8k:

ramfuncs : LOAD = FLASHD,
      RUN = RAML0,
      LOAD_START(_RamfuncsLoadStart),
      LOAD_END(_RamfuncsLoadEnd),
      RUN_START(_RamfuncsRunStart),
      PAGE = 0

   第二阶段,是将RAMH0的8k也作为可拷贝程序的区间,有一些采用了将.test拆分的方法(http://blog.sina.com.cn/s/blog_c82fc4020102wdms.html),个人觉得太麻烦,实际上可以再定义一个ramfuncs2,采用和 ramfuncs同样的定义方式,将RUN = RAML0改为RUN = RAMH0岂不是更简单?

ramfuncs :  LOAD = FLASHD,
      RUN = RAML0,
      LOAD_START(_RamfuncsLoadStart),
      LOAD_END(_RamfuncsLoadEnd),
      RUN_START(_RamfuncsRunStart),
      PAGE = 0
ramfuncs2 : LOAD = FLASHB, /* 与RAMH0同属PAGE1区 */
      RUN = RAMH0,
      LOAD_START(_RamfuncsLoadStart2),
      LOAD_END(_RamfuncsLoadEnd2),
      RUN_START(_RamfuncsRunStart2),
      PAGE = 1

   改成上面的代码后会首先报错,找不到RamfuncsLoadStart2、_RamfuncsLoadEnd2和_RamfuncsRunStart2,仍采用复制

的方法,首先找到_RamfuncsLoadStart定义的位置(DSP281x_GlobalPrototypes.h),改后如下:

extern Uint16 RamfuncsLoadStart;
    extern Uint16 RamfuncsLoadEnd;
    extern Uint16 RamfuncsRunStart;

//以下为新增加
    extern Uint16 RamfuncsLoadStart2;
    extern Uint16 RamfuncsLoadEnd2;
    extern Uint16 RamfuncsRunStart2;

定义好之后,就是在主程序中将程序从FLASH中copy到RAM的部分再复制一次,如:

InitSysCtrl();

          MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);//将定义在ramfuncs段中的数据从FLASH拷贝到RAM中

MemCopy(&RamfuncsLoadStart2, &RamfuncsLoadEnd2, &RamfuncsRunStart2);//将定义在ramfuncs2段中的数据从FLASH 拷贝到RAM中(新增加)

InitFlash();

   经过以上更改后,就可以将子程序放到ramfuncs2中了,如下:

#pragma CODE_SECTION(delay, “ramfuncs”);
    #pragma CODE_SECTION(delay3, “ramfuncs”);
    #pragma CODE_SECTION(SQRT_FPGA, “ramfuncs”);

#pragma CODE_SECTION(CTR_PRAM_CAL, “ramfuncs2”); //ramfuncs2为新增加数据段
    #pragma CODE_SECTION(CTR_PRAM_CAL3, “ramfuncs2”);
    #pragma CODE_SECTION(CTR_PRAM_CAL4, “ramfuncs2”);

经过以上的两个步骤,可以充分利用DSP2812中总共18k RAM中的16k,剩下的2k可用于存储全局变量或者局部变量,完整的
cmd文件如下(可直接复制替换):

MEMORY
{
PAGE 0: /* Program Memory /
/
Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

ZONE0 : origin = 0x002000, length = 0x002000 /* XINTF zone 0 /
ZONE1 : origin = 0x004000, length = 0x002000 /
XINTF zone 1 /
RAML0 : origin = 0x008000, length = 0x002000 /
on-chip RAM block L0 / //0x001000
ZONE2 : origin = 0x080000, length = 0x080000 /
XINTF zone 2 /
ZONE6 : origin = 0x100000, length = 0x080000 /
XINTF zone 6 /
OTP : origin = 0x3D7800, length = 0x000800 /
on-chip OTP /
FLASHJ : origin = 0x3D8000, length = 0x002000 /
on-chip FLASH /
FLASHI : origin = 0x3DA000, length = 0x002000 /
on-chip FLASH /
FLASHH : origin = 0x3DC000, length = 0x004000 /
on-chip FLASH /
FLASHG : origin = 0x3E0000, length = 0x004000 /
on-chip FLASH /
FLASHF : origin = 0x3E4000, length = 0x004000 /
on-chip FLASH /
FLASHE : origin = 0x3E8000, length = 0x004000 /
on-chip FLASH /
FLASHD : origin = 0x3EC000, length = 0x004000 /
on-chip FLASH /
FLASHC : origin = 0x3F0000, length = 0x004000 /
on-chip FLASH /
FLASHA : origin = 0x3F6000, length = 0x001F80 /
on-chip FLASH /
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /
Part of FLASHA. Program with all 0x0000 when CSM is in use.
/
BEGIN : origin = 0x3F7FF6, length = 0x000002 /
Part of FLASHA. Used for “boot to Flash” bootloader mode. /
CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /
Part of FLASHA. CSM password locations in FLASHA */

/* ZONE7 : origin = 0x3FC000, length = 0x003FC0 /* XINTF zone 7 available if MP/MCn=1 /
ROM : origin = 0x3FF000, length = 0x000FC0 /
Boot ROM available if MP/MCn=0 /
RESET : origin = 0x3FFFC0, length = 0x000002 /
part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) /
VECTORS : origin = 0x3FFFC2, length = 0x00003E /
part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */

PAGE 1 : /* Data Memory /
/
Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation /
/
Registers remain on PAGE1 */

RAMM0 : origin = 0x000000, length = 0x000400 /* on-chip RAM block M0 /
RAMM1 : origin = 0x000400, length = 0x000400 /
on-chip RAM block M1 /
// RAML1 : origin = 0x00A000, length = 0x000000 /
on-chip RAM block L1 /
FLASHB : origin = 0x3F4000, length = 0x002000 /
on-chip FLASH /
RAMH0 : origin = 0x3F8000, length = 0x002000 /
on-chip RAM block H0 */
}

/* Allocate sections to memory blocks.
Note:
codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
execution when booting to flash
ramfuncs user defined section to store functions that will be copied from Flash into RAM
*/

SECTIONS
{

/* Allocate program areas: */
.cinit : > FLASHC PAGE = 0//FLASHA
.pinit : > FLASHC, PAGE = 0//FLASHA
.text : > FLASHC PAGE = 0//FLASHA
codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
ramfuncs2 : LOAD = FLASHB,
RUN = RAMH0,
LOAD_START(_RamfuncsLoadStart2),
LOAD_END(_RamfuncsLoadEnd2),
RUN_START(_RamfuncsRunStart2),
PAGE = 1

csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0

/* Allocate uninitalized data sections: */
.stack : > RAMM0 PAGE = 1
.ebss : > RAMM1 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

/* Initalized sections go in Flash /
/
For SDFlash to program these, they must be allocated to page 0 */
.econst : > FLASHC PAGE = 0 //FLASHA
.switch : > FLASHC PAGE = 0 //FLASHA

/* Allocate IQ math areas: /
IQmath : > FLASHA PAGE = 0 //FLASHC /
Math Code /
IQmathTables : > ROM PAGE = 0, TYPE = NOLOAD /
Math Tables In ROM */

/* .reset is a standard section used by the compiler. It contains the /
/
the address of the start of _c_int00 for C Code. /*
/* When using the boot ROM this section and the CPU vector /
/
table is not needed. Thus the default type is set here to /
/
DSECT */
.reset : > RESET, PAGE = 0, TYPE = DSECT
vectors : > VECTORS PAGE = 0, TYPE = DSECT

}

    经过以上改动后,新扩展的RAM区实测可用!一些理解:LOAD_START(_RamfuncsLoadStart)表示告诉编译器将这一段编译之后产生的起始地址存入RamfuncsLoadStart变量中,其他的变量也类似,这样在主程序运行时的MemCopy()才会找到相应的数值,也就是说LOAD_START(_RamfuncsLoadStart)这句是赋值功能。

文章转载自:https://www.cnblogs.com/liwei-chengdu/p/9407358.html

DSP2812 RAM不够用的解决方法【转载】相关推荐

  1. DSP2812 RAM不够用的解决方法

    DSP2812的FLASH虽然很大,但是程序在这个FLASH区域运行的速度与在RAM中运行速度相比要慢很多,为此通常的做法是将需要快速运行的程序copy到ram中运行,通常将中断子程序以及中断中调用的 ...

  2. Oracle 存储过程 无法编译 解决方法(转载)

    声明:本文为转载,如果有侵犯知识版本,请通知本人,本人将即刻停止侵权行为: http://blog.csdn.net/tianlesoftware/article/details/7412555 Or ...

  3. 硬盘盘符双击无法打开,只能右键打开(解决方法)(转载)

    开始---运行---cmd,例如D盘,就输入 D: dir /a (没有参数A是看不到的,A是显示所有的意思) 此时你会发现一个autorun.inf文件 attrib autorun.inf -s ...

  4. Firefox火狐Flash插件卡死问题完美解决方法(转载)

    http://www.ihacksoft.com/firefox-flash-protectedmode.html 其实这个问题以前就出现过,而最近该问题又出现在最新的 Windows 8.1 系统中 ...

  5. Weblogic常见报错以及解决方法[转载]

    最近组织内部进行安全升级,由于目前所接触的项目均使用weblogic中间件部署,出现了一系列问题小问题,再此转载一下常见的错误处理方式以便后续查询.转载 追风若水:https://my.oschina ...

  6. 引用账户当前已锁定,且可能无法登录”--问题的解决方法(转载)

    indows 7下面,登录到另外一个AD域里面更改网络密码时遇到了错误,"引用账户当前已锁定,且可能无法登录",如下图,经反复摸索,最后找到解决方法. 点击"开始&quo ...

  7. quartus2管教锁定出不来_Quartus II 中常见Warning 原因及解决方法(转载)

    1.Found clock-sensitive change during active clock edge at time on register "" 原因:vector s ...

  8. Zabbix discoverer processes more than 75% busy原因及解决方法(转载)

    Zabbix discoverer processes more than 75% busy原因及处理. 一.现象 配置了discovery任务后,zabbix dashboard 告警如下: Zab ...

  9. Ubuntu数字小键盘不能用解决方法(转载)

    问题:Ubuntu小键盘区,num lock有反应.enter有反应,其他的,按数字小键盘键,不能输入数字,而是操作鼠标的方向,像是游戏里八维的方向键. 不记得从什么时候才变成这样的,怎么改过来? 解 ...

  10. 在ClassWizard无法显示添加的类解决方法(转载)

    自上一年在做课程设计时,我就老遇到一个问题:在为Dialog建立一个类时,总是会出现 Unable to open "...(类的Head文件)"和"...(类的Impl ...

最新文章

  1. C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)
  2. 第四课.KNN电影推荐
  3. 《大数据的“道”“术”“释”》----读书摘录+思考
  4. Go语言介绍 安装 基础命令(一)
  5. python 为何要学16进制,从十六进制Python中的补
  6. C# Hook原理及EasyHook简易教程
  7. springboot 后台模板_spring boot实战
  8. HTTP/1.1与HTTP/1.0的区别
  9. Linux操作系统使用基础02:Linux系统安装与登陆
  10. cdoj 1092 韩爷的梦
  11. solr集群solrCloud的搭建
  12. 高级装饰器---验证用户登录
  13. python应聘要求_python爬取招聘要求等信息实例
  14. 分享一份软件测试项目实战(web+app+h5+小程序)
  15. 自动定量包装机机械及控制系统设计(PLC控制)
  16. 游戏打的菜?当然是延迟的锅啦~
  17. 看《Sicko》,有感
  18. quantenna测试RF射频性能简单说明
  19. centos7 磁盘分区
  20. 2022-2028年中国医药行业市场全面研究及前瞻分析报告

热门文章

  1. 华为U2000网管研究实录 (4) - 运行分析(系统监控客户端)
  2. 谷歌自动启动flash
  3. 2002年考研数学一解析pdf
  4. 如何高效率学习PMP?
  5. 全志h3通用固件_全志h3芯片安卓版固件
  6. 中英文 织梦 html5,织梦dedecms如何做中英文多语言站点
  7. 联发科MT7621 Openwrt开发编译记录
  8. 2022低压电工判断题及在线模拟考试
  9. c语言符号字符集包括,c语言基本符号
  10. 期货市场对农业的影响