增强管道数据流转(EPDR)技术的设计局限和替代

在前文中,我们介绍了EPDR技术的起源,以及使用该技术驱动的业余软件无线电平台专栏。已有玩家通过踩坑证明,进程管道交换数据时间延迟大,构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度,否则很难在期望的时刻执行正确的动作。典型的系统包括:

  1. 带有 TDMA 收发同步的通信系统
  2. 超过20MHz采样率的CPU算法程序
  3. 驱动X310等超宽带采样

为了不给读者造成困扰和不必要的尝试,通过此文明确这个技术以及相应平台的局限,并给出可能满足上述需求的解决构想。

1 EPDR设计理念

EPDR based taskBus的设计初衷是为了用跨进程的方式黏合不同开发工具开发的程序,以解决一些灵活性和学习曲线不可兼得的问题。在开发之初,它甚至不是一个用于业余SDR的平台,而是用于矿脉勘探传感器数据处理等弱实时性的领域。

设计理念参考这个文档。需要强调的是,尽管taskBus看起来类似一些图标拖拽的产品,实际上它既不是GNU-Radio、Pothos Flow,也不是Simulink、Labview——taskBus的理想颗粒度更大。举例子,对于一个仿真通信系统,在模块里实现到什么颗粒度,是有讲究的。有的工具,可能一个滤波器、1个加法器就弄了1个模块,而taskBus希望颗粒度略大一些,这样便于优化模块内性能,并降低管道IO。

以simulink的QPSK理想范例为例,如果使用taskBus实现功能,典型的划分是下图的7个模块,而不是30个Blockset。

7 simu  task
上图底图来自网络搜索。

  • 模块1 完成调制仿真,包含simulink中的13个Blockset。
  • 模块2 完成解调仿真, 包含simulink中的12个Blockset。
  • 模块3\4\5\6完成显示、数据生成等工作,与Simulink粒度一致。

2 管道实时性短板

taskBus设计时,希望通过管道跨进程共享的工具主要包括文件、影音、GUI绘图、串口、键鼠、数据库等通用非实时模块。有了这些模块,强实时性的独立进程就只用负责算法,无需了解更多的知识。在设计场景中,1个实验小组由3-4个人组成,独立的用自己喜欢的程序构造紧耦合模块,所有的实时性都在模块内解决。换句话说:taskBus 不支持强实时算法的复用,TDMA的发射、接收同步需要紧耦合写在一起。

对弱实时性的应用,比如听广播、对讲机,典型的颗粒度类似基于taskBus的通信课程里的范例。在这些范例里,对一个教学QPSK的波形处理、信道处理是两个不同的模块,允许不同波形和纠错之间进行组合。即使是弱实时应用,一个模块内还是包含很多步骤。比如DDC、下抽、插值等等。这些步骤是用C语言紧耦合在一起的,并没有分开。

对强实时性的应用,比如TDMA在毫秒级别对准时间,使用管道是不切实际的。一个事件循环以及跨进程的流转缓存所经历的延迟,基本在10毫秒级别,且受到操作系统当前状态的影响,并不稳定。经过现场测试,在后台弹出某杀毒软件升级信息时,整体延迟高达500ms以上。这是因为虽然模块可以采用fflush(stdout)确保进程出口的延迟小,但管道数据进入操作系统后,就不受控制。如果采用Linux的实时内核,情况会有改观,但在大吞吐下,依旧存在问题。

stdout
stdin
进程1
操作系统内核
进程2

3 替代方案

  1. 采用传统的单进程大颗粒度设计,以协议栈的粒度实现重用。如1个进程完成整体的GSM协议栈,只是话筒、声卡、波形质量指示等信息通过管道输出。至于协议栈内的各级处理算法,还是传统的紧耦合设计。
  2. 采用基于UDP等即时协议的通信协议,或者中间件。典型的包括UDP套接字、The enhanced Communication Abstraction Layer (eCAL)等。但在通用OS下,还是会遇到丢包的问题。
  3. 采用FPGA而非通用CPU进行开发。FPGA的上位机(PC端)程序可以兼容taskBus,作为模块嵌入。代价是学习和培训成本高。

4. 非计算机团队黏合最佳策略

非计算机专业教研的黏合是一个非常具有挑战性的问题。这些困难包括:

  1. 团队中的核心不具备完整的计算机知识,可能只熟悉1个开发工具的一小部分,并无法独立完成调试。
  2. 团队成员掌握的知识链条差异很大,开发能力交集小,交流中无法Get到彼此的关键点。一些新进的硕士在学校内只学过C语言且只会写Hello world。一些博士几乎不具备基础的命令行能力。
  3. 团队成员价值主要靠论文、毕业答辩来体现,学习开发技术的动力不足,也不愿意涉足新的非相关知识领域。
  4. 团队的成员更替频繁,可能1个博士没干满3年就毕业了,硕士更短。

目前看来,对于这样的情况,代码集成+消息队列是最佳选择。这些年探索DLL、COM、Qt插件、EPDR(taskBus)、eCAL、Kafka等特定技术链条建立规范的努力并没有白费,这些尝试显著开拓了视野、增长了见识。未来taskBus将继续作为业余SDR小众平台开发下去,并逐步加入一些好玩的功能。

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

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

相关文章

Openstack 与 Ceph集群搭建(中): Ceph部署

