架构对比分析
您提到的两种架构描述本质上遵循相同的分层设计理念,但存在差异的原因在于 视角不同 和 硬件平台特性。以下是详细解析:
一、架构对比分析
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及其在图…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
