职位关键字 工作地点
工作名称 公司名称 校园招聘
中国最好的工作搜索引擎!
  回复留言  
  给我一篇完整的dsp程序设计
作者: ruth_mengying  01-01 08:00   回复  
 我就要一篇可以运行的DSP设计类的程序,要完整的,包括运行结果在里面的!谢谢,急用

  回复:给我一篇完整的dsp程序设计
作者: limykobe  01-01 08:00   回复  
 以下程序采用TMS320VC5416芯片,运行环境ccs2.0

这是主程序(c语言的)

#include "stdio.h"

/*#include "mmregs.h"*/



#define imr 0x0000

#define ifr 0x0001

#define tcr 0x0026

#define prd 0x0025

#define pmst 0x001d



ioport unsigned port8001;



interrupt void timer();

/*extern void initial();

extern void porta();

extern void portb();*/



int flag=0;

int i;



interrupt void timer()

{

*(int *)0x300=*(int *)0x300+1;

if(*(int *)0x300==0x3E8)

{

*(int *)0x300=0;

*(int *)0x302=*(int *)0x302+1;

if(flag==0)

{flag=1;

i = 0x5555;

port8001 = i;

}

else

{flag=0;

i = 0xaaaa;

port8001 = i;

}

}

return;

}









main()

{

*(int *)0x300=0;

*(int *)0x302=0;

*(int *)pmst=0x3f9f;

asm(" ssbx 1,11"); //禁止所有中断

*(int *)ifr=0xffff;

*(int *)imr=0x00;

*(int *)tcr=0x410;

*(int *)prd=0x4e1f;

*(int *)tcr=0x420;

*(int *)imr=0x08;

asm(" rsbx 1,11");



while(1){;}

}





这是个向量程序(汇编的):

.sect ".vectors"

.ref _c_int00 ; C entry point

.ref _timer ;time interrupt point



.align 0x80 ; must be aligned on page boundary



RESET: ; reset vector

BD _c_int00 ; branch to C entry point

STM #200,SP ; stack size of 200

nmi: RETE ; enable interrupts and return from one

NOP

NOP

NOP ;NMI~



; software interrupts

sint17 .space 4*16

sint18 .space 4*16

sint19 .space 4*16

sint20 .space 4*16

sint21 .space 4*16

sint22 .space 4*16

sint23 .space 4*16

sint24 .space 4*16

sint25 .space 4*16

sint26 .space 4*16

sint27 .space 4*16

sint28 .space 4*16

sint29 .space 4*16

sint30 .space 4*16



int0: RETE

NOP

NOP

NOP

int1: RETE

NOP

NOP

NOP

int2: RETE

NOP

NOP

NOP

tint: b _timer

NOP

NOP

rint0: RETE

NOP

NOP

NOP

xint0: RETE

NOP

NOP

NOP

rint1: RETE

NOP

NOP

NOP

xint1: RETE

NOP

NOP

NOP

int3: RETE

NOP

NOP

NOP

.end



以上两个是编出来的。

还有一些源文件需要添加,就可以运行了。程序是利用定时实现流水灯的。如果有需要完整的其他文件可以把邮箱留下。我到时发给你。

  回复:给我一篇完整的dsp程序设计
作者: yiwenjieda  06-29 16:58   回复  
 光有.C文件没用的,让别人传个工程给你,要有.lib文件等等等等等,不然没法跑的

  回复:给我一篇完整的dsp程序设计
作者: 柳梦牛1347  06-29 16:58   回复  
 你们在干啥

  回复:给我一篇完整的dsp程序设计
作者: taoliujun  06-29 16:58   回复  
  DSP是什么脚本 或者语言啊

  回复:给我一篇完整的dsp程序设计
作者: tangling18  06-29 16:58   回复  
  随着DSP芯片功能的增强,已不再进行单纯的数字信号处理任务,而是作为一种MCU被广泛使用,控制板上各种资源,同时完成采集、计算、控制、通讯等任务。特别是当使用了TCP/IP或其它复杂通讯协议时,没有一个实时多任务操作系统是很难进行任务调度的。μC/OS-II作为一种源码公开的占先式实时多任务操作系统,总是执行处于就绪状态的优先级最高的任务,并支持Semaphore(信号量)、Mailbox(邮箱)、Message Queue(消息队列)等多种常用的进程间通信机制,是大多数高可靠嵌入式设备的首选。