文章目录 一、部署前说明1. ceph 版本选择依据2. ceph网络要求3. 硬件要求 二、部署架构三、部署过程1. 通用步骤2. 部署管理节点创建账号安装Cephadm运行bootstrap 3. 登录Ceph web4. 将其他节点加入集群同步ceph key安装ceph CLI命令行添加主机节点到集群添加OSD节点将监控节…

【Canvas与艺术】环形橄榄枝纹饰

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形橄榄枝(draft2)</title><style type"text/css&quo…

安卓蓝牙日志的获取方法

有过蓝牙调试经历的同学们可能都知道&#xff0c;在安卓系统中&#xff0c;在手机的设置–>开发人员页面下有一个开启蓝牙HCI信息收集日志选项开关&#xff0c;如下图中标红处&#xff0c; 打开该开关&#xff0c;就可以收集本机发送和接收的蓝牙HCI包。蓝牙包的数据会保存在…

git提交本地项目到远程仓库

1、查看项目目录&#xff0c;是否存在.git文件夹&#xff08;若存在则删除&#xff09; 2、登录git并新建一个空白项目 3、idea创建本地git仓库&#xff08;选择本地项目&#xff09; 4、添加要提交的项目&#xff08;项目右键&#xff09; 5、提交代码到本地仓库 6、配置远程…

轻松实现微服务间的无缝通信:OpenFeign入门指南

OpenFeign 前言1、导入依赖2、开启feign调用3、编写OpenFeign客户端4、Fegin接口实现5、Feign接口调用 前言 Spring Cloud OpenFeign是一种基于Spring Cloud的声明式REST客户端&#xff0c;它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口&#xff0c;并且…

css 宫格样式内容上下结构

结构 <div class"sc-content-group"><div class"sc-content-item"><div class"sc-item-img"><el-image :src"src" :preview-src-list"[src]"></el-image></div><div class"s…

datax关于postsql数据增量迁移的问题

看官方文档是不支持的 数据源及同步方案_大数据开发治理平台 DataWorks(DataWorks)-阿里云帮助中心 (aliyun.com) 看了下源码有个postsqlwriter 看了下也就拼接sql 将 PostgresqlWriter中的不允许更新先注释了 让他过去先 然后看到 WriterUtil中的对应方法 getWriteTemplat…

咸鱼之王手游内购修复无bug运营版联网架设+后台

今天给大家带来一款单机游戏的架设&#xff1a;咸鱼之王手游。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整可…

【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分

目录 一、做题心得 二、题目与题解 题目一&#xff1a;322. 零钱兑换 题目链接 题解&#xff1a;动态规划--完全背包 题目二&#xff1a; 279.完全平方数 题目链接 题解&#xff1a;动态规划--完全背包 题目三&#xff1a;139.单词拆分 题目链接 题解&#xff1a;动…

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

你是如何更精准地指引模型,激发其无尽的创造力?

随着大型语言模型日益凸显其重要性&#xff0c;发掘并充分利用它们的潜力&#xff0c;很大程度上依赖于我们如何巧妙构思和构造指令——即Prompt的精炼艺术。优化Prompt撰写技巧&#xff0c;将能够更好地引导大模型&#xff0c;为各类应用场景生成高质量的文本输出。分享出你的…

【STM32】C语言基础补充

学习过程中发现自己好些需要用到的C语言语法、特征都不太熟练了&#xff0c;特意记录一下&#xff0c;免得忘记了&#xff0c;以后遇到了新的也会继续更新 目录 1 全局变量 2 结构体 3 静态变量 4 memset()函数 5 使用8位的存储器存16位的数 1 全局变量…

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑&#xff0c;提示如下&#xff0c;但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件&#xff1b; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…

Keil C51 插件 快速复制一行

此插件解决的问题 目前 Keil 软件 只可以 先选中一行&#xff0c;再Ctrl C Ctrl V , 太麻烦了 Keil 插件 -- Python 代码 import sys# 插入当前行内容 def insert_line(current_file_path, line_number):line_to_insert # 读取文件内容with open(current_file_path, r, enc…

微信小游戏授权问题

微信小程序获取用户相关信息的接口&#xff0c;如wx.getUserCloudStorage&#xff0c;报错&#xff1a;please go to mp to announce your privacy usage。 需要在微信公众平台设置用户隐私保护。

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程

OpenDDS中,实现了Rtps_Udp传输协议(非纯udp)的可靠性传输。传输的线程包括: 1)发送方线程主要线程和定时器 《1》应用线程 《2》网络异步发送线程 《3》Heartbeat定时器 《4》Nak_response定时器 2)接收方主要线程和定时器 《1》网络异步接收线程 《2》heartbeat_respons…

Ubuntu 16.04 通过deb包安装内核头文件

文章目录 前言通过deb包安装内核头文件 前言 Ubuntu16.04部分内核版本无法通过 apt-get install linux-headers-$(uname -r) 来进行安装&#xff1a; # cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE16.04 DISTRIB_CODENAMExenial DISTRIB_DESCRIPTION"Ubuntu…

汇编

汇编指令 随机数mov指令mov指令ldr指令&#xff08;伪指令&#xff09;add指令sub指令bic指令orr指令b指令cmp指令stmfd指令ldmfd指令import栈汇编指令的s后缀 随机数 1.如果某个数的数值范围是0~255之间&#xff0c;那么这个数一定是立即数&#xff1b; 2.把某个数展开成2进制…

网络工程师必备10个Linux网络命令,超好用

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友 掌握正确的工具对于提升工作效率的重要性不言而喻&#xff0c;尤其在网络工程领域&#xff0c;这一点更是至关重…