架构对比分析

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


一、架构对比分析

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裸机方案

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全高级软件编程技术

安全软件开发入门 软件安全问题 有趣的《黑客帝国》终极解释&#xff1a; 《黑客帝国》故事里面的人物关系&#xff0c;就像电脑里面的各种程序的关系一样&#xff1a; 电脑里面的系统程序&#xff1a;Matrix&#xff1b; 病毒程序&#xff1a;以Neo为首的人类&#xff1b; …

【AI学习笔记】2月10日李飞飞巴黎AI峰会演讲:探索 AI 的历史、现状与未来

【AIGC学习笔记】2月10日李飞飞巴黎AI峰会演讲&#xff1a;探索 AI 的历史、现状与未来 AI 的历史根基与发展历程 生命起源与智能诞生&#xff1a;5 亿年前视觉概念的出现推动了智能的诞生。最初的感知仅仅是被动的体验&#xff0c;只是但随着神经系统的活跃&#xff0c;视觉…

一文读懂Docker之Docker Compose

目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…

算法常见八股问题整理

1.极大似然估计和交叉熵有什么关系 在分类问题中&#xff0c;当我们使用softmax函数作为输出层时&#xff0c;最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说&#xff0c;在多分类情况下&#xff0c;最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…

自注意力机制和CNN的区别

CNN&#xff1a;一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力&#xff1a;具有可学习感受野的CNN。自注意力是CNN的复杂形态&#xff0c;是更灵活的CNN&#xff0c;经过某些设计就可以变为CNN。 越灵活、越大的模型&#xff0c;需要…

书生大模型实战营14-MindSearch深度解析实践

文章目录 L2——进阶岛MindSearch深度解析实践1 MindSearch 简介2 开发环境配置2.1. 打开codespace主页&#xff0c;选择Blank模板进行创建2.2. 创建conda环境隔离并安装依赖 3. 获取硅基流动API KEY4. 启动MindSearch4.1. 启动后端4.2. 启动前端 5. 部署到自己的 HuggingFace …

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…

luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用&#xff0c;虽然直接可执行程序也可以运行&#xff0c;但是没有UI会很不方便&#xff0c;想要开发UI就要用openwrt的那一套&#xff0c;自然就是LuCI&#xff0c;LuCI又用了一套MVC框架&#xff0c;今天就讲讲这是个什么东西。 OpenWrt LuCI 界面开发中…

zyNo.25

SSRF漏洞 在了解ssrf漏洞前先了解curl命令的使用 1.curl命令的使用 基本格式&#xff1a;curl<参数值>请求地址 get请求&#xff1a;curl http://127.0.0.1 post请求&#xff1a;curl -X POST -d "a1&b2" http://127.0.0.1/(其中&#xff0c;使用-X参…

2.19学习(php文件后缀)

misc buu-后门查杀 下载附件&#xff0c;我们用火绒安全扫一下然后点击详情进入该文件所在文件夹&#xff0c;再用记事本打开该文件&#xff0c;搜索flag无果&#xff0c;再试试pass&#xff08;由题目中的密码联系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

浅谈 Redis 主从复制原理(二)

大家好&#xff0c;我是此林。 【浅谈 Redis 主从集群原理&#xff08;一&#xff09; 】 上一篇文章中&#xff0c;说到了 Redis 主从复制的全量同步和增量同步&#xff0c;repl_baklog 复制缓冲区&#xff0c;以及 slave 挂掉之后数据同步的措施。 下面介绍的上一篇遗留问…

接雨水的算法

题目 代码 # 接雨水算法 def trap(height):# 1. 特殊情况&#xff1a;数组为空 则返回0if not height:return 0n len(height)# 2. 初始化左右指针&#xff0c;左右最大值&#xff0c;结果left, right 0, n - 1# maxleft代表左边最大值&#xff0c;maxright代表右边最大值max…

【C++】list 链表的使用+模拟实现

目录 文章目录 前言 一、list的简介 二、list的使用方法 三、list的模拟实现 1.基本框架&#xff1a; 2.迭代器实现 3.常用接口实现 四、完整代码 总结 前言 本文主要介绍C【STL】容器中的 list&#xff0c;包括接口说明和模拟实现。其中讲解了迭代器功能上的分类&am…

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…

RT-Thread+STM32L475VET6——ADC采集电压

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟&#xff0c;并修改时钟树1.2 打开ADC1的通道3&#xff0c;并配置为连续采集模式(ADC根据自己需求调整&#xff09;1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…

Jupyter Notebook切换虚拟环境(Kernel管理)

我们在使用Jupyter Notebook的时候&#xff0c;打开文件发现只有一个Python3(ipykernel)&#xff0c;我们自己在conda中创建的虚拟环境为什么没有显示出来&#xff0c;今天我就来和大家一起讨论一下&#xff01; 在 Jupyter Notebook 中&#xff0c;kernel 是执行代码的核心。管…

Ubuntu 22.04 Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…

mysql的源码包安装

安装方式一&#xff1a;&#xff08;编译好的直接安装&#xff09; 1.添加一块10G的硬盘&#xff0c;给root逻辑卷扩容 &#xff08;下面安装方式二有&#xff0c;一模一样的装就行&#xff0c;我就不写了&#xff0c;再写的话篇幅就太长了&#xff09; 2.下载编译好的源码包…

内网网络安全的解决之道

本文简要分析了企业内部网络所面临的主要分析&#xff0c;阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状&#xff0c;并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全&#xff…