嵌入式数据搬运实战:EDMA与ADC乒乓缓冲器协同设计
1. 项目概述与核心价值
在雷达信号处理、医疗成像或者高速数据采集这类嵌入式应用里,最让人头疼的往往不是算法本身,而是数据怎么“搬”得又快又稳。CPU吭哧吭哧算半天,结果数据还在路上堵着,这种性能瓶颈我见过太多了。问题的核心就在于,当ADC以每秒几百兆甚至上亿次的速度吐出采样数据时,如果还让CPU一个个字节去搬运,那无异于让一个数学家去干快递员的活,完全是巨大的资源浪费。
这时候,直接内存访问(DMA)技术就成了救星。它的核心思想很简单:让一个专门的、高效的“搬运工”(DMA控制器)来负责数据在内存和外围设备(比如ADC)之间的转移,CPU只需要告诉这个搬运工“从哪搬、搬去哪、搬多少”,就可以撒手去干更重要的计算任务了。而增强型直接内存访问(EDMA),则是这个理念的终极进化形态,它通过一套极其灵活和强大的寄存器配置体系,实现了对复杂数据传输模式(比如二维、三维数组)的精细控制。
光有高效的搬运工还不够,还得有个合适的“中转站”。ADC缓冲器(ADC Buffer)就是这个关键的中转站。它通常设计成乒乓缓冲(Ping-Pong Buffer)结构,简单说就是准备两个一样大的仓库(Ping和Pong)。当ADC正在往其中一个仓库(比如Ping)灌数据时,EDMA可以同时从另一个仓库(Pong)里把上一批数据搬走,送给DSP或FFT加速器去处理。两者一存一取,无缝切换,实现了数据流的连续不断。
所以,这个项目的核心,就是深入理解EDMA的寄存器配置逻辑与ADC缓冲器的工作机制,并让它们协同起来,构建一条从ADC采样到数据处理单元的、高吞吐、低延迟的“数据高速公路”。这对于任何涉及实时流数据处理的嵌入式工程师,尤其是使用TI C6000系列DSP或类似架构的开发者来说,是必须掌握的内功。下面,我就结合手册里的那些寄存器位,拆开揉碎了讲讲这里面的门道。
2. EDMA核心机制与寄存器深度解析
手册里那一堆以EDMA_TPTC_开头的寄存器,初看令人望而生畏,但一旦理解了EDMA的数据模型,它们就变成了乐高积木,可以组合出各种复杂的数据搬运模式。
2.1 EDMA的三维传输模型:ACNT, BCNT, CCNT
这是理解所有寄存器的基础。EDMA把一次传输任务(Transfer Request, TR)抽象成一个三维的数据块:
- ACNT (第一维,元素计数):代表最内层、连续传输的字节数。比如,你要传输一个包含128个
int16_t的数组,每个元素2字节,那么ACNT就设置为256(字节)。 - BCNT (第二维,数组计数):代表有多少个这样的ACNT数组。每个数组传输完成后,源地址和目标地址会根据一个“步长”进行跳转。
- CCNT (第三维,帧计数):代表有多少组这样的BCNT数组。这通常用于更复杂的、分帧的数据搬运。
手册中重点描述的源活跃寄存器集(Source Active Register Set)和目标FIFO寄存器集(Destination FIFO Register Set),就是EDMA控制器内部用于跟踪当前传输进度的两组影子寄存器。当用户通过“参数集”(Parameter Set)寄存器(通常以P开头,如PCNT,PSRC)配置好一次传输的所有参数并触发后,EDMA控制器会将这些参数拷贝到对应的“活跃集”或“FIFO集”中,并在传输过程中实时更新这些“活跃”寄存器,而用户配置的“参数集”则保持不变,便于重复使用。
2.2 关键寄存器详解与实战配置
我们挑几个手册里提到的关键寄存器,看看它们在实际配置中扮演什么角色。
2.2.1EDMA_TPTC_SACNTRLD(源活跃集计数重载寄存器)
- 地址偏移:
0x258 - 核心字段:
ACNTRLD(位[15:0]) - 它解决了什么问题:想象一下,你要用EDMA搬运一个
BCNT=10(10行) xACNT=256(每行256字节)的二维数据。当EDMA搬完第一行的256个字节(ACNT减到0)后,它需要开始搬第二行。此时,源地址和目标地址会根据BIDX(B维索引)跳转,同时,ACNT计数器需要被重置为初始值,以便开始新一行的传输。 ACNTRLD字段的作用,就是保存这个初始的ACNT值。每当一个“数组”(即一行)传输完毕,EDMA硬件会自动将ACNTRLD的值重新加载到活跃的ACNT计数器中。你只需要在参数集寄存器PCNT中设置好初始的ACNT,EDMA会在启动时自动将其拷贝到SACNTRLD和DFCNTRLD中。- 配置示例:假设我们要从ADC缓冲器搬运一个 chirp 的数据,每个 chirp 有 256 个复数采样点(I/Q各16位),共4个接收通道,数据以
int16_t格式非交错存储。那么,每个通道的数据量是256 采样点 * 2 (I/Q) * 2 字节 = 1024 字节。如果我们一次搬一个通道的数据,则设置ACNT = 1024。在代码中,我们配置的是PARAM_SET[ch].PCNT寄存器,其中的ACNT字段会被硬件自动拷贝到对应的SACNTRLD。
2.2.2EDMA_TPTC_SASRCBREF(源活跃集源地址B维参考寄存器)
- 地址偏移:
0x25C - 核心字段:
SADDRBREF(位[31:0]) - 它解决了什么问题:在二维传输中,我们需要知道当前正在传输的数组(行)的起始地址是什么,以及下一个数组的起始地址如何计算。
SADDRBREF寄存器保存的就是当前正在被读取的数组的起始源地址。它是一个只读寄存器,由EDMA硬件在传输过程中自动维护。下一个数组的起始地址,就是当前的SADDRBREF值加上SBIDX(源B维索引)的值。SBIDX定义了行与行之间的地址偏移。- 实战意义:在调试时,读取这个寄存器可以非常清楚地知道EDMA当前正在从内存的哪个位置读取数据,是定位传输错误(比如地址越界)的利器。
2.2.3EDMA_TPTC_DFOPT(目标FIFO集选项寄存器)
- 地址偏移:
0x300 - 核心字段:
TCINTEN,TCC,PRI,DAM,SAM - 这是配置的“大脑”:
TCINTEN(传输完成中断使能):置1后,当整个传输(TR)完成时,EDMA会触发一个中断通知CPU。对于ADC缓冲器的乒乓操作,这个中断至关重要,它通常用于通知CPU或DSP:“Pong缓冲区的数据已经搬完,可以处理了”,同时EDMA可以自动切换到下一个参数集去搬运Ping缓冲区的数据(通过链接功能)。TCC(传输完成码):一个6位的代码,用于标识是哪个传输完成了。当多个EDMA通道共用一个中断向量时,CPU可以通过查询中断挂起寄存器,根据TCC来判断是哪个通道触发了中断。PRI(优先级):0最高,7最低。当多个DMA请求同时到来时,高优先级的通道先被服务。通常,来自ADC这种实时性要求高的数据源,其EDMA通道应设置为高优先级。DAM/SAM(目标/源地址模式):这是EDMA的强大之处。除了普通的递增模式(INCR),还支持FIFO模式。- INCR模式:每传输一个元素,地址增加(增加量取决于元素大小)。
- FIFO模式:地址在一个固定大小的窗口内“环绕”。例如,
FWID设置为0x3(代表8字节FIFO宽度),SAM设置为FIFO模式。那么当源地址递增到窗口末尾时,会自动回到窗口起始地址。这常用于从硬件FIFO或ADC缓冲器这种具有固定入口地址的外设读取数据。在ADC缓冲器场景下,我们通常将源地址模式(SAM)设置为INCR(因为我们要顺序读取一片内存区域),而目标地址模式可能根据情况设置。
2.2.4EDMA_TPTC_DFCNT(目标FIFO集计数寄存器)
- 地址偏移:
0x308 - 核心字段:
BCNT(位[31:16]),ACNT(位[15:0]) - 这是传输的“进度条”:这两个字段是只读的,实时反映了当前传输任务剩余的
BCNT(还剩多少个数组)和ACNT(当前数组还剩多少个字节)。初始值从参数集的PCNT寄存器拷贝而来。每完成一次传输,它们会相应递减。当一次传输请求(TR)完成时,它们的值都应该为0。在调试时,观察这两个寄存器可以判断传输是否卡住或提前结束。
避坑指南:地址对齐与数据宽度EDMA对传输效率有严格要求。通常,源地址、目标地址、以及传输的字节数(ACNT)都建议按照数据总线宽度(例如128位/16字节)对齐。不对齐的传输虽然可能支持,但会引发多次非对齐访问,严重降低吞吐率。对于ADC的
int16_t数据,确保ACNT是2的倍数(元素大小),且整个传输块(ACNT * BCNT)也尽量是缓存行大小的倍数,以获得最佳性能。
3. ADC缓冲器:乒乓结构与数据流管理
ADC缓冲器是数据链路的第一个关键节点。它的设计直接决定了数据捕获的稳定性和实时性。
3.1 乒乓缓冲机制详解
手册中提到,ADC缓冲器是片上内存,被组织为乒乓缓冲(Ping-Pong Buffer),并带有ECC支持。这是一种典型的双缓冲策略:
- Ping缓冲区:用于接收当前ADC采样数据。
- Ping缓冲区:用于存储上一批已完成的ADC数据,等待EDMA搬走或DSP读取。
两个缓冲区大小相同(14xx为16KB,16xx/18xx为32KB)。一个名为Ping_Pong_Sel的信号控制数据写入哪个缓冲区。当Ping缓冲区写满(达到预设的采样点数或chirp数)后,Ping_Pong_Sel自动翻转,ADC数据开始写入Pong缓冲区,同时系统产生一个Chirp Available中断。这个中断正是触发EDMA从刚刚写满的Ping缓冲区搬运数据的完美时机。
3.2 工作模式与配置实战
ADC缓冲器支持三种写入模式,通过ADCBUFCFG1等寄存器配置。
3.2.1 单chirp模式(Single-Chirp Mode)
- 工作流程:每个FMCW chirp的数据写入一个缓冲区(Ping或Pong)后,立即产生Chirp Available中断,并切换
Ping_Pong_Sel。这是最常用的模式,数据以chirp为粒度进行缓冲和搬运。 - 配置要点:
ADCBUFCFG1.RX[3:0]EN:使能需要捕获的接收通道。ADCBUFCFG1.ADCBUFWRITEMODE:选择数据存储格式——交错(Interleaved)或非交错(Non-Interleaved)。交错格式是“采样点0的所有通道,采样点1的所有通道...”,而非交错格式是“通道0的所有采样点,通道1的所有采样点...”。非交错格式对后续的向量化DSP处理(如单指令多数据流SIMD)更友好。ADCBUFCFG1.ADCBUFREALONLYMODE:选择存储复数(I/Q)数据还是仅实数(I)数据。ADCBUFCFG4.ADCBUFNUMCHRPPING/PONG:在单chirp模式下,这两个寄存器通常都设置为1,表示每个缓冲区存储1个chirp。
3.2.2 多chirp模式(Multi-Chirp Mode)
- 工作流程:连续N个chirp的数据先存入Ping缓冲区,存满N个后,产生中断并切换到Pong缓冲区,继续存入后续的N个chirp。这减少了中断频率,适合批处理场景。
- 配置差异:主要在于
ADCBUFNUMCHRPPING和ADCBUFNUMCHRPPONG需要设置为大于1的值(例如4)。必须确保N个chirp的总数据量不超过一个缓冲区(Ping或Pong)的大小,否则会发生数据覆盖。
3.2.3 连续模式(Continuous Mode)
- 工作流程:用于发射单频连续波(CW)或测试模式。ADC缓冲器不再以chirp为边界,而是以固定的采样点数N为边界进行乒乓切换。
ADCBUFSAMPCNT寄存器配置这个N值。 - 应用场景:主要用于芯片功能测试、校准或特殊应用,常规雷达信号处理中较少使用。
3.3 数据格式解析:交错 vs. 非交错
这是影响后续处理效率的关键选择。手册中给出了详尽的图示,这里我用更直白的语言解释:
- 交错格式(Interleaved):内存布局像“编织”一样。例如,4通道复数模式,采样点0的存储顺序是:
Ch0_I, Ch0_Q, Ch1_I, Ch1_Q, Ch2_I, Ch2_Q, Ch3_I, Ch3_Q,然后是采样点1的同样顺序。这种格式适合需要同时访问所有通道同一采样点的算法,但不利于对单个通道进行连续的向量加载和运算。 - 非交错格式(Non-Interleaved):内存布局是“块状”的。先连续存储通道0的所有采样点(I0, Q0, I1, Q1, ...),然后是通道1的所有采样点,以此类推。这是DSP处理的黄金格式。因为DSP的加载指令(如C6000系列的
LDDW)可以一次性将多个连续的int16_t加载到寄存器对中,非常适合进行通道独立的FFT或滤波操作。
实操心得:数据格式的选择与EDMA配置的联动如果你选择了非交错格式,那么你的EDMA传输配置可能需要做相应的调整。例如,你想用EDMA把通道0的数据搬送到DSP的L2 SRAM进行处理。你的源地址(ADC缓冲器基地址)就是通道0数据的起始地址,ACNT就是这个通道一个chirp的数据总量。如果你想一次性搬运多个通道的数据到连续的内存区域,你可能需要配置EDMA进行二维传输(2D Transfer):ACNT设置为一个通道的数据量,BCNT设置为通道数,
SBIDX(源B维索引)设置为一个通道数据块的大小(即ACNT),DBIDX(目标B维索引)也设置为ACNT。这样,EDMA就能自动完成“搬完通道0,地址跳转到通道1的起始位置,继续搬”的操作。这种硬件级的自动化搬运,比用CPU循环调度高效得多。
4. EDMA与ADC缓冲器的协同实战:构建数据管道
理解了各自的工作原理后,我们来搭建一个完整的、从ADC采样到DSP处理的数据管道。这里以最常见的单chirp模式、非交错格式、4通道复数数据为例。
4.1 系统初始化与配置流程
配置ADC缓冲器:
- 设置
ADCBUFCFG1:使能RX0-3 (RX[3:0]EN=1),设置非交错模式 (ADCBUFWRITEMODE=0),设置复数模式 (ADCBUFREALONLYMODE=0)。 - 设置
ADCBUFCFG4:ADCBUFNUMCHRPPING = ADCBUFNUMCHRPPONG = 1。 - 计算缓冲区大小:每个chirp的采样点数 =
N。每个采样点 = 复数 (I/Q各16位) = 4字节。每个通道数据量 =N * 4字节。4个通道总数据量 =N * 4 * 4 = N * 16字节。必须确保这个值小于单个Ping/Pong缓冲区的大小(例如32KB)。
- 设置
配置EDMA参数集(以搬运Ping缓冲区数据为例):
- 参数集A (用于搬运Ping):
PAOPT: 使能传输完成中断(TCINTEN=1),设置合适的传输完成码(TCC),设置高优先级(PRI=0),源地址模式为递增(SAM=INCR),目标地址模式也为递增(DAM=INCR)。PASRC: 源起始地址 =ADC缓冲器Ping区域基地址(这是一个关键,需要从手册或内存映射表查得)。PADST: 目标起始地址 =DSP L2 SRAM中为处理数据预留的缓冲区地址。PACNT:ACNT = N * 4 * 2(N个复数采样点 * 4通道 * 2字节/样本?这里需要仔细计算)。实际上,对于非交错格式,我们通常一次只搬一个通道的数据,或者用二维传输搬所有通道。假设我们一次搬一个通道:ACNT = N * 4(字节) // N个复数点,每个点4字节BCNT = 4// 4个通道CCNT = 1// 单帧
PABIDX:SBIDX = N * 4(字节) // 源地址跳转:跳到下一个通道的起始处DBIDX = N * 4(字节) // 目标地址跳转:目标缓冲区也按通道连续存放
- 参数集B (用于搬运Pong):除了
PBSRC的源地址设置为ADC缓冲器Pong区域基地址,其他配置与参数集A完全相同。 - 设置链接(Linking):这是实现自动乒乓的关键。在参数集A的
PALNK字段中,填入参数集B的索引号。在参数集B的PBLNK字段中,填入参数集A的索引号。这样,当EDMA完成一次使用参数集A的传输后,会自动将参数集B加载为当前参数集,等待下一次触发。
- 参数集A (用于搬运Ping):
配置EDMA传输控制器(TPTC)与通道映射:
- 将上述参数集A关联到一个具体的EDMA通道。
- 将该EDMA通道的触发源(
TCC)映射到硬件触发事件,例如DSS_CBUFF_DMA_REQ_X(如果通过CBUFF触发),或者更直接地,映射到DSS_CHIRP_AVAIL_IRQ(ADC缓冲器产生的Chirp Available中断)。这样,每当一个缓冲区满,硬件事件会自动触发EDMA搬运数据。
4.2 数据流与中断处理流程
- 系统启动:ADC开始发射chirp并采样。
- 第一轮:ADC数据写入Ping缓冲区。写满后,
Ping_Pong_Sel切换,ADC开始写入Pong缓冲区,同时产生DSS_CHIRP_AVAIL_IRQ。 - EDMA触发:
DSS_CHIRP_AVAIL_IRQ触发关联的EDMA通道。EDMA控制器自动使用当前参数集(假设初始为A),从Ping缓冲区基地址(由PASRC定义)搬运数据到DSP L2 SRAM。 - 传输完成与链接:EDMA搬运完成,产生传输完成中断(因为
TCINTEN=1)。CPU/DSP的中断服务程序(ISR)被调用。关键点:在ISR中,我们不需要手动重新配置EDMA源地址!因为: a. 硬件在传输完成后,已自动根据PALNK的配置,将当前参数集从A切换到了B。 b. 此时,ADC正在向Pong缓冲区写入下一个chirp的数据。 - 第二轮:当Pong缓冲区写满,再次产生
DSS_CHIRP_AVAIL_IRQ,触发EDMA。此时EDMA自动使用参数集B,从Pong缓冲区基地址(由PBSRC定义)搬运数据。搬运完成后,再次触发中断,并自动通过PBLNK链接回参数集A。 - 循环往复:如此,参数集A和B随着Ping/Pong缓冲区的切换而交替使用,实现了全硬件的、无CPU干预的“搬运-处理”流水线。CPU的ISR只需要在每次传输完成后,去处理L2 SRAM中已经就绪的上一个chirp的数据即可。
4.3 通过CBUFF进行数据转发
手册后半部分提到了CBUFF(通用缓冲控制器)。它的角色是一个更高级的“数据调度员”。在更复杂的系统中,ADC数据可能不是直接给DSP,而是要通过高速接口(如LVDS或CSI-2)发送到外部。
- CBUFF的作用:它位于EDMA和高速接口(HSI)之间。EDMA把数据(来自ADC缓冲器或其他源)写入CBUFF的内部FIFO,CBUFF负责将数据打包、格式化,然后通过LVDS或CSI-2控制器发送出去。
- 与EDMA的协作:CBUFF可以产生DMA请求(
DSS_CBUFF_DMA_REQ_[6:0])。我们可以配置一个EDMA通道,其触发源是CBUFF的请求。当CBUFF的FIFO有空间时,它就请求EDMA搬数据过来。这样,EDMA负责从ADC缓冲器到CBUFF的搬运,CBUFF负责对外发送。 - 链接列表(Linklist):CBUFF支持链接列表配置,允许将来自不同源(如ADC数据、雷达参数、安全监控数据)的数据,组合成一个完整的数据包(Packet)或帧(Frame)发送出去。这体现了EDMA-CBUFF-HSI这套数据路径的高度灵活性和可编程性。
5. 常见问题、调试技巧与避坑指南
在实际项目中,配置这套流程总会遇到各种问题。下面是我踩过的一些坑和总结的调试方法。
5.1 传输数据错位或丢失
- 症状:DSP处理的数据全是噪声,或者数据顺序混乱。
- 排查思路:
- 核对地址:首先确认
PASRC/PBSRC设置的ADC缓冲器基地址是否正确。Ping和Pong的地址偏移通常是缓冲区大小(如32KB)。一个低级但常见的错误是地址算错或写错。 - 核对数据尺寸:重新计算
ACNT。确保它等于采样点数 * 通道数 * 每样本字节数。对于非交错格式,如果你配置的是二维传输(BCNT>1),要确保SBIDX和DBIDX设置正确,它们应该等于一个通道的数据总量。 - 检查ADC缓冲器配置:确认
ADCBUFWRITEMODE(交错/非交错)与EDMA搬运时的预期内存布局完全匹配。如果ADC输出交错格式,但EDMA按非交错格式的地址去读,数据必然错乱。 - 使用内存查看工具:在CCS(Code Composer Studio)中,在传输前后分别查看ADC缓冲器(源)和L2 SRAM(目标)的内存内容。直接对比原始数据是否一致。
- 核对地址:首先确认
5.2 EDMA传输未启动或未完成
- 症状:中断一直没产生,目标内存区域全是0或旧数据。
- 排查思路:
- 确认触发事件:检查EDMA通道的触发源映射寄存器(
DMAQNUM等),确保已正确映射到DSS_CHIRP_AVAIL_IRQ或CBUFF的DMA请求信号。 - 手动触发测试:在初始化完成后,尝试通过软件写触发寄存器(
ESR)来手动启动一次EDMA传输。如果手动可以,但硬件触发不行,问题就在触发事件链路或同步上。 - 检查传输完成状态:读取EDMA传输控制器(TPTC)的中断挂起寄存器(
IPR)和通道使能寄存器(EER)。看看中断是否被挂起但未被处理,或者通道是否未被使能。 - 监视“活跃”寄存器:在调试器中,实时监视
EDMA_TPTC_DFCNT寄存器。如果传输卡住,BCNT和ACNT的值会停滞在非零值。同时监视EDMA_TPTC_SASRCBREF,看源地址是否在按预期递增。
- 确认触发事件:检查EDMA通道的触发源映射寄存器(
5.3 中断风暴或丢失中断
- 症状:系统卡死在中断服务程序,或者偶尔丢失一帧数据。
- 排查思路:
- 清除中断标志:确保在EDMA传输完成中断服务程序(ISR)中,第一时间读取并清除相应的中断标志(通常写1到
ICR寄存器的对应位)。如果清除太晚,可能刚清除又立刻产生了新的中断。 - 中断优先级:确保EDMA传输中断的优先级设置合理,不会被其他长时间执行的中断(如软件定时器)阻塞。
- 缓冲区溢出:这是最严重的问题。检查DSP处理一个chirp数据的时间,是否严格小于ADC采集一个chirp的时间。如果处理更慢,EDMA很快就会把数据搬到已满的目标缓冲区,导致数据被覆盖。必须进行最坏情况执行时间(WCET)分析,确保处理流水线不会“堵车”。如果处理不过来,要么优化算法,要么降低ADC采样率,要么增加缓冲区数量(如果支持更多缓冲块)。
- 清除中断标志:确保在EDMA传输完成中断服务程序(ISR)中,第一时间读取并清除相应的中断标志(通常写1到
5.4 性能优化技巧
- 利用EDMA链接实现零开销切换:如前所述,务必使用参数集链接(Linking)功能来实现Ping-Pong缓冲区的自动切换。避免在ISR中重新配置EDMA参数,那会引入不可预测的软件延迟。
- 合理使用二维传输:对于非交错的多通道数据,使用二维传输(配置
BCNT和BIDX)让EDMA一次性搬完所有通道,比用CPU循环调用多个一维传输效率高一个数量级。 - 对齐,对齐,再对齐:确保源地址、目标地址、传输字节数(ACNT)都按照芯片架构推荐的对齐方式(通常是128位或64位边界)对齐。不对齐的访问性能损失可能高达70%。
- 缓存一致性:如果目标地址(如L2 SRAM)被CPU带缓存访问,在EDMA写入数据后,CPU读取前,必须执行缓存无效化(Cache Invalidate)操作,否则CPU读到的可能是缓存里的旧数据。对于C6000 DSP,使用
L2_cache_inv或L1D_cache_inv函数。 - 使用EDMA完成码(TCC)进行流控:在更复杂的多级处理流水线中,可以配置多个EDMA通道,用前一个通道的传输完成码(TCC)作为后一个通道的触发事件,实现硬件级的数据流同步,进一步减轻CPU负担。
调试这种硬实时数据流,逻辑分析仪或芯片的嵌入式跟踪模块(ETM)是终极武器。它们可以帮你捕获中断信号、DMA请求信号、地址总线、数据总线的精确时序,直观地看到数据流在哪里停滞,中断是否如期发生。当你把EDMA和ADC缓冲器这套机制调通,看着数据像流水一样自动、高效地在芯片内流动时,那种成就感是对嵌入式工程师最好的奖赏。这套架构是TI高性能DSP平台的精髓,吃透了它,你就能驾驭从简单数据采集到复杂雷达信号处理的各种挑战。
