DSP

TI CMD文件作用

2019-07-13 12:22发布

1 CMD文件起源

参见玄德的博文CMD文件的原理
在DSP系统中,存在大量的、各式各样的存储器,CMD文件所描述的,就是开发工程师对物理存储器的管理、分配和使用情况。 有必要先复习一下存储器的知识。目前的物理存储器,种类繁多,原理、功能、参数、 速度各不相同,有 PROM、 EPROM、 EEPROM、 FLASH、 NAND FLASH、 NOR FLASH等(ROM 类),还有SRAM、DRAM、SDRAM、DDR、DDR2、FIFO 等(RAM 类)。无论多么复杂,从断电后保存数据的能力来看,只有两类:断电后仍然能够保存数据的叫做非易失性存储器(non-volatile,本文称为ROM 类),数据丢失的叫做易失性存储器(本文称为 RAM 类);ROM 类的芯片都是非易失性的,而 RAM 类都是易失性的。 即使同为 ROM类或同为 RAM 类存储器,仍然存在速度、读写方法、功耗、成本等诸多方面的差别。比如 SRAM 的读写速度,从过去的15ns、12ns,提高到现在的 8ns、10ns,FLASH的读取速度从 120ns、75ns,到现在的 40ns、30ns。有没有人这样想过:使用存储器的人,希望存在这样的区别吗?或者说,理想的存储器,应当是什么样的?
我们使用存储器时,如果没有人为地改变它,就希望里面的数据永远不要变,即使断了电也要完好地保存;如果里面的内容是我不需要的或者不能用的,我自然就会给它写入有用的内容,比如初始化。理想的存储器就应当永远保存数据,无论掉电与否,而且,希望读写速度为每秒无穷多字节,是0ns,而不是什么8ns,10ns。不是吗?然而,人类实现存储器芯片的技术,还没有达到理想情况,所以才会有这么多类别。“非易失”和“速度”就是一对典型的矛盾。非易失的 ROM 类存储器,可以“永远”地保存数据,但读写速度却很低,比如30ns;RAM的速度(8ns)一般都比ROM(30ns)快得多,但却不能掉电保存。这是很无奈的现实。假如有那么一天,ROM类的读写速度和RAM一样快,或者RAM也可以掉电保存数据,就不存在易失和非易失的区别了,那将是革命性的进步。那时,智能芯片和智能系统的设计将会有很大的变化,编写CMD文件就会很简单,甚至不需要了。已经有芯片厂家做了一些这方面的工作,比如把电池和RAM结合起来,就是一个能掉电保存的RAM。它既可以作为传统的ROM使用,又可以当RAM使用。但这显然只是一个暂时、折中的方法,其原理、成本、体积、容量还不如人意,不能算是“革命性”的进步。
我们平时在用到存储器的时候,要考虑哪些因素呢?首先必须确认,在你的使用场合,是要永久保存数据,还是暂时保存?这关系到选择非易失性,还是易失性存储器的大问题,是首要的问题。在某些场合,如果必须永远地保存数据,即使希望速度快一些,也只能选择非易失的ROM类存储器,而把速度问题放在其次,或者另外想办法解决;另外一些场合,却要把速度放在第一位,只要在通电期间能够始终保存数据,就够了,当然就要选择RAM类的存储器了。 这两种情况我们都会遇到:程序代码一般都要存储在ROM类存储器中,否则,从设备生产开始,储存、运输,一直到用户手里,要必备不间断电源,还要保证不发生断电的意外;程序运行的时候,为了提高速度,就必须在RAM中运行,试想如果你的MP放电影一停一顿的,谁还会用它看电影呢?所以ROM和RAM都是必不可少的,各有各的用途,而且,出于功能、参数、速度、读写方法、功耗、工艺、成本等方面的考虑,往往要同时使用不止一种存储器。
事实上,TI在设计DSP芯片时,也遇到同样的问题,TI考虑的情况要比我们更多,更复杂。要知道,设计芯片的人是最牛X的,开发工程师只是跟在人家后面,在人家规定的框框里亦步亦趋。千万不要被这些存储器的名称所迷惑!翻来覆去,其实就是两大类:非易失和易失。初学者往往忽略了这一点。两大类!记住这一点,CMD文件就是以这两类存储器为主轴,然后展开的。

2 CMD作用

DSP芯片的片内存储器,只要没有被TI占用,用户都可以全权支配。TI设计了“CMD文件”这种与用户的接口形式,用户通过编写CMD文件,来管理、分配系统中的所有物理存储器和地址空间。CMD文件其实就是用户的“声明”,包括两方面的内容:
1. 用户声明的整个系统里的存储器资源。无论是DSP芯片自带的,还是用户外扩的,凡是可以使用的、需要用到的存储器和空间,用户都要一一声明出来:有哪些存储器,它们的位置和大小。如果有些资源根本用不到,可以视为不存在,不必列出来,列出来也无所谓。
2. 用户如何分配这些存储器资源,即关于资源分配情况的声明。用户根据自己的需要,结合芯片的要求,把各种数据分配到适当种类、适当特点、适当长度的存储器区域,这是编写CMD文件的重点。用户编写完自己的程序以后,要经过开发环境(编译器)的安排和解释(即编译),转换为芯片可以识别的机器码,最后下载到芯片中运行。CMD文件就是在编译源程序、生成机器码的过程中,发挥作用的,它作为用户的命令或要求,交给开发环境(编译器)去执行:就这么分配。
接下来介绍几种嵌入式开发中经常使用的概念:嵌入式中数据包含两大类:一是指令信息,即对应用户程序,一是数据信息,即常量,变量等。从初始化的角度来看,又可分为初始化数据(指令信息与常量等)与非初始化(变量等)数据。CMD文件包含两大内容,首先就是存储器的资源清单,或者说系统中(电路板上)实际可用的存储器资源。其次,上述这些存储器资源是怎么分配使用的。这两个部分在CMD文件中分别对应关键字“MEMORY”与“SECTION”。下面我们结合一个实例进行分析,下图是C6748芯片CMD实例:
C6748芯片CMD实例
1. 第01行:申明栈大小为0x800;
2. 第02行:申明堆大小为0x800;
3. 第04-10行:声明了系统中可用的存储资源,包括名称,长度与起始地址;
4. 第12-24行:声明了代码经编译器处理后输出的各类“数据段”存放位置;

3 参考资料

这里整理了CMD文件相关的TI官方参考资料:
(一) CMD文法格式:参见《TMS320 C6000 Assembly Language Tools v 7.4 User’s Guide》中“7.5 Linker Command Files”。
(二) SECTION分类与特点:参见《TMS320C6000 Optimizing Compiler v 7.4 User’s Guide》中“7.1.1 Sections”
(三) 数据,代码对齐,定位等一些列操作:参见《TMS320C6000 Optimizing Compiler v 7.4 User’s Guide》中“6.9 Pragma Directives”