当前位置: 首页 > news >正文

架构对比分析

您提到的两种架构描述本质上遵循相同的分层设计理念,但存在差异的原因在于 视角不同硬件平台特性。以下是详细解析:


一、架构对比分析

1. 逻辑分层(通用软件设计视角)
应用层(UI/用户交互)↓
业务逻辑层(平衡算法/文件管理)↓
驱动层(传感器采集/硬件控制)
  • 特点
    • 功能导向:按软件功能模块划分,与硬件无关
    • 通用性:适用于任何硬件平台(如PC/嵌入式/手机)
    • 典型应用:传统单核设备(如STM32F4系列)
2. 物理分层(STM32MP157异构平台视角)
+---------------------+
|     Qt应用层         |  
+---------------------+
|   Linux服务层        | 
+---------------------+
|  FreeRTOS实时层      | 
+---------------------+
| 硬件抽象层(HAL)     | 
+---------------------+
  • 特点
    • 硬件耦合:紧密结合双核异构架构(A7+M4)
    • 实时性优化:明确区分实时任务(M4)与非实时任务(A7)
    • 典型应用:需要硬实时+复杂UI的场景(如工业HMI)

二、分层差异的原因

1. 多出的"Linux服务层"与"FreeRTOS实时层"
  • 硬件差异

    • STM32MP157 的双核特性要求明确划分操作系统层级:
      • Linux层:管理UI、网络、文件系统等非实时任务
      • FreeRTOS层:处理ADC采样、电机控制等实时任务
    • 单核芯片(如i.MX6ULL):无需此分层,所有任务在单一OS中运行
  • 功能必要性

    非实时请求
    跨核通信
    硬件驱动
    Qt应用层
    Linux服务层
    FreeRTOS实时层
    HAL层
2. 硬件抽象层(HAL)的定位
  • 在传统分层中:HAL属于"驱动层"的一部分
  • 在异构分层中:HAL作为独立层,屏蔽双核差异:
    // HAL接口示例(统一A7/M4访问)
    typedef struct {int (*read_sensor)(void);      // M4实现void (*set_led)(int state);    // A7实现
    } HAL_Operations;
    

三、非STM32MP157平台的架构调整

1. 使用纯Linux平台(如i.MX6ULL)
应用层(Qt)↓
业务逻辑层(算法+文件)↓
Linux内核层(驱动+实时补丁)↓
硬件层(传感器/屏幕)
  • 关键调整
    • 移除FreeRTOS层,实时任务通过 Linux PREEMPT_RT 补丁实现
    • 示例配置:
      # 内核配置
      CONFIG_PREEMPT_RT_FULL=y
      CONFIG_HIGH_RES_TIMERS=y
      
2. 使用低端MCU(如STM32F4)
应用层(裸机UI)↓
业务逻辑层(简化算法)↓
驱动层(HAL库)
  • 典型方案
    • UI使用嵌入式GUI(如TouchGFX/LVGL)
    • 文件系统使用FatFS
    • 实时性由中断保障
3. 不同硬件平台的架构映射表
硬件平台对应架构分层实时性保障方案
STM32MP157(双核)Qt应用 + Linux服务 + FreeRTOS实时 + HALM4核硬实时
i.MX6ULL(单核)Qt应用 + Linux内核(RT补丁) + HAL软实时(PREEMPT_RT)
STM32F4(单核)裸机应用 + 驱动层中断优先级控制

四、架构设计建议

1. 通用设计原则
  • 模块化隔离

    // 业务逻辑层接口(硬件无关)
    class BalanceAlgorithm {
    public:virtual double calculate(QVector<double> samples) = 0;
    };// 平台相关实现
    class STM32MP157Balance : public BalanceAlgorithm { /*M4核实现*/ };
    class LinuxRTBalance : public BalanceAlgorithm { /*PREEMPT_RT实现*/ };
    
  • 跨平台HAL设计

    // hal.h
    #if defined(STM32MP157)#include "hal_stm32mp157.h"
    #elif defined(IMX6ULL)#include "hal_imx6ull.h"
    #endif
    
