嵌入式SoC多线程架构迁移多进程架构开发技巧

原创 美男子玩编程 2024-12-17 08:00

点击上方蓝色字体,关注我们

将嵌入式SoC开发从单进程多线程架构迁移多进程架构是一项需要谨慎规划和实施的任务,尤其在资源有限的嵌入式系统中。


这种架构转变通常是为了提高系统的稳定性隔离性安全性并发处理能力


在单进程多线程架构中,多个线程共享相同的内存空间文件描述符全局变量,适合处理轻量级任务并发


然而,这种架构的缺点在于:

  • 共享资源管理复杂线程之间共享内存,容易引发数据竞争和资源冲突问题,特别是在锁机制使用不当时。

  • 崩溃影响较大如果其中一个线程发生崩溃,整个进程都会受影响,导致系统不稳定。

  • 调试困难由于线程共享状态,调试内存问题和线程同步问题较为复杂。


多进程架构将应用分割成多个独立的进程,每个进程有自己独立的内存空间资源控制


这种架构带来的好处包括:

  • 稳定性增强一个进程崩溃不会影响其他进程,系统更具弹性。

  • 资源隔离不同进程之间互相独立,降低数据竞争问题。

  • 安全性提升不同的进程可以运行在不同的权限下,增强系统安全性。


1


架构迁移步骤

1、分析系统功能模块

首先,需要对现有的单进程多线程架构中的功能模块进行分析。


找出哪些模块可以独立运行,并识别哪些模块间存在紧密通信的依赖。


这些依赖关系在多进程架构中将通过进程间通信(IPC)来处理。


2、确定进程划分

根据功能模块的划分,将系统设计为多个独立的进程。


例如:

  • 数据采集进程专门处理传感器数据采集。

  • 数据处理进程执行数据的分析与处理。

  • 通信进程负责与外部设备或服务器的通信。

  • 用户界面进程与用户进行交互。


3、实现进程间通信(IPC)

在多进程架构中,线程共享的内存变为各自独立,因此需要通过进程间通信机制来传递信息。


常用的IPC机制包括:

  • 消息队列适合传递短小消息的场景,带有优先级机制。

  • 共享内存用于高效的大数据量传输,但需额外的同步控制。

  • 信号量用于同步进程间的操作,确保操作有序进行。

  • 管道(pipe)单向通信通道,适合父子进程间的数据传输。

  • Socket用于不同设备或跨网络通信。


4、进程的创建与管理

在多进程架构中,使用fork()系统调用或其他多进程框架来创建多个进程。


可以通过守护进程来管理子进程的启动、停止和监控。


5、异常处理与监控

使用wait()waitpid()系统调用来监控子进程的状态,确保进程能够正确退出或重启。


可以通过设计一个监控进程,定期检查各个子进程的健康状态。


6、资源分配与优化

在多进程架构中,由于每个进程都有自己的内存空间,需要更加精确地控制资源的分配和使用。


可以通过内存共享池来优化不同进程的内存占用,并确保嵌入式系统的性能。


2


架构迁移的关键点

性能与资源管理

多进程架构在嵌入式系统中的使用可能会增加内存和资源开销,因为每个进程都有自己的独立地址空间和资源。


为了优化性能,可以考虑使用轻量级的IPC机制,或者根据需求调整进程的数量和功能分布。


进程通信的选择

除了共享内存,进程间通信还可以使用消息队列、管道或socket,根据实际需要选择最合适的方式。


共享内存虽然在大数据传输时效率高,但需要进行同步处理(如使用信号量)来避免并发访问冲突。


稳定性和隔离性

多进程架构极大提高了系统的隔离性。


如果某个进程崩溃,其他进程仍然能够继续正常工作,增强了系统的稳定性。


通过父进程监控子进程的状态,可以实现崩溃时自动重启功能,进一步提升系统的容错性。


3


迁移实例

这里以一个简单的嵌入式系统为例,逐步展示如何从单进程多线程架构转变为多进程架构。


在这个架构中,系统有三个主要功能模块:

  • 温度传感器数据采集线程。

  • 数据处理线程。

  • 通信模块线程,将处理后的数据发送到远程服务器。


这些线程共享同一个内存空间,通过共享的全局变量来交换数据。


原始多线程代码如下:


