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

 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的project\build 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无法使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值