上位机图像处理和嵌入式模块部署(树莓派4b实现多进程通信)

news2024/11/16 15:38:19

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        和mcu固件、上位机软件不太一样的地方,嵌入式设备上面上面的工业软件一般都是多进程的形式。相比较多线程而言,整个系统就不会因为一个线程的bug造成崩溃,这也是大多数工业、军工和医疗系统采用多进程的原因。此外,工业嵌入式软件一般由不同的部门、不同的人员开发,彼此之间用多进程开发,也方便升级、调试和管理。只要大家都按照一定的形式和接口去开发和编程就可以了,相互之间没有约束。

1、多进程通信的思路

        既然是多进程开发,那么会势必涉及到通信的问题。默认情况我们一般是这么做的,所有的进程当中,有一个核心程序,它最重要的工作是负责不同进程之间的消息传递。这样的话,每一个进程自己有哪些消息要发布,有哪些消息要订阅,这些都是一清二楚的。对于核心程序来说,它的工作就是把那些发布的消息,转到订阅的进程上面。因此,这个核心程序的稳定性要求就特别高。

        下面就举例说明一种基于共享内存的通信方式,用boost实现,直接输入g++ shared.cpp -g -o shared && ./shared即可。

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>

using namespace boost::interprocess;

int main()
{
    try {
        // 创建共享内存对象,如果不存在则创建,如果存在则打开
        shared_memory_object shm_obj(open_or_create, "MySharedMemory", read_write);

        // 设置共享内存大小为1000字节
        shm_obj.truncate(1000);

        // 映射共享内存到当前进程的地址空间
        mapped_region region(shm_obj, read_write);

        // 获取共享内存的起始地址
        void* addr = region.get_address();

        // 在共享内存中写入数据
        std::strcpy(static_cast<char*>(addr), "Hello, shared memory!");

        // 从共享内存中读取数据
        std::cout << "Message read from shared memory: " << static_cast<const char*>(addr) << std::endl;

        // 删除共享内存对象
        shared_memory_object::remove("MySharedMemory");
    }
    catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

2、同步和异步

        既然是通信,那么就涉及到同步和异步的请求。这里,我们就先说一下异步请求。所谓的异步请求,就是subscribe和publish之间都是异步展开的。什么时候publish出去、什么时候subscribe拿到数据,这些都是分开来的。而同步请求,一般一个进程主要给另外一个进程发起请求,这个时候不拿到结果,发送请求的进程是不会退出的,会一直阻塞在那里。

        当然,鉴于核心程序稳定性的考虑,同步通信中的阻塞和唤醒的操作最好做成sdk,在各个程序侧来完成,这样是比较合理的。

3、调试和调优

        多进程通信的开发模式还有一个好处,那就是调试和调优。一个软件如果涉及了太多的模块,那么开发稳定性肯定是会受到影响的,并且调试、调优也不方便的。但是一旦分开来了,大家关心的就是自己的数据什么时候拿到、什么时候送出去,程序崩溃了也是自己的事情,责任上面划分得很清楚。

        至于说调优,那也变得简单了。我们开发一个功能,从拿到数据到送出结果,每一个步骤都可以加上时间戳,这样有了这个事件戳,哪部分花费的时间最长,基本上也就一目了然了。

4、通信方式的实现

        不同进程之间的通信实现方式有很多,比如说pipe、共享内存、网络等等。个人其实是比较推荐网络的实现方式。之前,我们编写网络通信的时候,其实主要是为了实现不同pc、server之间的通信。但是如果ip设置成127.0.0.1,这个时候其实是可以实现一台pc上不同process之间进行通信的。实现也比较方便。虽然中间可能会涉及到数据的copy和处理,但是整体上还是比较可控的。如果对于数据转发有很高的性能要求,这个时候就只能进行指针的传递了。

5、关于多进程通信的另外一个选择ros

        ros,全称robot operating system。本身它其实不是一个操作系统,只是一个框架。只不过这个框架上面有很多的算法、很多的工具、还有一些别人搭建好的开发平台,个人不需要从0到1开始开发。所以用ros实现不同进程之间的通信也是很好的一个选择。要说缺点的话,就是ros安装稍微麻烦了一点,占用空间稍微多了一点。当然,现在的ros已经变成了一个生态,很多的开发板,比如说像树莓派4b这样的开发板就支持ros的开发和运行。这样的话,开发者可以专心地把重点放到驱动、业务和算法的开发上面了。

        有兴趣的同学,可以先在自己的pc电脑上安装一个ubuntu虚拟机,看看ubuntu上面是如何安装和使用ros系统的。

https://feixiaoxing.blog.csdn.net/article/details/132789849

6、多进程通信的开发输出

        因此,通过以上的分析,我们也知道一个多进程开发的系统,至少应该有一个core调度程序,还有一个sdk。sdk里面有消息的注册、回调、服务的注册、回调这四个基本功能。

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

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

相关文章

springcloudgateway集成knife4j

上篇我们聊聊springboot是怎么继承knife4j的。springboot3 集成knife4j-CSDN博客 本次我们一起学习springcloudgateway集成knife4j。 环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 knife4j &#xff1a; 4.4.0 引入maven配置…

# 从浅入深 学习 SpringCloud 微服务架构(四)Ribbon

从浅入深 学习 SpringCloud 微服务架构&#xff08;四&#xff09;Ribbon 段子手168 一、ribbon 概述以及基于 ribbon 的远程调用。 1、ribbon 概述&#xff1a; Ribbon 是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。 在 SpringCloud 中 Eureka …

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

用python selenium实现短视频一键推送

https://github.com/coolEphemeroptera/VIVI 效果如下 demo 支持youtube视频搬运

iPerf 3 测试UDP和TCP方法详解

文章目录 前言一、What is iPerf / iPerf3 ?二、功能1. TCP and SCTP2. UDP3. 其他 三、 Iperf的使用1.Iperf的工作模式2. 通用指令3. 服务端特有选项4. 客户端特有选项5. -t -n参数联系 四、Iperf使用实例1. 调整 TCP 连接1. 1TCP 窗口大小调节1. 2 最大传输单元 (MTU)调整 2…

【python项目推荐】键盘监控--统计打字频率

原文&#xff1a;https://greptime.com/blogs/2024-03-19-keyboard-monitoring 代码&#xff1a;https://github.com/GreptimeTeam/demo-scene/tree/main/keyboard-monitor 项目简介 该项目实现了打字频率统计及可视化功能。 主要使用的库 pynput&#xff1a;允许您控制和监…

kafka 命令行使用 消息的写入和读取 quickstart

文章目录 Intro命令日志zookeeper serverkafka servercreate topic && describe topic Intro Kafka在大型系统中可用作消息通道&#xff0c;一般是用程序语言作为客户端去调用kafka服务。 不过在这之前&#xff0c;可以先用下载kafka之后就包含的脚本文件等&#xff0…

在Spring Boot应用中实现阿里云短信功能的整合

1.程序员必备程序网站 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 2.导入坐标 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.0</version></dependency><…

Spring IOC 和 DI详解

目录 一、IOC介绍 1、什么是IOC 2、通过案例来了解IoC 2.1 传统程序开发 2.2 问题分析 2.3 解决方案 2.4 IoC程序开发 2.5 IoC 优势 二、DI介绍 三、IOC 详解 3.1 Bean的存储 3.1.1 Controller&#xff08;控制器存储&#xff09; 3.1.2 Service&#xff08;服务存…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

hadoop安装记录

零、版本说明 centos [rootnode1 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)jdk [rootnode1 ~]# java -version java version "1.8.0_311" Java(TM) SE Runtime Environment (build 1.8.0_311-b11) Java HotSpot(TM) 64-Bit Server VM (…

STL_List与萃取

List 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 List源码 List中节点的定义&#xff1a; list是双向列表&#xff0c;所以其中节点需要包含指向前一节点和后一节点的指针&#xff0c; data是节点中存储的数据类型 template <class _Tp&g…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时&#xff0c;弹窗报错&#xff1a;加密狗未安装或检测异常&#xff1b;  问题原因&#xff1a;安装VM 的时候未选择软加密&#xff0c;选择了加密狗驱动&#xff0c;此时要使用软授权就出现了此现象。  解决方法&#xff1a; ① 首先确认软加密驱动正确安装…

网络工程师----第十一天

OSPF&#xff1a; 对称加密算法&#xff1a; 也称为私钥加密或单密钥算法&#xff0c;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种算法的优点包括加密解密速度快、计算量小&#xff0c;适用于大量数据的加密。然而&#xff0c;它的缺点是密钥的安全性难以保…

OpenCV-基于阴影勾勒的图纸清晰度增强算法

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 实现原理 大家在工作和学习中&#xff0c;无论是写报告还是论文&#xff0c;经常有截图的需求&#xff0c;比如图表、图纸等&…

医学影像图像去噪:滤波器方法、频域方法、小波变换、非局部均值去噪、深度学习与稀疏表示和字典学习

医学影像图像去噪是指使用各种算法从医学成像数据中去除噪声,以提高图像质量和对疾病的诊断准确性。MRI(磁共振成像)和CT(计算机断层扫描)是两种常见的医学成像技术,它们都会受到不同类型噪声的影响。 在医学影像中,噪声可能来源于多个方面,包括成像设备的电子系统、患…

计算机网络【CN】Ch4 网络层

总结 一台主机可以有多个IP地址&#xff0c;但是必须属于多个逻辑网络【不同的网络号】。 解决IP地址耗尽&#xff1a; IP地址结构&#xff1a; 划分子网&#xff1a;&#x1d43c;&#x1d443;地址<网络号>,<子网号>,<主机号> CIDR&#xff1a;IP地址{&…

C++:特殊成员函数

构造函数、析构函数和拷贝构造函数是C类中的三种特殊成员函数&#xff0c;它们分别用于对象的初始化、清理和拷贝操作。 1.构造函数&#xff08;Constructor&#xff09;&#xff1a;构造函数在对象创建时自动调用&#xff0c;用于初始化对象的成员变量。它的名称与类名相同&a…

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

Linux:服务器硬件及RAID配置

Linux&#xff1a;服务器硬件及RAID配置 服务器 服务器是什么 服务器的英文名称为“ Server”&#xff0c;是指在网络上提供各种服务的高性能计算机。作为网络的节点&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;因此也被称为网络的灵魂。 服务器和…