2 开发环境简介

APCI5096是北京康拓工业电脑公司自行开发的一款DSP目标板,主要用于对模拟信号量的采样处理。该目标板以TMS320VC32为CPU,同时具有完备的输入/输出功能,可以实现30通道、16位、300KSPS的模拟输入。调试用编译器为TI公司的Code Composer ‘C3x-‘C4x,版本是4.10版。



3 移植过程

3.1 μC/OS-II系统结构

图1说明了μC/OS-II的软硬件体系结构。应用程序软件处于整个系统的顶层,只和μC/OS-II与处理器无关的代码以及μC/OS-II与应用相关的代码关联。这样保证了应用软件的可重用性。



μC/OS-II与处理器无关的代码提供了μC/OS-II的系统服务。利用这些API函数,应用程序可以进行内存管理、任务间的通信以及创建、删除任务等。μC/OS-II与应用相关的代码提供了对μC/OS-II本身的裁减,并可根据实际需要进行任务数、任务栈的大小等设置。



大部分的μC/OS-II代码是使用ANSI C语言书写的,因此μC/OS-II的可移植性较好。尽管如此,仍然需要使用C和汇编语言写一些处理器相关的代码。移植工作需要改写的是与处理器相关的代码,包括三个文件:OS_ CPU.H、OS_ CPU_ CC、OS_ CPU_ AASM。重点是任务堆栈的初始化、任务切换时栈指针的调整。



3.2 OS_ CPU.H

在不同的处理器中有不同的字长,所以必须重新定义一系列数据类型以确保移植的正确性。在OS_ CPUH文件中应完成:数据类型的重新定义、堆栈数据类型的定义、堆栈增长方向的定义、临界区开/关中断的方法、任务切换函数OS_TASK_SW的宏定义。



(1)数据类型的声明:在VC33中所有的整型数据(char、short、int、long)为相同的类型,用32位表示。浮点型数据(float、double)为相同类型,在VC33中用32位单精度浮点数表示。数据类型的重定义:

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;

typedef signed char INT8S;

typedef float FP32;

typedef double FP64;



(2)VC33栈的数据宽度为32位,采用上面重定义过的数据类型进行定义,确保栈数据类型的一致性。栈的数据类型声明:

typedef INT32U OS_ STK;



(3)μC/OS-II访问代码的临界区时需要先禁止中断,并且在访问完毕后重新允许中断。μC/OS-II利用两个宏来禁止和允许中断,通过状态寄存器的中断使能位开关中断。

cregister unsigned int ST; /*声明CPU内部寄存器*/

#define OS_ ENTER_ CRITICAL() asm(“ANDN 2000H, ST "); /*清中断使能位*/

#define OS_ EXIT_ CRITICAL() asm(“OR 2000H, ST "); /*置中断使能位*/



3.3 OS_ CPU_ C.C

在OS_ CPU_ C.C文件中主要完成的是OSTaskStkInit()函数,其余五个函数可以不进行处理。OSTaskStkInit()函数完成任务栈的初始化,使得任务栈的结构看起来如同在任务执行过程中发生过一次中断并将所有寄存器保存到堆栈一样。不同的编译器在函数调用时会有不同的入栈方法,如:参数和返回地址入栈顺序、参数之间入栈的顺序、参数利用寄存器还是堆栈保存等。在具体实现时还需要根据编译器的要求进行调整。



CCS函数调用时堆栈规则为:先将参数从左往右入栈、然后是函数返回地址入栈。依照此规则设计任务栈初始结构如图2。VC33共有28个寄存器,程序中应将寄存器全部入栈,在OSTaskStkInit中实现:



{

OS_ STK *stk; /*定义栈的数据结构*/

opt=opt;

stk=(OS_ STK *)ptos; /*装入栈顶指针*/

*stk=(OS_ STK)pdata; /*参数入栈*/

*++stk=(OS_ STK)task; /*任务返回地址*/

*++stk=(OS_ STK)task; /*中断返回地址*/

*++stk=(OS_ STK)0x2000; /*状态寄存器,开中断*/ 其余CPU寄存器全部入栈,并初始化为0

}



3.4 OS_ CPU_ A.ASM

在OS_ CPU_ AASM文件中要求用户编写四个简单的汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。这四个函数具有完全相同的公共部分:寄存器入栈和寄存器出栈。只要按照上面设计好的栈结构进行就可以了。注意的是VC33的R0到R7是扩展精度寄存器,具有40位。在入栈和出栈时均需要用两句话完成,如下:

入栈: 出栈:

PUSH R0 POPF R0

PUSHF R0 POP R1



而OSIntCtxSw函数具有特殊部分,该函数用于从中断返回时进行任务切换,由于在调用_ OSIntCtxSw函数前已经发生了中断,中断服务程序已经将CPU寄存器保存到堆栈中了,所以此处不再进行寄存器保存。同时还要进行栈指针的调整,去掉堆栈中一些不需要的内容,然后再将寄存器全部出栈。由于该函数是μC/OS-II中唯一的与编译器相关的函数,所以在移植后必须利用多次任务切换检查栈指针是否正确调整。



3.5 时钟中断源初始化

μC/OS-II还要求用户提供一个时钟资源,用于实现时间延时和确认超时。根据APCI5096的硬件设置,需要在三个文件中进行时钟资源的设置。



(1)OS_ CPU_ AASM:

APCI5096中,已将VC33的定时器1用于测频通道,因此利用未被占用的定时器0产生定时中断。实现方法为在TINT0的中断向量入口处放一跳转指令,跳转到自己写的OSTickISR。

sect “TINT0_ vector"

TINT0 br _ OSTickISR



(2)CMD文件

将TINT0跳转到OSTickISR后,还应再指定TINT0的向量入口地址。APCI5096板上的VC33被设置为BootLoader方式,在该方式下TINT0的入口地址固定在0x809FC9。在CMD文件的SECTIONS段指定如下:

TINT0_ vector:> 0x809FC9



(3)MainC文件

μC/OS-II要求用户在OSStart()运行后,μC/OS-Ⅱ启动运行的第一个任务中初始化节拍中断。自己编写一个函数TimerInit(),并在第一个任务开始处调用该函数完成定时器0的初始化。函数中TIM0_ XXX代表的是定时器0的三个寄存器的地址,在完成对定时器0的设置后还要打开全局中断和时钟中断。



{

*TIM0_PRD= 0x7530; /*设置周期为1KHZ*/

*TIM0_CNT=0;

*TIM0_CTL=0x2C1; /*启动时钟*/

ST|=0x2000; /*打开中断*/

IE|=0x100; /*打开时钟中断*/

}



4 测试、编写驱动和应用程序

做完以上工作以后,就要测试移植是否成功。最初测试时,可以先运行操作系统本身,调度一些简单的任务和时钟节拍中断任务。主要测试系统本身的正确性,如果调试成功就可以在上面继续开发驱动程序和添加应用程序。

  回复:给我一篇完整的dsp程序设计
作者: xuxigan  06-29 16:58   回复  
  1956年IBM的一个工程小组向世界展示第一台磁盘存贮系统Ramac,1968年Winchester技术被提出,硬盘走过了50年的历程,虽然硬盘技术上有很多的进步,衍生出了SCSI、IDE、SATA等多种不同的形式,那只是为了适应新的应用需要开发的不同接口而已,硬盘的结构依然没有超越Wenchester技术的定义:密封、固定并高速旋转的镀磁盘片,磁头延盘片向径移动,磁头悬浮在高速旋转的盘片上方而不与盘片接触。

硬盘基本上由控制电路板和盘体两大部分组成:

