架构对比分析

发布于:2025-02-24 ⋅ 阅读:(21) ⋅ 点赞:(0)

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


一、架构对比分析

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实时 + 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, &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裸机方案

网站公告

今日签到

点亮在社区的每一天
去签到