搜索
bottom↓
回复: 5

一步一步学TMS320C5410系列之-(2)存储空间配置

[复制链接]

出0入0汤圆

发表于 2012-11-27 16:42:19 | 显示全部楼层 |阅读模式
(2)存储空间配置

潮风工作室 吴宏伟 2012.11.27

  有过51单片机或其它单片机开发经验的人,对存储器都会有一定的了解,但是不会特别去关心(除非是搞工程应用的),因为ROM对应是存放程序代码,程序大了相应选择ROM空间大的即可,RAM对应程序变量,RAM较小则不要声明太多变量,如果不小心程序太大或者变量太多了,也会有编译器(准确来说是链接器)来告诉你RAM或ROM溢出了。
  这种思想搬到DSP来就是不行的,学习DSP第一步就搞懂存储空间是怎么去配置的,因为这里面会有ROM映射到数据空间,或者RAM映射到程序空间的问题,而现在链接器是不知道你具体要怎样去配置,需要你告诉它,这就是CMD文件的作用。
  
  这里首先要区别两个概念:存储器和存储空间。存储器是一种物理空间,是真正可以用来存放数据或者程序的空间,比如你的内存是2G,实际上就是指它可以存放2G字节的数据,但是我们又不能直接去访问这种物理空间,因为它没有地址(在单片机上或者DSP或所有CPU上没有地址的东西是不可能被访问到的),它需要被编址以后才能被访问,即把它放到某个已经编址的空间中去,这就是映射。存储空间正是这种映射空间,它本身是个“虚无”的空间,但是它已经被编址(如64K的空间就是0x0000 - 0xFFFF),这个空间的大小往往比实际上的物理空间大很多,然后你可以把你的物理空间映射到其上面去,如你的RAM是8K,那么你可以把它映射到数据空间的0x0000 - 0x1FFF地址上,或者映射到数据空间的0x2000-0x3FFF上去,访问这个地址上的内容,就是访问你的RAM上的内容,而访问其他地方(未被映射的地址),你访问到的内容都只会是0x0000或者0xFFFF;也就是说,只有那些有物理空间映射到上面去的存储空间,才是我们真正能够去读写的空间。下面是图解说明:

图1 映射示意图
  说了这么多,现在就开始讲下TMS320C5410的存储器配置,上文已经讲过,它片内有16kW (W即字,此时1W=16bit=2Byte,谨记!)的ROM, DARAM为8kW, SARAM为56kW。而5410有192kW的寻址空间,分为64kW的程序空间,用来存放程序代码;64kW的数据空间,用来存放变量等数据,64kW的IO空间,用来访问外部扩展的通用IO口,通常我们会用一片CPLD芯片来扩展DSP的IO口,因为DSP的通用IO口很少。那么我们应该怎么去配置片内的ROM和RAM,让他们映射到正确的空间中去呢?以及怎么编写CMD文件呢?处理器模式状态寄存器(PMST)就是用来配置存储空间的,MP/MC、OVLY和DROM这几位也影响着存储空间的配置。而看看我们CMD文件框架,你也很容易明白,其实PAGE 0、PAGE 1、PAGE 2 就分别对应我们的64kW的程序空间、数据空间和IO空间。
  1. MEMORY
  2. {
  3. PAGE 0: /* PROGRAM MEMORY */
  4. PAGE 1: /* DATA MEMORY */
  5. PAGE 2: /* I/O MEMORY */
  6. }  
复制代码
首先来说程序空间。DSP片内的ROM和单片机片内的ROM有所不同,它的内容是不能够被修改的,虽然说5410内部有16kW的ROM,但是它里面存放的只是一个引导程序和一些数据查找表,我们不能用它来装载我们的代码。通常我们的代码是放在RAM里面去运行的,以保证DSP有足够快的运行速度。MP/MC决定了要不要使能片内的ROM,而OVLY则决定了要不要把RAM映射到程序空间中去,不同的配置,结果如下图:

图2. 程序空间和数据空间配置
  由图我们可以知道,当MP\MC=0时,片内16kW的ROM会被映射到程序空间第0页的C000h-FFFFh地址,MP\MC=1时则不进行映射。而当OVLY=1时,片内8kW的DARAM被映射到第0页的0080h-1FFFh, 注意此时0000h-007Fh是保留区域,片内前24kW的SARAM被映射到第0页的2000h-7FFFh,那么,如果我们要存放程序的话,就可以从0080h开始存放。此时我们就可以来看我们的CMD文件里面是怎么写的:
  1.   PAGE 0: /* PROGRAM MEMORY */
  2.           VECS:        origin=0080h, length=0080h
  3.           PROG:    origin =  0100h, length = 0f00h