控制电路板由接口、DSP处理器、ROM、缓存、磁头驱动电路和盘片电机驱动电路等组成;接口有电源接口和数据接口及硬盘内部的盘片电机接口、磁头接口,电源接口提供硬盘工作所需要的电流,数据接口提供与计算机交换数据的通道,盘片电机接口提供盘片电机转动所需的电流,磁头接口用于提供电路板到磁头和音圈电机的信号连接;DSP处理器用于控制信号和数据的转换、编码等操作;ROM中存储了硬盘初始化操作的部分程序,有的ROM为独立的芯片(可能是EPROM、FLASH等),有的集成到了DSP中;缓存用于暂存盘体和接口交换的数据,以解决接口速度和硬盘内部读写速度的差别,缓存的大小对硬盘的数据传输率有一定的影响,随着硬盘的不断发展,缓存的容量也在不断增大;磁头驱动电路负责驱动磁头准确定位和对磁头信号进行整形放大等;电机驱动电路负责精确控制盘片的转速。

盘体由盘腔、上盖、盘片电机、盘片、磁头、音圈电机和其它的辅助组件组成。为保证硬盘正常工作,盘体内的洁净度很高,为防止灰尘进入,盘体处于相对密封的状态,由于硬盘工作的过程中发热,为了保证盘腔的空气压力与外界平衡,在盘体上有呼吸孔,呼吸孔的内侧安装有一个小的空气过滤器,硬盘的设计不同,呼吸孔的位置和结构也有所差别;同时由于盘体在装配完成后,要写入伺服信息,所以盘体上有伺服信息的写入口,在工厂无尘车间里将专用的写入设备从这个孔伸入盘体内写入伺服信息,写入完成后,会用铝箔将其封闭。

盘腔一般由铝合金铸造后机加工而成,盘体的其它组件都直接或间接安装在盘腔上面,盘腔上还有将硬盘安装到其它设备上的螺丝孔。

上盖一般由铝合金或软磁金属材料加工而成,有的是单层的,有的是由多层材料粘合而成;它的主要作用是与盘腔一起构成一个相对密封的整体,基本上都是用螺钉与盘腔连接,为了保证密封,上盖与盘腔的结合面一般都有密封垫圈。

盘片电机的主要作用就是带动盘片旋转,在控制电路板上的盘片电机驱动芯片的控制下,盘片电机带动盘片以设定的速度转动,盘片电机的转速由原来低于4000转/分,发展到现在的10000转/分,甚至15000转/分;盘片转速的提高直接决定着硬盘的寻道时间;当然,在提高转速的同时,硬盘的发热量、振动、噪声等也会对硬盘的稳定工作产生影响,所以一些新的技术也不断应用到盘片电机上,由最初的滚珠轴承电机发展到现在的液态轴承电机。



硬盘的盘片是硬盘的核心的组件之一,不同的硬盘可能有不同的盘片数量;所有的数据都是存储在盘片上的,盘片是在铝合金或玻璃基底上涂敷很薄的磁性材料、保护材料和润滑材料等多种不同功能的材料层加工而成,其中磁性材料的物理性能和磁层结构直接影响着数据的存储密度和所存储数据的稳定性;为了提高存储密度,防止超顺磁效应的发生,各相关机构进行了大量的研究工作,不断改进磁层的物理性能和磁层结构;磁记录层的记录方式也由以前的纵向磁记录发展到现在的垂直磁记录。在硬盘出厂前,会在盘片上写入伺服信息,将硬盘的盘面划分成一个一个的同心圆,称为磁道,多个盘片的相同位置的磁道形成了一个同心圆柱,这就是硬盘的柱面,在每个磁道上又划分出相同存储容量的扇区作为存储数据的最小单位。要让硬盘正常工作,硬盘必须有相应的初始化和管理程序,其中有部分写在盘片的特定区域,这就是我们常说的固件区,对于不同的硬盘,这个区域的物理位置是不同的,所记录的程序的数量和功能也有差别。由于生产过程中不可能保证整个盘片完全一致,必然有少部分扇区无法稳定读写数据,这就是我们所说的坏道,在每个硬盘出厂前都要进行老化试验,将坏道的位置写入硬盘固件区的工厂坏道表(p-List)中;同时在硬盘使用过程中,有少量的扇区由于种种原因可能也无法正确读写数据,这些坏道的位置也可以写入到硬盘固件区的增长坏道表(G-List)中。

