DSP

DSP基础知识和设置(应用中整理)

2019-07-13 10:17发布

 1.C程序的代码和数据如何定位 系统定义: .cinit   存放C程序中的变量初值和常量; .const   存放C程序中的字符常量、浮点常量和用const声明的常量; .econst  长.const(可定位到任何地方)(data) .switch  存放C程序中switch语句的跳针表; .text    存放C程序的代码; 可执行代码和常数(program) .bss     为C程序中的全局和静态变量保留存储空间; .ebss    长调用的.bss(超过了64K地址限制) .far     为C程序中用far声明的全局和静态变量保留空间; .stack   为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果; .sysmem  用于C程序中malloc、calloc和realloc函数动态分配存储空间 .esysmem 长调用的.sysmem(超过了64K地址限制)   .reset         复位中断向量表 .vectors       中断向量表 .data          已初始化数据,常数数据(比如对变量的初始化数据) .pvecs         外围模块中断向量表 .ref           引用外部定义的变量或函数名 .global        引用全局变量或函数 .space         定义要保留的空间 .def           定义变量,与#define功能相同 .end           段的结束标识 .sect          用户自定义的已初始化段 .asect         比.sect多了绝对地址定位功能,一般不用 .usect         用户自定义的未初始化段 用户定义: #pragma CODE_SECTION (symbol, "section name"); #pragma DATA_SECTION (symbol, "section name")   2.Build Options设置 软件开发过程涉及编译器(compiler),汇编器(assembler),连接器(linker),归档器(archiver),建库器(library-build utility),运行支持库(run time support library),HEX转换器(hex conversion utility),交叉引用列表器(cross reference lister),绝对列表器(absolute lister)等。其大都设置既可通过命令,也可通过ccs的projectuild options设置。   3. Run-Time Autoinitialization和Load-Time Initialization 在CCS的build options中的linker选项卡中,Autoinit Model有两个选项:Run-Time Autoinitialization和Load-Time Initialization。   因为这两个选项和.cinit和.bss Section有关,所以先简单的介绍一下这两个section相关的知识。从C语言的角度来看的话,.bss section是用来存放C语言中的全局变量的。而.cinit则用来存放全局变量的初始值。例如如果有下面的全局变量buf的话, short buf[4] = {0x01, 0x02, 0x03, 0x04};     那么buf放在.bss中,而初始值0x01, 0x02, 0x03, 0x04放在.cinit中。.cinit中储存的实际上是一个copy table,它对于每个需要初始化的全局变量,都有一个复制项与之对应,以55x系为例,上面的这段程序产生的复制项为: 00 04 00 12 34 00 00 01 00 02 00 03 00 04 ----- ----------- ------------------------ 1 2 3
  1. 复制的word数
  2. 复制的目标地址,也就是buf的地址(这里假设为0x1234)
  3. 要复制的数据,也就是初始化数据0x01, 0x02, 0x03, 0x04
    那么对于这个.cinit中的copy table具体由谁来完成复制操作呢,这样就有了Load-Time和Run-Time的这两个选择。 先来看看Run-Time Autoinitialization。这段英文的的意思是“运行时初始化”,实际上就是在main函数之前被运行的c_int00中的一段代码完成这个复制工作。我们知道c_int00是用来初始化C语言程序运行所需要的环境的,这个初始化的一部分就是初始化全局变量的初始值。因此在c_int00中初始化全局变量是理所当然的。 然而这样做存在一个问题:.cinit中的copy table只在c_int00中用一次,如果把它放在DSP的on chip RAM中的话,实在是太浪费了。因此通常的做法是将.cinit放到flash内存中。假设系统没有flash内存,而是采用的serial boot之类的启动方式,由别的芯片通过McBSP将DSP的程序传输到DSP中的话,我们就不得不把.cinit放到RAM中了。如果初始化数据很多的话,显然是非常浪费内存的。为了解决这个问题,可以采用Load-Time Initialization。 所谓Load-Time Initialization,就是在将程序load进DSP内存的同时,初始化.bss中的全局变量。   4.Debug和Release的区别 两者最主要的区别在于Project->Build Options->Compiler选项卡->Generate Debug选项的配置不同,Debug模式中选"Full Symbolic Debug (-g)",而Release模式中选"No Debug" 5.DSP,CMD文件不能用//注释 6.DSP28335中DMA通道所需RAM要配置在L4567SARAM中,否则DMA无法使用