|
(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空间。- MEMORY
- {
- PAGE 0: /* PROGRAM MEMORY */
- PAGE 1: /* DATA MEMORY */
- PAGE 2: /* I/O MEMORY */
- }
复制代码 首先来说程序空间。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文件里面是怎么写的:- PAGE 0: /* PROGRAM MEMORY */
- VECS: origin=0080h, length=0080h
- 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,以便最大程度地利用片内的资源。- PAGE 1: /* DATA MEMORY */
-
- 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文件的内容- -stack 200
-
- MEMORY
- {
- PAGE 0: /* PROGRAM MEMORY */
- VECS: origin=0080h, length=0080h
- PROG: origin = 0100h, length = 0f00h
- PAGE 1: /* DATA MEMORY */
-
- DRAM_1 :ORIGIN=1000H , LENGTH=3000H
- DMA_DATA :ORIGIN=5000h , LENGTH=600h
-
- PAGE 2: /* I/O MEMORY */
- IO_EX :ORIGIN=0000h , LENGTH=0FFF0h /* External I/O mapped peripherals */
- IO_IN :ORIGIN=0FFF0h, LENGTH=0Fh /* On–chip I/O mapped peripherals */
- }
- SECTIONS
- {
- /*.reset :{} > VECS PAGE 0*/
- .vectors :{} > VECS PAGE 0
- .text :{} > PROG PAGE 0
- .cinit : {} >PROG PAGE 0
- .data :{} > DRAM_1 PAGE 1
- .stack :{} >DRAM_1 PAGE 1 /*系统堆栈,for C language */
- .bss :{} > DRAM_1 PAGE 1
- .const :{} > DRAM_1 PAGE 1
- .output :{} > DRAM_1 PAGE 1,align(2048)
- coffbuf :{} > DRAM_1 PAGE 1
- }
-
复制代码 附件2:参考书籍
附件3:如何编码存储器配置文件
附件2:如何编写存储器配置文件 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|