磁头也是硬盘的核心组件,磁头的性能对硬盘的数据存储密度和内部传输率有很大的影响,磁头最早应用的是铁磁物质,1979年发明了薄膜磁头,使硬盘进一步减小体积、增大容量、提高读写速度成为了可能,80年代末期IBM研发了MR磁阻磁头,后来又研发了GMR巨磁阻磁头,现在的硬盘都是采用GMR磁头,是利用特殊材料的电阻值随磁场变化的原理来读取盘片上的数据;磁头在工作的过程中并不与盘片接触,而是在盘片高速旋转带动的空气动力的作用下以很低的高度在盘片上面飞行,为了提高磁头的灵敏度,磁头的飞行高度在不断降低;磁头一般跟金属磁头臂、音圈电机线圈和预放电路等组成一个组件,磁头在音圈电机的带动下根据读写数据的需要做往复运动来定位数据所在的磁道。



由于磁头需要靠盘片旋转带动的空气动力来飞行,那么在硬盘不工作或盘片电机的转速还没有达到预定值时,磁头无法飞行,而磁头的读写面和盘片都很光滑,如果他们直接接触必然导致粘连而妨碍盘片起转或导致磁头和盘片损伤,为此磁头在不工作时需要停泊在数据区以外的区域;硬盘有两种方式来满足这个要求:第一种方式是在盘片内侧开辟一个环形的磁头停泊区,磁头不工作时停泊在这个地方,为了防止粘连,停泊区被有意加工成带有一定粗糙度的区域,以便磁头停泊在这里时磁头和盘片之间有一定的空气,但这样必然导致硬盘启停时磁头和盘片要发生较严重的摩擦而损伤磁头,所以硬盘还有一个启停次数的指标;第二种方式是在盘片的外面安装一个磁头停泊架,当磁头不工作时停泊在停泊架上,这样正常情况下磁头永远也不会和盘片表面接触,也就不存在启停次数的问题。



为了防止硬盘不工作时发生意外,不同的硬盘还设计了不同的磁头锁定机构,当硬盘不工作或盘片没有达到预定转速时,磁头锁定机构将磁头锁定在停泊位置,有些网友反映晃动硬盘时硬盘里有响声,就是由磁头锁定机构发出的;为了防止磁头工作时出现意外而导致磁头撞击盘片电机的主轴或移动到盘片或停泊架以外,还设计有磁头限位装置。

音圈电机由一到两个高磁场强度的磁体及外围的磁钢组成封闭磁场和音圈电机线圈组成,在磁头驱动电路的控制下,依读写数据的要求带动磁头在盘片上方作往复运动使磁头定位在需要的数据磁道上。

硬盘通电以后,DSP首先运行ROM中的程序,部分硬盘会检查各部件的完整性,然后盘片电机起转,当转速达到预定转速时,磁头开始动作定位到盘片的固件区,读取硬盘的固件程序和坏道表,固件区在硬盘上的物理位置并不是一定的,完全由硬盘的设计决定;同时,并不是所有的固件都一定要写在盘片上,在硬盘的所有固件中,只有硬盘的密码是一定写在其固件区的;部分硬盘会先将ROM中记忆的系列号与盘片上的进行比较,如果不一致,硬盘会终止初始化工作,如果固件的关键扇区或文件损坏,硬盘可能出现敲盘、不能被BIOS识别或识别错误等故障;当所有必须的固件正常读出后,磁头会定位到硬盘的0柱面、0磁头、1扇区,也就是我们常说的0道,一般来说,硬盘的0磁头位于靠近盘片电机也就是硬盘的底部,而0道靠近盘片的边缘,然后我们才能对硬盘进行操作。

  回复:给我一篇完整的dsp程序设计
作者: linkon3  06-29 16:58   回复  
  最好叫你的男朋友帮你找

标 题:
内 容:
用户名:
 游客
 
 
Copyright©2005-2007, 版权所有 WWW.JOBMET.COM
ICP证:京ICP备06019556号