雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标,它代表了雷达探测识别的速度,速度越快,后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度,提供了一种合理利用片上资源提高探测识别速度的常用方法,然后又根据不同芯片平台资源情况,提供了两种嵌入式软件能够提高有效帧频率的两种方法,为各位读者在类似的工作中提供一些思路。

目录

利用DMA实现乒乓操作

设计步骤与注意事项

软件流程图与代码

瓶颈优化策略


利用DMA实现乒乓操作

“乒乓操作”是一种典型的用空间换时间操作,它本身并不能弥补高速数据流与低速计算单元之间的矛盾,高速数据流还是要“等待”低速运算完成,但是“乒乓操作”给高速数据流提供了两条独立的数据存储的链路,使得运算单元能够提前起跑,降低了整个链路的时间。

在雷达编程中这种乒乓操作实现在高速ADC采样和FFT运算之间,这里读者可以把DMA想象成一个专用的核心,它的功能仅仅是对数据进行搬运。DMA通常用于将数据传输到一个缓冲器,同时 CPU使用另一个缓冲器进行FFT运算。如下图所示,蓝色路径显示 DMA 将数据传输到缓冲区 1,CPU 从缓冲区 2 获取数据。当路径切换时,DMA 将数据传输到缓冲区 2,CPU 从 缓冲区 1 获取数据。这种技术的好处是整个应用程序的运行时更短,因为 CPU 在任何时候都可以自由地对一部分 数据进行操作。在该示例中,ADC 配置为单次转换模式,DMA 和 CPU 将在每次转换后在缓冲区之间切换。


设计步骤与注意事项

设计步骤如下:

  1. 根据给定的模拟输入和设计要求确定 ADC 的配置,包括基准源、基准值、分辨率和采样率。
  2. 生成 2 个数组缓冲区来存储 ADC 数据并将缓冲区大小和 DMA 传输大小设置为相同,以便 DMA 填充整个缓 冲区。
  3. 根据步骤 1 中的工程要求在 SysConfig 中配置 ADC。
  4. 在 SysConfig 中,在 ADC 部分中配置 DMA。
  5. 编写应用程序代码以动态更改 DMA 的目标地址,从而在两个缓冲区之间交替。

设计要注意的事项如下:

  1. 最大采样速度:ADC 的采样速度基于输入信号频率、模拟前端、滤波器或任何其他影响采样的设计参数。
  2. ADC 基准:选择与预期最大输入保持一致的基准,以利用 ADC 的满量程范围。
  3. 点击“Settings”:时钟源决定了转换的总时间。时钟分频器与 SCOMP 设置一起决定总采样时间。 SysConfig 根据采样时间设置来设置相应的 SCOMP。

软件流程图与代码

软件流程图如下:

Ti实现代码如下,用户可以根据注释获得这种“乒乓操作”更直观的认识。 

/** Copyright (c) 2021, Texas Instruments Incorporated* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** *  Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.** *  Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.** *  Neither the name of Texas Instruments Incorporated nor the names of*    its contributors may be used to endorse or promote products derived*    from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/#include "ti_msp_dl_config.h"#define ADC_SAMPLE_SIZE (64)/* When FIFO is enabled 2 samples are compacted in a single word */
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE / 2)uint16_t gADCSamplesPing[ADC_SAMPLE_SIZE];
uint16_t gADCSamplesPong[ADC_SAMPLE_SIZE];volatile bool gCheckADC;int main(void) {uint16_t maxReading;bool ping = true;uint16_t *ADCSamplesCurrDataPtr;SYSCFG_DL_init();/* Configure DMA source, destination and size */DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t)DL_ADC12_getFIFOAddress(ADC12_0_INST));DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPing[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);/* Setup interrupts on device */NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);gCheckADC = false;DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);while (1) {while (false == gCheckADC) {__WFE();}// Breakpoint here to check the buffers and watch the ping pong operation.// The data should be alternating between each buffer.__BKPT(0);if (ping) { // Switch to pongADCSamplesCurrDataPtr = gADCSamplesPing;DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPong[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);gCheckADC = false;ping = false;DL_ADC12_enableDMA(ADC12_0_INST);DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);} else { // Switch to PingADCSamplesCurrDataPtr = gADCSamplesPong;DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPing[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);gCheckADC = false;ping = true;DL_ADC12_enableDMA(ADC12_0_INST);DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);}}
}void ADC12_0_INST_IRQHandler(void) {switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {case DL_ADC12_IIDX_DMA_DONE:gCheckADC = true;break;default:break;}
}

