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,则寄存器的值只能被 程序代码所改变。
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
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的主要内容,如果未能解决你的问题,请参考以下文章