2. 选择依据
考量因素推荐架构原因
需要硬实时(<10μs)STM32MP157异构分层M4核专用于实时任务
成本敏感i.MX6ULL单核Linux架构省去M4核开发成本
界面复杂度低STM32F4裸机架构减少OS开销

五、示例:i.MX6ULL单核方案实现

1. 软件架构
应用层(Qt Quick)↓
业务逻辑层(平衡算法 + 模板管理)↓
Linux内核层(带PREEMPT_RT补丁)↓
驱动层(SPI/I2C/ADC驱动)
2. 实时数据采集实现
// 内核模块(确保实时性)
static irq_handler_t adc_isr(int irq, void *dev) {struct adc_sample *sample = kmalloc(sizeof(*sample), GFP_ATOMIC);sample->value = read_adc();kfifo_put(&adc_fifo, sample); // 无锁环形缓冲区return IRQ_HANDLED;
}// 用户空间线程(设置实时优先级)
void *data_thread(void *arg) {struct sched_param param = { .sched_priority = 99 };pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);while(1) {struct adc_sample sample;if(kfifo_get(&adc_fifo, &sample)) {process_sample(sample.value);}}
}

结论

两种架构描述本质上是 同一设计思想在不同硬件场景下的具体表现。是否添加额外的分层(如Linux/FreeRTOS层),取决于:

  1. 硬件是否异构(是否需要区分实时核与非实时核)
  2. 实时性要求级别(硬实时需独立RTOS,软实时可用Linux补丁)
  3. 系统复杂度(简单设备可合并业务逻辑与驱动层)

建议根据最终硬件选型,参考以下决策树:

需要硬实时?
选择STM32MP157异构架构
界面复杂度高?
选择i.MX6ULL单核Linux
选择STM32F4裸机方案

相关文章:

架构对比分析

您提到的两种架构描述本质上遵循相同的分层设计理念&#xff0c;但存在差异的原因在于 视角不同 和 硬件平台特性。以下是详细解析&#xff1a; 一、架构对比分析 1. 逻辑分层&#xff08;通用软件设计视角&#xff09; 应用层&#xff08;UI/用户交互&#xff09;↓ 业务逻辑…...

【每日八股】Redis篇(二):数据结构

Redis 数据类型&#xff1f; 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS&#xff08;简单动态字符串&#xff09;&#xff0c;其主要应用场景包括&#xff1a; 缓存对象&#xff1a;可以用 STRING 缓存整个对象的 JSON&…...

windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry

有一个jar包&#xff0c;需要替换里面的文件&#xff0c;使用解压工具打开项目&#xff0c;然后找到对应的子包&#xff0c;再次打开&#xff0c;然后进行手工替换重新压缩成jar包后&#xff0c;发现启动服务报错Failed to get nested archive for entry。 使用下面的命令可实…...

2025电商与跨境贸易实战全解析:DeepSeek赋能细分领域深度指南(附全流程案例)

🚀 2025电商与跨境贸易实战全解析:DeepSeek赋能细分领域深度指南(附全流程案例)🚀 📚 目录 DeepSeek在电商与跨境贸易中的核心价值选品与市场分析:AI驱动的精准决策Listing优化与多语言营销:提升转化率的秘密物流与供应链管理:AI赋能的效率革命客户服务与私域运营:…...

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…...

自动驾驶中planning为什么要把横纵向分开优化?

在自动驾驶系统中&#xff0c;将 横向&#xff08;Lateral&#xff09;规划 和 纵向&#xff08;Longitudinal&#xff09;规划 分开优化是一种常见的设计范式&#xff0c;其核心原理在于 解耦车辆运动控制的多维复杂性&#xff0c;同时兼顾 计算效率 和 安全性约束。以下从原理…...

Linux 命令大全完整版(06)

2. 系统设置命令 pwunconv 功能说明&#xff1a;关闭用户的投影密码。语法&#xff1a;pwunconv补充说明&#xff1a;执行 pwunconv 指令可以关闭用户投影密码&#xff0c;它会把密码从 shadow 文件内&#xff0c;重回存到 passwd 文件里。 rdate(receive date) 功能说明&a…...

第9章:LangChain结构化输出-示例2(数字提取服务)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解&#xff0c;将自然语言处理任务&#xff08;如情感分析、数字提取、日期提取、POJO提取等&#xff09;封装为服务&#xff0c;并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于Lan…...