瓶颈优化策略

整个雷达工作周期的瓶颈,来自一头一尾:头调频连续波到ADC回波采样的射频模拟部分,尾是从点云到航迹目标的数据处理部分。针对这个头,可以针对产品情景进行一些包括调频时长等相关参数的调整来达到帧周期的缩短,这部分我就不赘述了,感兴趣的朋友可以从《雷达编程实战之功耗优化技术(低功耗)》文章中寻求到方法,而这篇文章主要针对这个数据处理的尾巴来讲一下两个优化的策略,而这两个优化策略主要针对两种不同平台资源的情况进行选择。

首先如果我们的芯片平台存在多个DSP核心以及ARM核心,那么我们完全可以合理分配计算资源,达到理论上最快的帧频率,下面是几点分配的原则。

  • 有一个DSP核心很可能承担了信号处理流程的计算工作,然而另一个DSP核心可以与此核心配合,完成多条信号处理链路同时进行,进一步提高点云信息的丰富/置信度,数据处理也可以单独拎出一个DSP核来处理,核间可以通过操作系统提供的Message实现同步,共享RAM进行合理分区,利用标志位标识RAM区当前状态,设计时应尽可能压榨核心等待时间。
  • ARM处理大部分外设控制以及基础软件涉及的业务逻辑与协议栈实现,保证系统正常运行。

如果我们芯片平台仅仅存在一个DSP核心和一个ARM核心,那么我们就需要为整体的产品性能来考虑一些事情了。依然有一个DSP核心承担了信号处理流程的计算工作,而且很有可能它已经没有多余的RAM空间来进行别的计算了,芯片本身很可能在设计之初就没有考虑要进行数据处理(直接出点云给域控制器),而如果我们要硬上(毕竟要做一些数据处理算法来当作研发亮点),那就只可能放在ARM来跑,不过很可惜,这个方案是个陷阱,下面我来介绍一种在这种平台跑算法的方案。

  • 信号处理链路有很多涉及到了硬核的运算,我们可以合理利用硬核的中断,来动态分配任务的优先级。首先我们预存一帧A的点云数据,然后继续进行下一帧B的信号处理流程,在DSP等待硬核处理的间隙,动态提高数据处理任务优先级,并启动调度,数据处理任务拿到DSP资源之后进行A点云数据进行处理,当硬核处理完成之后,进入硬核中断函数,降低数据处理任务优先级,执行上下文切换之后,将DSP核心重新交回信号处理流程。当最终DSP核完成信号处理流程之后,通过Mailbox将当前信号处理以及数据处理流程信息传递给ARM核心。
  • ARM核心做策略判断,如果数据处理没有做完,根据传递过来的信息来综合判断是否由ARM核继续执行剩余算法,如果不执行则Mailbox回传信息暂停信号处理流程,进行数据处理直至完成。

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148340.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vertx的学习总结6

