DSP这个程序怎么破大问题

DSP这个程序怎么破大问题,第1张

函数的名字,貌似是在往端口写数据,然后定义一个status的变量,一个延时,之后的循环一直在轮询,就是等待端口完成某些 *** 作,你应该看看中断里面执行了什么 *** 作,因为这里很明显,c_addr这儿在不断轮询过程中会发生变化。最后把数据值付给了端口。

DSP系统的引导程序(BOOT)是系统加电或复位时,DSP将一段存储在外部的非易失性存储器的程序代码通过DMA方式拷贝到内部的高速内存中运行。这样既能扩展DSP有限的存储空间,又能充分发挥DSP内部资源的效能。用户的代码也可以通过掩膜方式写入到DSP内部ROM中,但这样受容量和价格的限制,且不便于扩展和升级。 DSP的引导过程如下: 1) DSP复位后,通过DMA方式将外部CE1空间的数据读入到内部程序空间地址0处,读入数据的多少因芯片而异(TMS320C6712一次只拷贝1KB)。 2) DSP推出复位状态,开始执行内部程序空间地址0处的程序,这段程序先将外部主程序数据读入到DSP内部程序空间相应地址,然后跳转到主程序运行。 第一步是由芯片自动完成,关键是第二步:用户需要编写相应的汇编程序,实现二次引导,即用户主程序的装载

数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用。德州仪器、Freescale等半导体厂商在这一领域拥有很强的实力。

DSP(digital signal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。

DSP微处理器(芯片)一般具有如下主要特点:

(1)在一个指令周期内可完成一次乘法和一次加法;

(2)程序和数据空间分开,可以同时访问指令和数据;

(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;

(4)具有低开销或无开销循环及跳转的硬件支持;

(5)快速的中断处理和硬件I/O支持;

(6)具有在单周期内 *** 作的多个硬件地址产生器;

(7)可以并行执行多个 *** 作;

(8)支持流水线 *** 作,使取指、译码和执行等 *** 作可以重叠执行。

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

2 开发环境简介

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

3 移植过程

31 μ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_ CPUH、OS_ CPU_ C�C、OS_ CPU_ A�ASM。重点是任务堆栈的初始化、任务切换时栈指针的调整。

32 OS_ CPUH

在不同的处理器中有不同的字长,所以必须重新定义一系列数据类型以确保移植的正确性。在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 "); /*置中断使能位*/

33 OS_ CPU_ CC

在OS_ CPU_ CC文件中主要完成的是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

}

34 OS_ CPU_ AASM

在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中唯一的与编译器相关的函数,所以在移植后必须利用多次任务切换检查栈指针是否正确调整。

35 时钟中断源初始化

μ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这个程序怎么破大问题全部的内容,包括:DSP这个程序怎么破大问题、DSP的引导程序是起到什么作用的程序、DSP技术讲的是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9395714.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存