每天五分钟深度学习pytorch:使用Inception模块搭建GoogLeNet模型

本文重点 前面我们学习了Incetption模块,它的作用类似于vgg块对于VGG网络模型一样,本文我们使用Inception搭建GoogLeNet网络,如果使用卷积层开始从头开始搭建GoogleNet,那么这样看起来会很不清晰,我们使用已经封装好的Inception来搭建GoogLeNet网络 关键点 关键点在于I…...

Ubuntu - Redis 安装、远程访问

参考教程&#xff1a; https://blog.csdn.net/houor/article/details/126672577 https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 查看是否安装 redis-cli --versionUbuntu 上安装 更新&#xff1a; sudo apt update …...

SpringBoot+Vue+微信小程序的猫咖小程序平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当下这个高速发展的时代&#xff0c;网络科技正以令人惊叹的速度不断迭代更新。从 5G …...

二分查找算法的全面解析C++

一、核心原理与特性 二分查找是一种**对数时间复杂度(O(log n))**的高效搜索算法46&#xff0c;需满足两个前提条件&#xff1a; 数据存储在连续内存空间&#xff08;如数组&#xff09;数据按升序/降序有序排列35 算法通过折半比较缩小搜索范围&#xff1a; 初始化左右边界…...

深度学习(5)-卷积神经网络

我们将深入理解卷积神经网络的原理&#xff0c;以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例&#xff0c;它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过&#xff0c;当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单…...

第9章:LangChain结构化输出-示例3(日期和时间提取服务)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于LangChain调用大模型如何进行结构化输出的真实…...

解决Open WebU无法显示基于OpenAI API接口的推理内容的问题

解决方案 把reasoning content的东西移到content中来 并在reasoning时&#xff0c;手动加上标签。具体做法是截获第三方api返回的stream&#xff0c;并修改其中的内容&#xff0c;再移交给open webUI处理。 在backend\open_webui\routers\openai.py中 找到 generate_chat_com…...

AI颠覆蛋白质工程:ProMEP零样本预测突变效应

概述 在生命科学的“造物革命”中&#xff0c;蛋白质工程一直面临着“试错成本”与“设计效率”的双重挑战——传统方法依赖繁复的多序列比对&#xff08;MSA&#xff09;或耗时的实验室筛选&#xff0c;如同在浩瀚的蛋白质宇宙中盲选星辰。而今日&#xff0c;一项发表于《Cel…...

QT闲记-状态栏,模态对话框,非模态对话框

1、创建状态栏 跟菜单栏一样,如果是继承于QMainWindow类,那么可以获取窗口的状态栏,否则就要创建一个状态栏。通过statusBar()获取窗口的状态栏。 2、添加组件 通常添加Label 来显示相关信息,当然也可以添加其他的组件。通过addWidget()添加组件 3、设置状态栏样式 …...

QQ登录测试用例报告

QQ登录测试用例思维导图 一、安全性测试用例 1. 加密传输与存储验证 测试场景&#xff1a;输入账号密码并提交登录请求。预期结果&#xff1a;账号密码通过加密传输&#xff08;如HTTPS&#xff09;与存储&#xff08;如哈希加盐&#xff09;&#xff0c;无明文暴露。 2. 二…...

ipad连接电脑断断续续,不断弹窗的解决办法

因为ipad air 屏幕摔坏&#xff0c;换了一个内外屏&#xff0c;想用爱思检验一下屏幕真伪&#xff0c; 连接电脑时&#xff0c;断断续续&#xff0c;连上几秒钟然后就断开&#xff0c;然后又连上 然后又断开&#xff0c;不断地弹出信任的弹窗。 刚开始以为是数据线问题&#x…...

《FFTformer:基于频域的高效Transformer用于高质量图像去模糊》

paper&#xff1a;2211.12250 GitHub&#xff1a;kkkls/FFTformer: [CVPR 2023] Effcient Frequence Domain-based Transformer for High-Quality Image Deblurring CVPR 2023 目录 摘要 1、介绍 2、相关工作 2.1 基于深度CNN的图像去模糊方法 2.2 Transformer及其在图…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...