复制代码
此时我们可以看到中断向量表被存到了 0080h-00FF区域,而我们的程序代码被放到了0100h开始的区域,这两片区域看起来是程序空间,但实际上却是我们片内RAM存储器,这样,我们的代码就被下载到了RAM进行运行。
可能你已经注意到了,上有提到了“程序空间第0页”,没错,程序空间是分页的,总共有128页,所以总共可以寻址64kW X 128的空间,用XPC寄存器来存储当前页码。不同页的配置如下图,在些不再细讲:

图3. 程序存储器的分页配置

再来看我们的数据空间,注意到我们数据空间0080h-7FFFh也是映射了我们的片内RAM存储器,和程序空间的0080h-7FFFh是一样的,所以0080-0FFF已经被用来存储代码,那现在要存储变量或者堆栈,就只能从1000H开始,这里我们只用了12kW的大小,实际上可用空间为60kW,所以我们的长度可设为E000h,以便最大程度地利用片内的资源。
  1. PAGE 1: /* DATA MEMORY */
  2.        
  3.         DRAM_1 :ORIGIN=1000H , LENGTH=3000H
复制代码
讲了这么多,是时候来验证我们的思路是对不对了,我们打开上次LED_Control的工程,编译之后把程序加载到开发板上去,这里,我们来查看我们各个存储器中的内容,点击CCS开发环境的View菜单->Memory...,在弹出来的对话框里设置地址为0080h,Page为Data,即查看数据空间0080h开始的内容;再次点击View->Memory...,设置地址为0080h,Page为Program,即查看程序空间0080h开始的内容;再打开View->Registers->CPU Registers,查看CPU的各个寄存器,那么,我们就可以看到如下图的结果:

图4. Memory窗口


图5. 状态图

而查看程序空间的0100h开始的内容,就可以看到,我们的C程序所生成的机器码:

图6. 程序代码所对应的机器码
  作为一个DSP程序员,我们应该将十分清晰地知道各个存储空间是怎样配置的,并将它牢记在心中。
附件1,5410.CMD文件的内容

附件1,5410.CMD文件的内容
  1. -stack 200
  2.                      
  3. MEMORY
  4. {
  5. PAGE 0: /* PROGRAM MEMORY */
  6.         VECS:        origin=0080h, length=0080h
  7.         PROG:    origin =  0100h, length = 0f00h
  8. PAGE 1: /* DATA MEMORY */
  9.        
  10.         DRAM_1 :ORIGIN=1000H , LENGTH=3000H
  11.         DMA_DATA :ORIGIN=5000h , LENGTH=600h
  12.          
  13. PAGE 2: /* I/O MEMORY */
  14.         IO_EX :ORIGIN=0000h , LENGTH=0FFF0h /* External I/O mapped peripherals */
  15.         IO_IN :ORIGIN=0FFF0h, LENGTH=0Fh /* On–chip I/O mapped peripherals */
  16. }   

  17. SECTIONS
  18. {
  19.         /*.reset   :{} > VECS PAGE 0*/
  20.         .vectors :{} > VECS PAGE 0   
  21.         .text :{} > PROG PAGE 0
  22.         .cinit : {} >PROG PAGE 0
  23.         .data :{} > DRAM_1 PAGE 1       
  24.         .stack :{} >DRAM_1 PAGE 1        /*系统堆栈,for C language */
  25.         .bss :{} > DRAM_1 PAGE 1
  26.         .const :{} > DRAM_1 PAGE 1
  27.         .output :{} > DRAM_1 PAGE 1,align(2048)
  28.         coffbuf :{} > DRAM_1 PAGE 1
  29. }
  30.                                          
复制代码
附件2:参考书籍





附件3:如何编码存储器配置文件
































附件2:如何编写存储器配置文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2012-11-27 18:28:46 | 显示全部楼层
不错。lz,加油!

出0入0汤圆

发表于 2012-11-29 10:19:43 | 显示全部楼层
跟帖前进~

出0入0汤圆

发表于 2012-12-25 13:27:16 | 显示全部楼层
支持。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2013-4-25 17:27:38 | 显示全部楼层
标记一个,对存储空间的理解确实是学习DSP中必须经历的

出0入0汤圆

发表于 2015-3-6 22:56:33 | 显示全部楼层
哎,人比人气死人,LZ,你这么老的帖子被我翻出来,也不错,在网上找这么久了,没有你这个描述的清楚,让小弟很佩服,正正真真的浅入深出,后面怎么没见你更新了,为什么中断了呀?项目终止了?想学学,C5416如何把程序烧进外挂的FLASH中,希望LZ赐教
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表