// 全局共享变量float temperature_data = 0.0;
// 模拟读取温度传感器数据float read_temperature_sensor() { return 25.0 + (rand() % 10); // 随机模拟温度}
// 模拟处理数据void process_temperature_data(float temp) { printf("Processing temperature data: %.2f\n", temp); sleep(1); // 模拟数据处理时间}
// 模拟发送数据到服务器void send_data_over_network(float temp) { printf("Sending data over network: %.2f\n", temp); sleep(1); // 模拟网络通信时间}
// 温度采集线程void* temperature_thread(void* arg) { while (1) { temperature_data = read_temperature_sensor(); printf("Temperature read: %.2f\n", temperature_data); sleep(2); // 模拟采集周期 } return NULL;}
// 数据处理线程void* processing_thread(void* arg) { while (1) { process_temperature_data(temperature_data); } return NULL;}
// 通信线程void* communication_thread(void* arg) { while (1) { send_data_over_network(temperature_data); } return NULL;}
int main() { pthread_t temp_thread, proc_thread, comm_thread;
// 创建三个线程 pthread_create(&temp_thread, NULL, temperature_thread, NULL); pthread_create(&proc_thread, NULL, processing_thread, NULL); pthread_create(&comm_thread, NULL, communication_thread, NULL);
// 等待线程完成 pthread_join(temp_thread, NULL); pthread_join(proc_thread, NULL); pthread_join(comm_thread, NULL);
return 0;}


存在问题:

  • 数据竞争多个线程访问和修改同一个全局变量temperature_data,容易出现数据竞争。

  • 稳定性如果某个线程崩溃,整个进程都会终止。

  • 调试困难由于线程共享资源,调试内存问题比较复杂。


多进程架构优化思路:


共享内存创建

使用 ftok() 生成一个唯一的键值来标识共享内存。


shmget() 创建一个共享内存段,指定共享内存大小为 sizeof(float),用于存储温度数据。


shmat() 将共享内存映射到进程的地址空间,使每个子进程都可以访问这块共享内存。


子进程的创建

使用 fork() 创建三个子进程,分别负责温度数据采集、数据处理和数据发送。


每个子进程拥有自己的独立内存空间,但通过共享内存来交换数据。


数据传递

温度采集进程负责读取传感器数据,并将数据写入共享内存中的 temperature_data。


数据处理进程从共享内存读取温度数据,并进行相应的处理操作。


通信进程从共享内存读取处理后的数据,并将其通过网络发送到远程服务器。


进程管理

父进程使用 wait() 函数来等待子进程的执行结束,确保所有子进程正确地运行。


在系统终止时,父进程会分离并删除共享内存,防止内存泄漏。


优化后的多进程架构代码:


// 模拟读取温度传感器数据float read_temperature_sensor() {    return 25.0 + (rand() % 10); // 随机模拟温度}
// 模拟处理数据void process_temperature_data(float temp) { printf("Processing temperature data: %.2f\n", temp); sleep(1); // 模拟数据处理时间}
// 模拟发送数据到服务器void send_data_over_network(float temp) { printf("Sending data over network: %.2f\n", temp); sleep(1); // 模拟网络通信时间}
int main() { // 创建共享内存段 key_t key = ftok("shmfile", 65); // 生成共享内存键值 int shmid = shmget(key, sizeof(float), 0666 | IPC_CREAT); // 创建共享内存 float *temperature_data = (float *) shmat(shmid, NULL, 0); // 将共享内存映射到进程地址空间
// 父进程创建子进程 pid_t pid = fork();
if (pid == 0) { // 子进程1:负责温度采集 while (1) { *temperature_data = read_temperature_sensor(); printf("Temperature read: %.2f\n", *temperature_data); sleep(2); // 模拟采集周期 } } else { pid_t pid2 = fork(); if (pid2 == 0) { // 子进程2:负责数据处理 while (1) { process_temperature_data(*temperature_data); } } else { pid_t pid3 = fork(); if (pid3 == 0) { // 子进程3:负责数据发送 while (1) { send_data_over_network(*temperature_data); } } else { // 父进程:等待所有子进程 wait(NULL); // 等待第一个子进程结束 wait(NULL); // 等待第二个子进程结束 wait(NULL); // 等待第三个子进程结束
// 分离和删除共享内存 shmdt(temperature_data); shmctl(shmid, IPC_RMID, NULL); } } }
return 0;}


从单进程多线程架构转向多进程架构,可以显著提高嵌入式系统的稳定性、隔离性和安全性。


通过共享内存、消息队列等进程间通信机制,能够有效地实现进程之间的数据交换。


虽然多进程架构会带来一定的资源开销,但在处理复杂应用时,其优势非常明显,特别是对于需要高并发、容错性和模块化设计的系统。

点击阅读原文,更精彩~

美男子玩编程 多领域、有深度的开发者交流平台
评论
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 167浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 25浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 58浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 164浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 50浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 33浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 47浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 170浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 121浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 46浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 74浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 184浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 13浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 62浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