论文部分内容阅读
【摘 要】本文首先对DSP程序设计和Windows应用程序设计进行了比较,从而分析了DSP程序设计的优势。主要阐述了DSP系统编程的ADSP-TS201S中LDF文件的编写、系统配置与初始化函数的编写、main函数的编写、系统配置与初始化函数的编写、main函数的编写及典型处理流程等方面。
【关键词】DSP系统编程;main函数;LDF文件
由于DSP在开始工作之前需要对芯片的时钟和外设进行设置,并且DSP系统通常一旦启动,便开始执行重复操作,所以DSP的程序设计和Windows应用程序设计会有一些不同,大概可归纳为以下3点:设计思想的不同,并行执行的不同,时间可预测性的不同。
首先,在DSP的程序设计中,通常需要先对DSP和外围设备进行初始化,初始化完成后的程序为一个无限循环,在循环中判断不同的条件执行不同的任务,并通过DSP中断来处理一些特殊的情况,类似于Windows应用程序设计中的消息机制;另外目前的DSP中并没有Windows编程中的多线程,除了DMA可以和DSP运算同时进行外,其他的操作都是顺序执行的,例如在执行中断服务函数时,需打断之前的操作过程,保存之前的现场后再开始执行中断服务函数,在完成中断服务函数后再恢复现场,并顺序执行进入中断前的程序;最后,实时信号处理要求程序的执行时间是可预测的,以判断系统是否满足实时性的要求。高性能的通用处理器普遍采用了CACHE和动态分支预测技术,使得程序执行时间的预测变得很困难,而DSP的动态特性较少,可以较容易地预测程序的执行时间,且DSP中的循环操作不需要額外消耗时间,而是通过硬件来完成循环计数器的衰减和循环的跳转,这对提高含大量循环程序的数字信号处理算法的效率是很重要的。
一个典型的DSP程序工程通常是由连接描述文件(*.ldf),头文件(*h),C语言程序文件(*.C),汇编语言程序文件(*.asm)等组成的。其中连接描述文件(*.ldf)用于描述多处理器的存储器偏移量、共享存储区域和每个处理器的储存空间;头文件(*h)主要用于函数宏定义和变量定义;C语言进行设计(*.C)、汇编语言程序文件(*asm)用于编写控制DSP运行的程序。
在程序设计过程中,通常需要自行编写的是C语言程序文件(*.c)和汇编语言程序文件(*asm),其中大部分程序可以通过C语言进行设计,关键的子函数可以通过汇编语言来实现以提高运行效率。
图1给出了一个雷达信号处理系统中单个DSP工作的流程。
图中,在程序开始之前,有对DSP和外部设备的初始化,之后一旦判断到中断信号,就开始进入循环,处理接收到的雷达数字信号,处理完成将运算结果输出后便又开始检测中断信号,等待处理后续的数据。该流程是一个典型的DSP信号处理流程。
ADSP-TS01S的编程与一般DSP的编程大同小异,下文将从系统初始化、DMA的使用和中断的使用这3个比较典型的方面对ADSP-TS201S的程序设计方法进行说明。
根据上面的介绍,本文DSP系统编程的介绍主要包括以下几个方面:ADSP-TS201S中LDF文件的编写、系统配置与初始化函数的编写、main函数的编写、系统配置与初始化函数的编写、main函数的编写及典型处理流程等方面。
1、ADSP-TS201S中LDF文件的编写
LDF文件是ADSP-TS201S工程中不可缺少的一部分,它主要用于多DSP工程中多个处理器工程之间的链接描述。通常所使用的DSP工程都是一个工程对应一个处理器,因此LDF文件不需要做出修改。
而对于建立多处理器(MP)系统,则需要使用到LDF文件。
建立MP系统的第一步是使用链接器的多处理器功能创建一个多处理器工程和一个描述系统的LDF文件
其中LDF文件用于描述多处理器的存储器偏移量、共享存储区和每个处理器的存储空间。在书写MP系统的LDF文件时,必须考虑以下LDF命令:
①MPMEMORY{ },该命令定义了每个处理器在多处理器存储空间(MMS)中的偏移量。在多处理器链接过程中,链接器使用该偏移量来链接各个处理器。
②MEMORY{ },该命令可定义系统中每个处理器的存储空间。
③PROCESSOR{ }和SECTIONS{ },利用这两个命令可定义各个处理器,并可使用存储器定义将每个处理器的输出文件放置到程序段中。
④SHARED- MEMORY{ },当在系统中使用了外部共享存储器时,需要使用该命令。该命令能识别共享存储器项的输出,并生成驻留在MP系统的共享存储空间中的共享存储区的可执行文件(.SM)。
⑤SM文件由工程文件中的源文件(.ASM,.C或.CPP)产生,该文件包含有放置于外部共享存储器中的数据变量的定义。
⑥LINK-AGAINST(),该命令可解析多处理器存储空间中的符号,并命令链接器检查指定的可执行文件(.DXEs and .SMs),以解析局部没有解析的变量和符号,以及在MMS(也就是系统中其他处理器的内部储存器)中定义的表达式或变量。通常在LDF文件中,必须使用LINK_GAINST 0命令。
如果命令行中包括.SM和.DXE文件,则必须先放.SM文件,后面接着放其他.DXE文件,只有这样,链接器才能正确的解析变量。一个LDF文件中最多可以说明的处理数量是由处理器结构指定的(比如ADSP TS201最多支持8片)。应该注意的是,在同一个LDF文件中,VisualDSP++4.0尚不支持有不同结构的DSP混合使用(如ADSP-TS201S和ADSP21160混合使用)
2、Main函数及典型处理流程
DSP程序设计中,最核心的部分便是main函数的设计,DSP中几乎所有的信号处理工作都在main函数中完成。
通常地,要设计一个DSP系统,第一步便是根据系统的需求去设计好DSP系统所需完成的流程图,当DSP处理流程图设计完成后时,剩下的工作便是根据流程图,设计图中每一个单元所需的子函数,并在主函数main中逐个调用这些子函数以实现流程图中的功能。
在一个DSP系统中,一旦DSP启动,DSP的程序指针便指向main函数的起始端,从main函数开始向下顺序执行。Main函数中执行的内容通常是以子函数的形式出现。对于DSP程序,根据功能又可以分为初始化程序和中断服务程序等。
前文所属的系统初始化函数通常只是main函数中执行的第一个子函数,初始化子函数执行完成后开始执行其他子函数。这些子函数根据所使用的编程语言又可分为使用汇编语言编写的子函数和C语言编写的子函数;在DSP程序设计时,通常将一些较关键的、算法比较复杂的、需要多次执行的程序用汇编语言来编写,以提高系统的处理效率。通常比较同样功能的C语言程序和汇编语言程序时,汇编语言程序的执行效率相比C语言程序会提高4~10倍。
【关键词】DSP系统编程;main函数;LDF文件
由于DSP在开始工作之前需要对芯片的时钟和外设进行设置,并且DSP系统通常一旦启动,便开始执行重复操作,所以DSP的程序设计和Windows应用程序设计会有一些不同,大概可归纳为以下3点:设计思想的不同,并行执行的不同,时间可预测性的不同。
首先,在DSP的程序设计中,通常需要先对DSP和外围设备进行初始化,初始化完成后的程序为一个无限循环,在循环中判断不同的条件执行不同的任务,并通过DSP中断来处理一些特殊的情况,类似于Windows应用程序设计中的消息机制;另外目前的DSP中并没有Windows编程中的多线程,除了DMA可以和DSP运算同时进行外,其他的操作都是顺序执行的,例如在执行中断服务函数时,需打断之前的操作过程,保存之前的现场后再开始执行中断服务函数,在完成中断服务函数后再恢复现场,并顺序执行进入中断前的程序;最后,实时信号处理要求程序的执行时间是可预测的,以判断系统是否满足实时性的要求。高性能的通用处理器普遍采用了CACHE和动态分支预测技术,使得程序执行时间的预测变得很困难,而DSP的动态特性较少,可以较容易地预测程序的执行时间,且DSP中的循环操作不需要額外消耗时间,而是通过硬件来完成循环计数器的衰减和循环的跳转,这对提高含大量循环程序的数字信号处理算法的效率是很重要的。
一个典型的DSP程序工程通常是由连接描述文件(*.ldf),头文件(*h),C语言程序文件(*.C),汇编语言程序文件(*.asm)等组成的。其中连接描述文件(*.ldf)用于描述多处理器的存储器偏移量、共享存储区域和每个处理器的储存空间;头文件(*h)主要用于函数宏定义和变量定义;C语言进行设计(*.C)、汇编语言程序文件(*asm)用于编写控制DSP运行的程序。
在程序设计过程中,通常需要自行编写的是C语言程序文件(*.c)和汇编语言程序文件(*asm),其中大部分程序可以通过C语言进行设计,关键的子函数可以通过汇编语言来实现以提高运行效率。
图1给出了一个雷达信号处理系统中单个DSP工作的流程。
图中,在程序开始之前,有对DSP和外部设备的初始化,之后一旦判断到中断信号,就开始进入循环,处理接收到的雷达数字信号,处理完成将运算结果输出后便又开始检测中断信号,等待处理后续的数据。该流程是一个典型的DSP信号处理流程。
ADSP-TS01S的编程与一般DSP的编程大同小异,下文将从系统初始化、DMA的使用和中断的使用这3个比较典型的方面对ADSP-TS201S的程序设计方法进行说明。
根据上面的介绍,本文DSP系统编程的介绍主要包括以下几个方面:ADSP-TS201S中LDF文件的编写、系统配置与初始化函数的编写、main函数的编写、系统配置与初始化函数的编写、main函数的编写及典型处理流程等方面。
1、ADSP-TS201S中LDF文件的编写
LDF文件是ADSP-TS201S工程中不可缺少的一部分,它主要用于多DSP工程中多个处理器工程之间的链接描述。通常所使用的DSP工程都是一个工程对应一个处理器,因此LDF文件不需要做出修改。
而对于建立多处理器(MP)系统,则需要使用到LDF文件。
建立MP系统的第一步是使用链接器的多处理器功能创建一个多处理器工程和一个描述系统的LDF文件
其中LDF文件用于描述多处理器的存储器偏移量、共享存储区和每个处理器的存储空间。在书写MP系统的LDF文件时,必须考虑以下LDF命令:
①MPMEMORY{ },该命令定义了每个处理器在多处理器存储空间(MMS)中的偏移量。在多处理器链接过程中,链接器使用该偏移量来链接各个处理器。
②MEMORY{ },该命令可定义系统中每个处理器的存储空间。
③PROCESSOR{ }和SECTIONS{ },利用这两个命令可定义各个处理器,并可使用存储器定义将每个处理器的输出文件放置到程序段中。
④SHARED- MEMORY{ },当在系统中使用了外部共享存储器时,需要使用该命令。该命令能识别共享存储器项的输出,并生成驻留在MP系统的共享存储空间中的共享存储区的可执行文件(.SM)。
⑤SM文件由工程文件中的源文件(.ASM,.C或.CPP)产生,该文件包含有放置于外部共享存储器中的数据变量的定义。
⑥LINK-AGAINST(),该命令可解析多处理器存储空间中的符号,并命令链接器检查指定的可执行文件(.DXEs and .SMs),以解析局部没有解析的变量和符号,以及在MMS(也就是系统中其他处理器的内部储存器)中定义的表达式或变量。通常在LDF文件中,必须使用LINK_GAINST 0命令。
如果命令行中包括.SM和.DXE文件,则必须先放.SM文件,后面接着放其他.DXE文件,只有这样,链接器才能正确的解析变量。一个LDF文件中最多可以说明的处理数量是由处理器结构指定的(比如ADSP TS201最多支持8片)。应该注意的是,在同一个LDF文件中,VisualDSP++4.0尚不支持有不同结构的DSP混合使用(如ADSP-TS201S和ADSP21160混合使用)
2、Main函数及典型处理流程
DSP程序设计中,最核心的部分便是main函数的设计,DSP中几乎所有的信号处理工作都在main函数中完成。
通常地,要设计一个DSP系统,第一步便是根据系统的需求去设计好DSP系统所需完成的流程图,当DSP处理流程图设计完成后时,剩下的工作便是根据流程图,设计图中每一个单元所需的子函数,并在主函数main中逐个调用这些子函数以实现流程图中的功能。
在一个DSP系统中,一旦DSP启动,DSP的程序指针便指向main函数的起始端,从main函数开始向下顺序执行。Main函数中执行的内容通常是以子函数的形式出现。对于DSP程序,根据功能又可以分为初始化程序和中断服务程序等。
前文所属的系统初始化函数通常只是main函数中执行的第一个子函数,初始化子函数执行完成后开始执行其他子函数。这些子函数根据所使用的编程语言又可分为使用汇编语言编写的子函数和C语言编写的子函数;在DSP程序设计时,通常将一些较关键的、算法比较复杂的、需要多次执行的程序用汇编语言来编写,以提高系统的处理效率。通常比较同样功能的C语言程序和汇编语言程序时,汇编语言程序的执行效率相比C语言程序会提高4~10倍。