DSP

Posted wy9264

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP相关的知识,希望对你有一定的参考价值。

一、DSP与单片机的区别

冯·诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构;

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问;

F2812数字信号处理器采用增强的哈佛总线结构,能够并行访问程序和数据存储空间。 内部集成了大量的SRAM、ROM以及Flash等存储器,并且采用统一寻址方式(程序、数 据和I/O统一寻址), 从而提高了存储空间的利用率,方便程序的开发。

二、DSP编程

1、在C语言中,“#pragma DATA_SECTION”的编程方式如下:

#pragma DATA_SECTION(symbol,"section name")
其中,symbol是变量名,而section name是数据段名。下面以变量SciaRegs和ScibRegs
为例,将这两个变量分配到名字为SciaRegsFile和ScibRegsFile的数据段。
//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("SciaRegsFile")
#else
#pragma DATA_SECTION(SciaRegs,"SciaRegsFile");
#endif
volatile struct SCI_REGS SciaRegs;

//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("ScibRegsFile")
#else
#pragma DATA_SECTION(ScibRegs,"ScibRegsFile");
#endif
volatile struct SCI_REGS ScibRegs;
上述代码为f28004x_globalvariabledefs.c文件中的一段,其作用就是将SciaRegs和
ScibRegs分配到名字为SciaRegsFile和ScibRegsFile的数据段。CMD文件会将每个数据
段直接映射到相应的存储空间里              

2、位定义

struct SCI_REGS {
    union   SCICCR_REG                       SCICCR;   
   //Communications control register
    union   SCICTL1_REG                      SCICTL1;                 
     // Control register 1
    union   SCIHBAUD_REG                     SCIHBAUD;                
     // Baud rate (high) register
    union   SCILBAUD_REG                     SCILBAUD;                 
    // Baud rate (low) register
    union   SCICTL2_REG                      SCICTL2;                
      // Control register 2
    union   SCIRXST_REG                      SCIRXST;               
       // Receive status register
    union   SCIRXEMU_REG                     SCIRXEMU;             
        // Receive emulation buffer register
    union   SCIRXBUF_REG                     SCIRXBUF;               
      // Receive data buffer
    Uint16                                   rsvd1;                        // Reserved
    union   SCITXBUF_REG                     SCITXBUF;                    // Transmit data buffer
    union   SCIFFTX_REG                      SCIFFTX;                      // FIFO transmit register
    union   SCIFFRX_REG                      SCIFFRX;                      // FIFO Receive register
    union   SCIFFCT_REG                      SCIFFCT;                      // FIFO control register
    Uint16                                   rsvd2[2];                     // Reserved
    union   SCIPRI_REG                       SCIPRI;                       // SCI Priority control
};

//---------------------------------------------------------------------------
// SCI External References & Function Declarations:
//
extern volatile struct SCI_REGS SciaRegs;
extern volatile struct SCI_REGS ScibRegs;

定义union形式的成员即可以实现对寄存器的整体操作,也可以实现对寄存器进行位操作,而定义为Uint16的成员只能直接对寄存器进行操作。

留的寄存器空间采用变量来代替,但是该变量不会被调用,如rsvd1、rsvd2、rsvd3.

关键字volatile的意思是"易变的",使得寄存器的值能够被外部代码任意改变,例如 可以被外部硬件或者中断任意改变,如果不使用关键字volatile,则寄存器的值只能被 程序代码所改变。

4)声明
(1)寄存器变置对所有char、short, int和指针类型有效;
(2)结构成员不能打包成字(位域除外).每个成员以16位字的边界对齐;
(3)整数类型的位域带有符号,位域打包成字时从高位开始, 不越过字的边界对齐;
(4)intetrupt关键字仅可用于没有参量的void函数。
5)预处理
预处理忽略任何不支持的#program伪指令#支持的有:
(1) CODE_SECTION; (2) DATA_SECTION; (3) FUNC_EXT_CALLED.

 

3、存储器映像

MEMORY
{
 PAGE 0:    /* Program Memory */

 PAGE 1:    /* Data Memory */
 .
 .
 .
 SCIA         : origin = 0x007200, length = 0x000010     /* SCI-A registers */
 SCIB         : origin = 0x007210, length = 0x000010     /* SCI-B registers */
.
.
.
}
SECTIONS
{
 .
 .
 .
   SciaRegsFile             : > SCIA,           PAGE = 1
   ScibRegsFile             : > SCIB,           PAGE = 1
 .
 .
 .
}

首先在MEMORY部分,SCI_A寄存器的物理地址从0x007200开始,长度为16,SCI_A寄存器的物理 地址从0x007210开始,长度为16。然后在SECTIONS部分,数据段SciaRegsFile被映射到 了SCI_A,而ScibRegsFile被映射到了SCI_B,实现了数据段映射到相应的存储器空间。

通过以上两部分的操作,才完成了将外设奇存器的文件映射到寄存器的物理地址空间上, 这样才可以通过C语言来实现对F2812寄存器的搡作。

F2812各个存储器模块的特点:

    整个存储器分成多段。

    代码安全保护。 低功耗模式。

    可根据CPU频率调整等待周期。

    FLASH流水线模式能够提高线性代码的执行效率。

16进制0x000400=4*16^2=2^10=1k

F2812存储器映像(Memory Map 地图) (1)RAM(18K*16位)程序/数据 (2)OTP (one time programmable ROM) 程序/数据 (3)Boot ROM 引导ROM Bootloader

4、CMD文件(Linker Command Files )
COFF格式和段的概念(COFF=Common Object File Format) 库 .lib 目标文件 .obj 可执行文件.out
(1)通过伪指令来定义段 (2)给段分配存储空间

C语言生成的段 :已初始化 程序存储空间; 未初始化 数据存储空间。

用伪指令定义段

#pragma CODE_SECTION(symbol,"section name") /*代码 symbol:函数/全局变量*/

#pragma DATA_SECTION(symbol,"section name") /*数据*/
例:将全局数组变量S[100]单独编译成一个新的段,取名为"newsect"
    #pragma DATA_SECTION(S,"newsect");
    unsigned int S[100];
    void main()
    {
        ...
    }
第1步 用MEMORY伪指令来指示存储空间(分页制存储   R.W.X.I)     
MEMORY
{ 
  PAGE 0:    /* Program Memory 用来存改程序*/
  PAGE 1:    /* Data Memory  数据 */
  SCIA         : origin = 0x007200, length = 0x000010     /* SCI-A registers */
  SCIB         : origin = 0x007210, length = 0x000010     /* SCI-B registers */
}
第2步 通过SECTIONS伪指令来分配到存储空间
SECTIONS
{
   SciaRegsFile             : > SCIA,           PAGE = 1
   ScibRegsFile             : > SCIB,           PAGE = 1
}
ScibRegsFile;:段名  >:load SCIA:allocation(地址)  

 

以上是关于DSP的主要内容,如果未能解决你的问题,请参考以下文章

dsp 用啥编程

怎样查看DSP程序中代码的运行时间,该如何处理

无法重新打开 DSP 设备 /dev/dsp:权限被拒绝

dsp28377控制DM9000收发数据

dsp

DSP28335基础教程——系统定时器CPUTimer(定时中断)