摘要: 了解实时I/O的编程注意事项。
到目前为止,本系列已经介绍了以下主题:
第1部分(卷31-1):DSP架构和DSP优于传统电路
第2部分(卷31-2):数字滤波概念和DSP滤波算法
第3部分(卷31-3):有限脉冲响应(FIR)滤波器算法的实现和演示硬件平台ADSP-2181 EZ-Kit Lite的概述。
现在,我们更密切地关注实时系统特有的DSP编程问题。本文重点介绍了如何为具有各种I/O接口的DSP系统开发算法。
“实时”是什么意思?在一个系统中,每项任务都是用连续的信号和处理“实时”执行的。在数字信号处理(DSP)系统中,信号用采样集表示,即离散时间点的值。因此,在DSP系统中处理给定数量的样本的时间可以根据采样率在“实时”中有任意的解释。本系列的第一篇文章介绍了采样和奈奎斯特准则的概念,即在实时应用中,采样频率必须至少是 信号中感兴趣的最高频率分量(奈奎斯特速率)频率的两倍。采样之间的时间间隔称为采样间隔。要将系统视为“实时”运行,必须在新数据到达之前完成对给定数据集(取决于算法的一个或多个样本)的所有处理。
实时的定义意味着,对于以给定时钟速率运行的处理器,输入数据的速度和数量决定了在不落后于数据流的情况下可以对数据进行多少处理。对于设计师来说,使用有限的时间来处理数据的想法似乎很奇怪,因为这个概念在系统中没有相似之处。在系统中,信号被连续地处理。慢系统的唯一缺点是频率响应有限。相比之下,数字系统处理部分信号,足以非常精确地逼近,但只在有限的时间内。图1显示了一个比较。实时DSP可能受到在算法时间预算内可以完成的数据量或处理类型的限制。例如,给定的DSP处理器处理以48khz采样的数据值(音频信号),处理这些数据值(包括执行所有必要的任务)的时间比采样8 khz语音波段数据的时间要少。
在本系列前面描述的滤波器示例中,输入采样率为8 kHz。为了使示例中的DSP跟上实时数据,所有处理必须在1/(8 kHz)或125µs的时间预算内完成。在33 mhz数字信号处理器(每周期30ens)上,时间预算提供125µs/30 ns,或4166个指令周期,以完成处理和任何其他所需的任务。
由于执行任何给定算法的预算时间是有限的,因此时间管理是DSP系统软件设计的核心部分。时间管理策略决定处理器如何获得事件通知、影响数据处理和影响处理器通信。
事件通知:中断:可以对DSP进行编程,使其使用处理“事件”(即数据到达)的几种策略之一来处理数据。可以定期读取状态位或标志引脚,以确定是否有新数据可用。但是,“轮询”浪费了处理器周期。数据可能在最后一次轮询之后到达,但直到下一次轮询才会显示它的存在。这使得开发实时系统变得困难。
第二种策略是让数据在到达时中断处理器。使用中断来通知处理器是有效的,尽管不容易编程;在等待中断期间,可能会浪费时钟周期。尽管如此,事件驱动的中断编程非常适合于快速处理现实世界的信号,大多数dsp的设计都是为了有效地处理它们。实际上,它们被设计为对中断做出非常快速的响应。ADSP-2181对中断的响应时间约为三个处理器周期;也就是说,在75秒内,DSP已经停止做它正在做的事情,并且正在处理中断事件(矢量)。
在许多基于DSP的系统中,基于输入数据采样率的中断率通常与DSP的时钟率完全无关。在本系列前面看到的FIR示例中,处理器每隔125µs中断一次以接收新数据。
中断处理和中断向量:由于中断处理在DSP系统中是如此重要的一个元素,处理器通常具有内置的硬件机制来有效地处理中断。硬连线的机制比单独的软件更有效,因为DSP的中断服务例程(isr)可能必须满足以下所有需求:
快速上下文切换——从处理一个任务和它的数据(一个上下文)切换到另一个上下文,没有时间损失和编写程序保存寄存器内容和芯片状态信息的复杂性。
嵌套中断处理——“同时”处理不同优先级的多个中断。DSP一次处理一个中断,但是高优先级的中断可以优先于低优先级中断的处理。
继续接受数据/记录状态——当DSP服务中断时,事件继续在现实世界中发生,数据继续到达。为了跟上“现实世界”,DSP必须记录这些事件并接受数据,然后在完成中断服务后处理它们。
在器件dsp上,快速上下文切换使用两组数据寄存器完成。一次只有一个集是活动的,包含该上下文中正在处理的所有数据。当处理一个中断时,计算机可以从活动组切换到备用组,而不必临时将数据保存在内存中。这有助于在任务之间快速切换。
为了处理多个中断,设备dsp记录每个中断的状态。处理器状态信息保存在一组状态“堆栈”中,位于DSP的程序序列器中。“堆栈”由一组硬件寄存器组成。当事件发生时,当前状态信息被“推送”到堆栈上。这种堆栈机制还允许嵌套中断;具有较高优先级的程序可以中断具有较低优先级的程序。
两个硬件特性,中断锁存器和自动I/O,让器件dsp在处理中断时与“真实世界”保持同步。锁存器使DSP在处理中断时不会错过重要事件。其他功能,包括各种形式的自动I/O(包括串行端口,DMA,自动缓冲等),允许外部设备将数据泵入DSP的内存,而不需要DSP的干预。因此,当DSP“忙”时,没有数据丢失。
当外部源或内部资源产生中断请求时,DSP处理器自动存储其当前运行状态,并准备执行中断例程。中断例程是从中断向量表调度的。中断向量表是程序内存中的一个区域,其中包含分配给特定DSP中断函数的指令地址。例如,在下表中,ADSP-2181处理器的串行端口1 (SPORT1)上的传输(Tx)中断将导致下一条指令在程序存储器(PM)位置0x0020执行,然后是下三个位置的内容,直到0x0023(中断例程)。如表中的12项所示,ADSP-2181可以处理来自11个位置的中断(外部硬件、DMA端口和串行端口)和处理器Reset。该表列出了分配给内存位置0x0000到0x002F中的每个中断矢量源的已编程指令,用于FIR滤波器程序。
启动;nop;nop;nop;/* PM(0x0000-03):复位矢量*/
rti;nop;nop;nop;/* PM(0x0004-07): IRQ2 vector */
rti;nop;nop;nop;/* PM(0x0008-0B): IRQL1载体*/
rti;nop;nop;nop;/* PM(0x000C-0F): IRQL0矢量*/
Ar = dm(stat_flag);Ar = pass Ar;如果eq_rti;跳next_cmd;
/* PM(0x0010-13): SPORT0 Tx矢量*/
跳input_samples;nop;nop;nop;
/* PM(0x0014-17): SPORT0 Rx矢量*/
跳irqe;nop;nop;nop;/* PM(0x0018-1B): IRQE向量*/
rti;nop;nop;nop;/* PM(0x001C-1F): BDMA矢量*/
rti;nop;nop;nop;/* PM(0x0020-23): SPORT1 Tx矢量*/
rti;nop;nop;nop;/* PM(0x0024-27): SPORT1 Rx矢量*/
rti;nop;nop;nop;/* PM(0x0028-2B):定时器矢量*/
rti;nop;nop;nop;/* PM(0x002C-2F):下电矢量*/
每个中断向量有四个指令位置。通常,这些指令将导致处理器跳转到另一个内存区域以处理数据,如Reset(在0x0000)、SPORT0 Rx (0x0014)和IRQE (0x0018)中断向量所示。如果在四个可用的指令位置中只有几个步骤可以完成,例如赋值、检查状态或查找长内存,则直接对它们进行编程,如SPORT0 Tx向量(0x0010-13)所示。任何未使用的中断向量调用从中断返回(rti),带有三个nop(无操作)指令。
nop指令充当占位符——用于确保正确的中断动作与硬件指定的中断向量对齐的指令空间。在每个未使用的向量位置开始的rti指令既是占位符又是安全阀。如果一个未使用的中断被错误地揭开或无意中触发,“rti”导致返回到正常执行。
在DSP系统中,中断通常是由数据到达或需要提供新的输出数据而产生的。中断可以在每个样本中发生,也可以在收集到一帧数据之后发生。这些差异极大地影响了DSP算法处理数据的方式。
对于以采样为基础的算法,可能需要DSP软件来处理每个传入和传出的数据值。每个DSP串行端口包含两个数据I/O寄存器,一个接收寄存器(Rx)和一个发送寄存器(Tx)。当接收到串行字时,端口通常会产生接收中断。处理器停止它正在做的事情,开始在中断向量位置执行代码,将Rx寄存器的传入值读入处理器数据寄存器,然后对该数据值进行操作或返回其后台任务。在上表中,计算机跳转到程序段“input_samples”,执行在该段中编程的任何指令,并从中断返回,直接返回或通过返回到中断向量。
为了传输数据,串口可以产生一个传输中断,表示可以将新数据写入SPORT Tx寄存器。然后DSP可以在SPORT Tx中断向量处开始执行代码,通常将一个值从数据寄存器传输到SPORT Tx寄存器。如果数据输入和输出由相同的采样时钟控制,则只需要一个中断。例如,如果一个程序段是由接收中断定时器启动的,新的数据将在中断程序中被读取;然后,要么传输保存在寄存器中的先前计算的结果,要么计算一个新结果并立即传输——作为中断例程的最后一步。
所有这些机制都有助于DSP接近模拟系统的能力-实时连续处理数据-但具有数字精度和灵活性。此外,在高效编程的数字系统中,在处理数据集之间留下的空闲处理器周期可以用于处理其他任务。
在“实时”系统中,处理速度至关重要。通过使用SPORT自动缓冲,没有时间浪费在数据I/O上。相反,数据管理的目标是确保所选地址指向新数据。
在FIR滤波器示例中(对话31-3,第15页),当输入自动缓冲区满时产生SPORT Receive中断请求,这意味着DSP已经接收到三个数据字:状态、左通道数据和右通道数据。由于这个简化的应用程序使用单通道数据,因此算法只使用位于位置rx_buf+1的数据值。
在其他应用中,数据处理可能涉及更多。例如,如果将示例中的FIR滤波器扩展为双通道实现,则核心DSP算法代码不必更改。但是,必须修改与数据处理有关的代码,以考虑第二个数据流和第二组系数。
在过滤器代码中,需要内存中的两个新缓冲区来处理额外的数据流和额外的系数集。核心滤波回路可以作为一个单独的“可调用”函数进行隔离。这种技术允许使用相同的代码,而不管输入的数据值是什么。这种编程风格的好处包括可读的代码、可重用的算法和减少的代码大小。如果不采用模块化方法,则必须重复滤波器环路,使用额外的DSP内存空间。
然后,SPORT Receive中断例程将由指针的设置和调用过滤器组成。修改后的过滤器例程如下表所示:
过滤器:cntr = taps - 1;
Mr = 0, mx0 = dm(i2,m1), my0 = pm(i5,m5);
/*清除累加器,获取第一个数据
系数值*/
执行filt_loop直到ce;/*设置零开销循环*/
Filt_loop: Mr = Mr + mx0*my0(ss), mx0 = dm(i2,m1),
My0 = pm(i5,m5);/* MAC和两次数据读取*/
Mr = Mr + mx0 * my0 (rnd);/*最后的乘法,四舍五入到16位
结果* /
如果我坐先生;/ *检查溢出*/
即时战略游戏 ; /*返回*/
重要的是要注意,对核心过滤器循环的唯一修改是在例程的开头添加了一个标签“filter:”,并在末尾添加了一个“rts”(从子例程返回)指令。这些新增功能将过滤器代码从独立例程更改为可从其他例程调用的子例程。它不再是一个单一用途的例程,而是一个可重用的、可调用的子例程。
将核心过滤器设置为可调用的子例程后,现在可以解决双通道数据处理需求。为了简化一些编程问题,本例假设左右通道都使用相同的过滤器系数。
在本系列的第三部分中,展示了整个筛选器应用程序程序集代码。在代码清单的顶部,声明了所有必需的内存缓冲区。要扩展过滤器应用程序以处理两个数据通道,需要声明所需的新变量和缓冲区。对于传入数据,缓冲区声明,
.var / dm / circ_filt_data(水龙头);/*输入数据缓冲区*/
将需要替换为两个缓冲区,声明为
.var / dm / circ_filt1_data(水龙头);/*左通道输入数据缓冲区*/
.var / dm / circ_filt2_data(水龙头);/*右通道输入数据缓冲区*/
因为两个通道都要应用相同的过滤系数,所以数据缓冲区的长度是相等的。
过滤器循环子程序期望使用特定的地址寄存器访问某些数据和系数值。具体来说,地址寄存器I2必须指向最旧的数据样本,而I5必须在调用过滤器例程之前指向适当的系数值。
因为左右通道的过滤器将共享相同的内存指针,所以必须有一种机制来区分这两个数据流。对于数据指针I(2),需要定义两个新变量“filter1_ptr”和“filter2_ptr”。
内存中的这些位置将用于存储适合每个数据流的地址值。ADSP-2181的循环缓冲功能用于确保无论何时执行滤波器,数据指针始终位于缓冲区中的正确位置。由于子例程现在处理两个缓冲区,因此在完成对每个通道的处理时需要保存指针位置。
要设置指针,需要在数据内存中声明两个变量,如下所示:
.var / dm filter1_ptr;/*左通道数据的数据指针*/
.var / dm filter2_ptr;/*右通道数据指针*/
然后,这些变量需要用每个数据缓冲区的起始地址初始化;
.init filter1_ptr: ^filt1_data;/*初始化起始点
左通道*/
.init filter2_ptr: ^filt2_data;/*初始化起始点
右通道*/
DSP汇编软件识别符号“^”来表示“地址”。DSP连接器软件填充相应的地址值。通过这种方式,可执行程序中的指针变量被初始化为适当内存缓冲区的起始地址。
下面的清单显示了FIR Filter中断例程如何使用这些新的内存元素。第3部分中的原始Filter子例程已进行了修改,以提供两个独立的过滤通道。例程必须首先加载适当的数据指针,而不是直接启动过滤器计算。然后调用过滤器例程,并将结果输出放置在正确的位置以进行传输。
/*-------------------- 冷杉过滤器 --------------------*/
input_samples:
ena sec_reg;/*使用影子寄存器库*/
/*设置过滤器1 */
2 = dm(filter1_ptr);/*设置过滤器1的数据指针*/
0 = dm(rx_buf + 1);/*读取左通道数据*/
Dm (2,m1) = ax0;/*将新数据写入延迟线
指针现在指向最旧的数据*/
调用过滤器;/*执行left的第一个过滤器
通道数据*/
Dm (tx_buf+1) = mr1;/*写左通道输出数据*/
Dm (filter1_ptr) = i2;/*保存更新后的filter1数据指针*/
/*设置过滤器2 */
2 = dm(filter2_ptr);/*为过滤器2设置数据指针*/
0 = dm(rx_buf + 2);/*读取右通道数据*/
Dm (2,m1) = ax0;/*将新数据写入延迟线
指针现在指向最旧的数据*/
调用过滤器;/*再次执行过滤器
右通道数据*/
Dm (tx_buf+2) = mr1;/*写入右通道输出数据*/
Dm (filter2_ptr) = i2;/*保存更新后的filter2数据指针*/
rti ; /*从中断返回*/
因为核心过滤器算法不再处理数据I/O,这个子例程可以通过添加更多指针变量和声明更多缓冲区空间(只要有足够的内存存在!)来扩展到更多的过滤通道。类似地,通过设置包含系数缓冲区指针信息的变量,可以为两个过滤器使用不同的系数。在这两种情况下,都不需要改变过滤算法。使用这种模块化编程方式,用户可以建立一个可调用的DSP函数库。因此,特定系统的差异可以简化为数据处理问题,而不是开发新的算法。虽然这种编程风格不一定允许算法更快地执行其任务,但系统设计者在确定数据如何流经系统方面具有更大的灵活性。
实时接口问题:到目前为止,我们已经研究了嵌入式系统中的实时编程如何依赖于快速中断响应、高效数据处理和快速程序执行。此外,进出处理器的数据流也会影响系统在实时嵌入式环境中的工作效果。
输入和输出数字信号处理器的主要数据流可以是并行的也可以是串行的。并行传输通常至少与处理器架构的本机数据字一样宽(ADSP-2100系列处理器为16位,SHARC 为32位)。并行传输通过处理器的外部存储器总线或外部主机接口总线进行。串行数据传输需要更少的互连;它们经常用于与数据转换器通信。
串行接口:硬件接口的易用性是有效实现DSP系统的重要因素。ADSP-2181 EZ-Kit Lite系统使用AD1847串行编解码器(编码器/解码器)。串行编解码器允许通过DSP上的串行端口(SPORT)进行数据传输。这个串行端口不是RS-232 pc风格的异步串行端口;它是一个5线同步接口,传递位时钟、接收数据、发送数据和帧同步信号。串行接口的主要优点是引脚数少,硬件连接容易。AD1847只需要4个信号与DSP接口:串行时钟、接收数据、发送数据和接收帧同步信号。串行数据流是时分多路复用的(TDM),这意味着同一条物理线路可以按串行顺序携带一种以上类型的信息。在上一期中启动的EZ-Kit Lite上的AD1847应用程序的情况下,串行线携带左通道和右通道音频信息,以及编解码器控制和状态信息。
如前所述,处理器有各种方法来处理这些数据。SPORT中断由串行端口硬件自动生成,用于接收或传输数据,以及单个字或一个字块(图2)。数字信号处理器和I/O设备之间的串行接口
并行接口:即使串行位时钟运行速度与DSP处理器一样快,串行接口也以数据传输速度换取布线的简单性,传输数据字的速度只是DSP处理器速度的一小部分。对于需要更高数据速率的系统性能,可以使用并行接口。当并行接口时,DSP使用其外部数据和地址总线来读取或写入数据到外围设备。在ADSP-2181上,总线可以与多达16位的数据进行接口。
并行数据传输总是比串行传输快。DSP可以在每个处理器周期执行外部访问,但这需要能够跟上它的快速并行外设,例如快速SRAM芯片。与其他实体的并行数据传输通常在每个处理器周期内少于一次。
中断处理对于串行和并行接口是不同的。由于DSP处理器的外部数据总线是处理各种数据的通用实体,它没有专用的信号线用于中断的产生和控制;但是,其他DSP资源是可用的。在ADSP-2181上,有几条外部硬件中断线,如用于I/O存储器选择的中断线,可由外部设备触发,如A/D转换器或编解码器。这样的接口如图3所示,涉及一个并行器件和ADSP-2181 DSP。DSP的并行I/O接口
当响应并行数据的中断时,处理器通过执行类似于下面所示的指令,读取适当的源并通常将该数据值放入内存:
irq2_svc: ax0 = IO(ad_converter);Dm (2,m1) = ax0;rti;
“ad_converter”是先前在I/O空间中定义的地址。
本文的目标是详细介绍DSP开发人员在处理实时系统中的I/O和其他事件时所面临的编程问题。引入的问题包括实时数据(示例和帧)、中断和中断处理、自动I/O以及将例程一般化以生成可调用的子例程。这篇简短的文章无法公正地描述与每个主题相关的许多层次的细节。下面的参考资料提供了进一步的信息。本系列的后续主题将继续以该应用程序为基础。下一篇文章将为我们不断增长的示例程序添加更多特性,并描述软件验证(即调试)技术。
ADSP-2100系列汇编工具;模拟器手册。请咨询您当地的设备销售办事处。
ADSP-2100系列用户手册。设备。免费的。
在我们网站的“产品文档”下的“设计支持”区域可以找到许多有价值的出版物。
参见:(第一部分)(第二部分)(第三部分)
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308