Beyond the event bus 一、章节覆盖: 如何在事件总线之上公开服务 verticles和事件总线服务的异步测试 动态代理: MyService 接口 package porxy.test;import io.vertx.codegen.annotations.ProxyGen;ProxyGen public interface MyService {void he…

Neo4j最新安装教程(图文版)

目录 一、软件介绍 二、下载软件 1、官方下载 2、云盘下载 三、安装教程 1、首先配置Neo4j的环境变量 2、启动neo4j服务器 3、访问界面 一、软件介绍 官网地址:https://neo4j.com/ Neo4j是一个高性能、可扩展的图数据库管理系统。它专注于存储、查询和处理大…

1.6 计算机网络的性能

思维导图: 1.6.1 计算机网络的性能指标 前言: 我的理解: 这段前言主要介绍了关于计算机网络性能的两个方面的讨论。首先,计算机网络的性能可以通过一些重要的性能指标来衡量。但除了这些指标之外,还有一些非性能特征…

JAVA学习(4)-全网最详细~

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

Flutter开发之Package与Plugin

前言 在flutter中有包和插件两个概念,插件 (plugin) 是 package 的一种,全称是 plugin package,我们简称为 plugin,中文叫插件。包(Package)主要指对flutter相关功能的封装,类似于Android中的插件和iOS中的三方库。而插…

CUDA+cuDNN+TensorRT 配置避坑指南

深度学习模型加速部署的环境配置,需要在本地安装NVIDIA的一些工具链和软件包,这是一个些许繁琐的过程,而且一步错,步步错。笔者将会根据自己的经验来提供建议,减少踩坑几率。当然可以完全按照官方教程操作,…

插入排序:简单而有效的排序方法

在计算机科学中,排序算法是一个重要且常见的主题,它们用于对数据进行有序排列。插入排序(Insertion Sort)是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤,并提供Java语言的实现示例。 插入排序的…

B2主题优化:WordPress文章每次访问随机增加访问量

老站长都知道,一个新站刚开始创建,内容也不多的时候,用户进来看到文章浏览量要么是0,要么是 个位数,非常影响体验,就会有一种“这个网站没人气,看来不行”的感觉。 即使你的内容做的很好&#x…

全志ARM926 Melis2.0系统的开发指引②

全志ARM926 Melis2.0系统的开发指引② 编写目的4. 编译工具链使用4.1.工具链通用配置4.2.模块的工具链配置4.3.简单的 makefile 5. 固件烧录工具的安装5.1.PhoenixSuit 的安装步骤5.2.检验 USB 驱动安装5.3.使用烧录软件 PhoenixSuit -全志相关工具和资源-.1 全志固件镜像修改工…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

Boost程序库完全开发指南:1.2-C++基础知识点梳理

主要整理了N多年前&#xff08;2010年&#xff09;学习C的时候开始总结的知识点&#xff0c;好长时间不写C代码了&#xff0c;现在LLM量化和推理需要重新学习C编程&#xff0c;看来出来混迟早要还的。 1.const_cast <new_type> (expression)[1] 解析&#xff1a;const_c…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

mysql双主+双从集群连接模式

架构图&#xff1a; 详细内容参考&#xff1a; 结果展示&#xff1a; 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…

【学习笔记】CF1817F Entangled Substrings(基本子串结构)

前置知识&#xff1a;基本子串结构&#xff0c;SAM的结构和应用 学长博客 字符串理论比较抽象&#xff0c;建议直观的去理解它 子串 t t t的扩展串定义为 ext(t) : t ′ \text{ext(t)}:t ext(t):t′&#xff0c;满足 t t t是 t ′ t t′的子串&#xff0c;且 occ(t) occ(t…

水浒传数据集汇总

很喜欢《水浒传》&#xff0c;希望能将它融入我的考研复习中&#xff0c;打算用水浒传数据来贯穿数据结构的各种知识&#xff0c;先汇总下找到的数据集 天池上看到的一个水浒传文本数据集&#xff1a;https://tianchi.aliyun.com/dataset/36027 Hareric/masterworkNLP: 基于社…

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始&#xff0c;Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的&#xff0c;并推荐使用新的 Java API Client&#xff0c;即 ElasticsearchClient. 为什么要将 RestHighLevelC…

【C语言】内存函数的详细教学和模拟实现

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是gugugu。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f194;本文由 gugugu 原创 CSDN首发&#x1f412; 如需转载还请通知⚠…

【再识C进阶4】详细介绍自定义类型——结构体、枚举和联合

学习目标&#xff1a; 在上一篇博客中&#xff0c;我们已经详细地学习了字符分类函数、字符转换函数和内存函数。那这一篇博客和上一篇博客的关系不是那么相连。 这一篇博客主要介绍一下自定义类型&#xff0c;因为在解决实际问题时&#xff0c;由于世界上的因素有很多&#xf…

karmada v1.7.0安装指导

前言 安装心得 经过多种方式操作&#xff0c;发现二进制方法安装太复杂&#xff0c;证书生成及其手工操作太多了&#xff0c;没有安装成功&#xff1b;helm方式的安装&#xff0c;v1.7.0的chart包执行安装会报错&#xff0c;手工修复了报错并修改了镜像地址&#xff0c;还是各…