架构对比分析
您提到的两种架构描述本质上遵循相同的分层设计理念,但存在差异的原因在于 视角不同 和 硬件平台特性。以下是详细解析:
一、架构对比分析
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中运行
- STM32MP157 的双核特性要求明确划分操作系统层级:
-
功能必要性:
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实时 + HAL | M4核硬实时 |
| 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, ¶m);while(1) {struct adc_sample sample;if(kfifo_get(&adc_fifo, &sample)) {process_sample(sample.value);}}
}
结论
两种架构描述本质上是 同一设计思想在不同硬件场景下的具体表现。是否添加额外的分层(如Linux/FreeRTOS层),取决于:
- 硬件是否异构(是否需要区分实时核与非实时核)
- 实时性要求级别(硬实时需独立RTOS,软实时可用Linux补丁)
- 系统复杂度(简单设备可合并业务逻辑与驱动层)
建议根据最终硬件选型,参考以下决策树:
相关文章:
架构对比分析
您提到的两种架构描述本质上遵循相同的分层设计理念,但存在差异的原因在于 视角不同 和 硬件平台特性。以下是详细解析: 一、架构对比分析 1. 逻辑分层(通用软件设计视角) 应用层(UI/用户交互)↓ 业务逻辑…...
【每日八股】Redis篇(二):数据结构
Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…...
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
有一个jar包,需要替换里面的文件,使用解压工具打开项目,然后找到对应的子包,再次打开,然后进行手工替换重新压缩成jar包后,发现启动服务报错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为什么要把横纵向分开优化?
在自动驾驶系统中,将 横向(Lateral)规划 和 纵向(Longitudinal)规划 分开优化是一种常见的设计范式,其核心原理在于 解耦车辆运动控制的多维复杂性,同时兼顾 计算效率 和 安全性约束。以下从原理…...
Linux 命令大全完整版(06)
2. 系统设置命令 pwunconv 功能说明:关闭用户的投影密码。语法:pwunconv补充说明:执行 pwunconv 指令可以关闭用户投影密码,它会把密码从 shadow 文件内,重回存到 passwd 文件里。 rdate(receive date) 功能说明&a…...
第9章:LangChain结构化输出-示例2(数字提取服务)
如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于Lan…...
每天五分钟深度学习pytorch:使用Inception模块搭建GoogLeNet模型
本文重点 前面我们学习了Incetption模块,它的作用类似于vgg块对于VGG网络模型一样,本文我们使用Inception搭建GoogLeNet网络,如果使用卷积层开始从头开始搭建GoogleNet,那么这样看起来会很不清晰,我们使用已经封装好的Inception来搭建GoogLeNet网络 关键点 关键点在于I…...
Ubuntu - Redis 安装、远程访问
参考教程: 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 上安装 更新: sudo apt update …...
SpringBoot+Vue+微信小程序的猫咖小程序平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当下这个高速发展的时代,网络科技正以令人惊叹的速度不断迭代更新。从 5G …...
二分查找算法的全面解析C++
一、核心原理与特性 二分查找是一种**对数时间复杂度(O(log n))**的高效搜索算法46,需满足两个前提条件: 数据存储在连续内存空间(如数组)数据按升序/降序有序排列35 算法通过折半比较缩小搜索范围: 初始化左右边界…...
深度学习(5)-卷积神经网络
我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单…...
第9章:LangChain结构化输出-示例3(日期和时间提取服务)
如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于LangChain调用大模型如何进行结构化输出的真实…...
解决Open WebU无法显示基于OpenAI API接口的推理内容的问题
解决方案 把reasoning content的东西移到content中来 并在reasoning时,手动加上标签。具体做法是截获第三方api返回的stream,并修改其中的内容,再移交给open webUI处理。 在backend\open_webui\routers\openai.py中 找到 generate_chat_com…...
AI颠覆蛋白质工程:ProMEP零样本预测突变效应
概述 在生命科学的“造物革命”中,蛋白质工程一直面临着“试错成本”与“设计效率”的双重挑战——传统方法依赖繁复的多序列比对(MSA)或耗时的实验室筛选,如同在浩瀚的蛋白质宇宙中盲选星辰。而今日,一项发表于《Cel…...
QT闲记-状态栏,模态对话框,非模态对话框
1、创建状态栏 跟菜单栏一样,如果是继承于QMainWindow类,那么可以获取窗口的状态栏,否则就要创建一个状态栏。通过statusBar()获取窗口的状态栏。 2、添加组件 通常添加Label 来显示相关信息,当然也可以添加其他的组件。通过addWidget()添加组件 3、设置状态栏样式 …...
QQ登录测试用例报告
QQ登录测试用例思维导图 一、安全性测试用例 1. 加密传输与存储验证 测试场景:输入账号密码并提交登录请求。预期结果:账号密码通过加密传输(如HTTPS)与存储(如哈希加盐),无明文暴露。 2. 二…...
ipad连接电脑断断续续,不断弹窗的解决办法
因为ipad air 屏幕摔坏,换了一个内外屏,想用爱思检验一下屏幕真伪, 连接电脑时,断断续续,连上几秒钟然后就断开,然后又连上 然后又断开,不断地弹出信任的弹窗。 刚开始以为是数据线问题&#x…...
《FFTformer:基于频域的高效Transformer用于高质量图像去模糊》
paper:2211.12250 GitHub:kkkls/FFTformer: [CVPR 2023] Effcient Frequence Domain-based Transformer for High-Quality Image Deblurring CVPR 2023 目录 摘要 1、介绍 2、相关工作 2.1 基于深度CNN的图像去模糊方法 2.2 Transformer及其在图…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
