上段时间帮客户把C6678的cmd文件修改了一下,主要是把MSMC空间全部腾出来,本身是个很小的事情,但是里面也有一些技巧和方法,简单说一下~
cmd文件又叫做连接命令文件(linker command files),以.cmd后缀结尾。该文件是一个声明文件,主要是对DSP内部的存储器资源进行分配,包括内部的L2,MSMC以及外扩的DDR,NOR FLASH等,基本上用到的空间都得声明。大致分两个部分,一个是MEMORY列出所有的存储器资源,什么名称,地址多少,长度多少;另一个是SECTIONS,主要是对程序中的各个段位于哪个存储器中做个分配和声明。
因为L2缓存以及MSMC是DSP内部的资源,所以开始的时候,如无特殊需求,就把所有的程序段都分配到这两个区域内,L2有512KB,MSMC有4MB,一般都是够的。而且对于使用SYS/BIOS的工程来说,在cfg文件内是可以指定各个程序段的空间分配。
从而编译的时候会自动生成linker.cmd文件。
cmd文件是根据cfg文件自动生成的,所以单独修改cmd文件后重新编译后会还原的。
而这种方式过于死板,所以可以自己定义一个cmd文件,例如c6678_my.cmd。
此时需要做两个操作:
-
- 包含生成的linker.cmd,并将linker.cmd中的空间分配部分屏蔽掉;
- 添加自己的空间分配机制;
此时需要注意,程序不能再做重新编译操作(rebuild),只能做编译操作(build),防止linker.cmd更改。
在做空间分配的更改时最好的办法是从原来的L2+MSMC程序中一步一步地修改,修改一步就编译运行一下,看程序是否能够加载,是否能够运行。在某些场景,有些段是必须要放在DSP内部存储器中的,例如程序中用到了DDR3,那么DDR3初始化的程序就必须要运行在DSP内部存储器中。同时在调整各个段分配的时候可以参照.map文件进行,.map文件是编译后各个段的实际大小以及在各个存储器中的占用情况。
各个段的作用就不再赘余了,有兴趣的可以自行百度。根据各个段的大小来看内部空间是否能装的下~以此来保证程序正确。