AUTOSAR进阶图解==>AUTOSAR_SRS_ModeManagement

AUTOSAR模式管理系统详解

深入分析AUTOSAR模式管理的架构、状态转换与交互机制

目录


1. 概述

1.1 模式管理的作用

AUTOSAR模式管理是汽车电子控制单元(ECU)的核心功能之一,负责协调ECU各组件的运行状态、通信能力和功耗管理。模式管理确保汽车电子系统在不同工作环境下能够高效、可靠地运行,同时优化能源消耗和系统性能。

在AUTOSAR架构中,模式管理涉及多个层次和组件,包括应用层、中间层和基础软件层的模式状态和转换。模式管理对于实现以下关键功能至关重要:

  • 电源管理:控制ECU的启动、运行和关闭状态
  • 通信协调:管理网络通信的不同模式
  • 功能降级:在异常情况下实现安全的系统降级
  • 资源优化:根据实际需求调整系统资源分配

1.2 模式管理组件

AUTOSAR模式管理主要由以下四个关键组件组成:

  • ECU状态管理器(EcuM):管理ECU的启动和关闭,控制ECU的电源状态
  • 通信管理器(ComM):协调ECU的通信需求,管理通信网络的状态
  • BSW模式管理器(BswM):组织模式处理和模式相关交互,是模式管理的中央协调器
  • 看门狗管理器(WdgM):监控应用程序的活动状态,确保系统运行的安全性

这些组件相互协作,共同构成了AUTOSAR模式管理系统的完整解决方案。


2. AUTOSAR模式管理架构

2.1 整体架构图

在这里插入图片描述

2.2 关键组件解析

组件 ECU状态管理器(EcuM):

  • 职责: ECU状态管理器是一个基础软件模块,负责管理ECU的状态。
  • 功能点:
    • 控制ECU的启动和关闭流程
    • 管理所有唤醒事件
    • 支持多种关闭目标,包括关闭电源和睡眠模式
    • 配置ECU进入睡眠模式以降低功耗

组件 通信管理器(ComM):

  • 职责: 通信管理器控制各个物理通道的通信模式,协调通信需求。
  • 功能点:
    • 提供API允许收集通信请求
    • 支持每个物理通道的两种通信模式:全通信和无通信
    • 根据请求启动和维持通道唤醒
    • 提供通信模式变更的通知机制

组件 BSW模式管理器(BswM):

  • 职责: BSW模式管理器负责支持模式管理,协调不同层次的模式交互。
  • 功能点:
    • 接收并仲裁来自不同源的模式请求
    • 管理模式声明组及其状态转换
    • 在各种模式级别之间建立关系
    • 提供模式变更通知给模式用户

组件 看门狗管理器(WdgM):

  • 职责: 看门狗管理器收集独立应用程序的活动指示和正确执行顺序,并将其传递给硬件看门狗。
  • 功能点:
    • 监控应用程序的活动状态
    • 检测执行顺序错误
    • 在启动、关闭和睡眠过程中提供活动监督
    • 控制硬件看门狗的触发机制

这些组件通过明确定义的接口和依赖关系相互协作,共同实现ECU的模式管理功能。以下是对应的代码示例,展示这些组件之间的接口关系:

/* ECU状态管理器初始化函数 */
Std_ReturnType EcuM_Init(void)
{
    /* 初始化ECU状态机 */
    EcuM_State = ECUM_STATE_STARTUP;
    
    /* 初始化其他模式管理模块 */
    WdgM_Init();
    ComM_Init();
    BswM_Init();
    
    /* 设置默认关闭目标 */
    EcuM_ShutdownTarget = ECUM_SHUTDOWN_TARGET_SLEEP;
    
    return E_OK;
}

/* 通信管理器通信请求函数 */
Std_ReturnType ComM_RequestComMode(ComM_UserHandleType User, ComM_ModeType ComMode)
{
    Std_ReturnType result = E_NOT_OK;
    
    /* 检查参数有效性 */
    if (User < COMM_NUM_USERS && (ComMode == COMM_FULL_COMMUNICATION || ComMode == COMM_NO_COMMUNICATION)) {
        /* 更新用户请求 */
        ComM_UserRequests[User] = ComMode;
        
        /* 通知BSW模式管理器通信模式请求变更 */
        BswM_ComM_ModeUpdate(User, ComMode);
        
        result = E_OK;
    }
    
    return result;
}

/* BSW模式管理器模式切换函数 */
void BswM_ModeSwitch(BswM_ModeDeclarationGroupType Group, BswM_ModeType Mode)
{
    /* 更新模式组状态 */
    BswM_ModeGroups[Group] = Mode;
    
    /* 根据模式变更执行相应操作 */
    switch (Group) {
        case BSWM_MDG_ECU_STATE:
            /* 通知ECU状态管理器 */
            EcuM_SetState(Mode);
            break;
        case BSWM_MDG_COMM_MODE:
            /* 通知通信管理器 */
            ComM_SetMode(Mode);
            break;
        default:
            /* 处理其他模式组 */
            break;
    }
}

3. ECU状态管理器

3.1 状态转换流程

在这里插入图片描述

3.2 关键状态解析

状态 RESET:

  • 描述: ECU上电或复位后的初始状态,负责硬件初始化和基本驱动初始化。
  • 触发条件: ECU上电或系统复位。
  • 职责:
    • 执行硬件初始化
    • 初始化基本驱动程序
    • 确定复位原因(上电、看门狗、软件复位等)

状态 STARTUP_I:

  • 描述: 操作系统(OS)启动前的预初始化阶段。
  • 触发条件: 从RESET状态转换过来。
  • 职责:
    • 执行OS前初始化
    • 初始化核心模块
    • 准备OS启动环境

状态 STARTUP_II:

  • 描述: 操作系统启动后的初始化阶段。
  • 触发条件: OS初始化完成。
  • 职责:
    • 初始化所有BSW模块
    • 启动应用软件
    • 配置通信和诊断功能

状态 RUN:

  • 描述: ECU的正常运行状态。
  • 触发条件: 所有初始化完成。
  • 职责:
    • 维持所有BSW模块的活动状态
    • 允许应用软件运行
    • 处理所有用户请求

状态 POST_RUN:

  • 描述: 准备进入关闭流程的过渡状态。
  • 触发条件: 收到关闭请求。
  • 职责:
    • 通知相关模块即将关闭
    • 准备系统关闭
    • 完成关键任务

状态 SLEEP:

  • 描述: ECU的低功耗模式。
  • 触发条件: 选择睡眠模式关闭。
  • 职责:
    • 维持最低功耗状态
    • 保持配置的唤醒源处于活动状态
    • 等待唤醒事件

以下是ECU状态管理器状态转换的代码示例:

/* ECU状态管理器状态处理函数 */
void EcuM_MainFunction(void)
{
    switch (EcuM_State) {
        case ECUM_STATE_STARTUP_ONE:
            /* 执行STARTUP_I阶段任务 */
            if (EcuM_StartupOneCompleted) {
                /* 初始化操作系统 */
                StartOS(OSDEFAULTAPPMODE);
                EcuM_State = ECUM_STATE_STARTUP_TWO;
            }
            break;
            
        case ECUM_STATE_STARTUP_TWO:
            /* 执行STARTUP_II阶段任务 */
            if (EcuM_StartupTwoCompleted) {
                /* 通知BSW模式管理器进入RUN状态 */
                BswM_EcuM_CurrentState(ECUM_STATE_APP_RUN);
                EcuM_State = ECUM_STATE_APP_RUN;
            }
            break;
            
        case ECUM_STATE_APP_RUN:
            /* 检查是否有关闭请求 */
            if (EcuM_ShutdownRequested) {
                /* 通知进入POST_RUN状态 */
                BswM_EcuM_CurrentState(ECUM_STATE_APP_POST_RUN);
                EcuM_State = ECUM_STATE_APP_POST_RUN;
            }
            break;
            
        case ECUM_STATE_APP_POST_RUN:
            /* 执行关闭准备 */
            if (EcuM_PostRunCompleted) {
                /* 根据关闭目标选择下一个状态 */
                if (EcuM_ShutdownTarget == ECUM_SHUTDOWN_TARGET_SLEEP) {
                    EcuM_State = ECUM_STATE_GO_SLEEP;
                } else {
                    EcuM_State = ECUM_STATE_GO_OFF;
                }
            }
            break;
            
        case ECUM_STATE_GO_SLEEP:
            /* 配置MCU进入睡眠模式 */
            Mcu_SetMode(MCU_MODE_SLEEP);
            EcuM_State = ECUM_STATE_SLEEP;
            break;
            
        case ECUM_STATE_SLEEP:
            /* 睡眠状态,等待唤醒中断 */
            /* 唤醒后会由ISR处理 */
            break;
            
        case ECUM_STATE_WAKEUP:
            /* 处理唤醒 */
            EcuM_State = ECUM_STATE_STARTUP_ONE;
            break;
            
        case ECUM_STATE_GO_OFF:
            /* 关闭所有外设和MCU */
            Mcu_SetMode(MCU_MODE_OFF);
            EcuM_State = ECUM_STATE_OFF;
            break;
            
        default:
            /* 处理未知状态 */
            break;
    }
}

4. 通信管理器

4.1 通信状态转换

在这里插入图片描述

4.2 通信模式控制

状态 NO_COM:

  • 描述: 无通信状态,通信硬件完全关闭。
  • 触发条件: 初始化完成或无通信请求超时。
  • 职责:
    • 通信硬件处于关闭状态
    • 网络管理模块处于睡眠状态
    • 系统处于最低功耗通信状态

状态 PASSIVE_WAKEUP:

  • 描述: 被动唤醒状态,由外部网络消息触发。
  • 触发条件: 接收到网络消息。
  • 职责:
    • 监听网络消息
    • 等待本地通信请求
    • 如无用户请求则超时返回睡眠

状态 FULL_COM:

  • 描述: 全通信状态,允许发送和接收操作。
  • 触发条件: 用户请求通信或被动唤醒后收到通信请求。
  • 职责:
    • 通信网络完全激活
    • 允许发送和接收操作
    • 网络管理处于活动状态

状态 READY_SLEEP:

  • 描述: 准备睡眠状态,等待进入无通信状态。
  • 触发条件: 无通信请求时从FULL_COM转换。
  • 职责:
    • 通信请求已释放
    • 等待超时再关闭通信
    • 可以由新请求重新激活

通信管理器支持两种通信模式:全通信和无通信。从源文档中可以看出,这些模式有隐含的顺序,全通信是"最高"模式,而无通信是"最低"模式。以下是通信管理器的代码示例:

/* 通信管理器状态处理函数 */
void ComM_MainFunction(void)
{
    uint8 channel;
    
    /* 处理每个通信通道 */
    for (channel = 0; channel < COMM_CHANNEL_COUNT; channel++) {
        switch (ComM_ChannelState[channel]) {
            case COMM_NO_COMMUNICATION:
                /* 检查是否有通信请求 */
                if (ComM_HasRequest(channel)) {
                    /* 有用户请求通信,直接进入全通信状态 */
                    ComM_ChannelState[channel] = COMM_FULL_COMMUNICATION;
                    ComM_ActivateNetworkCommunication(channel);
                } else if (ComM_IsNetworkMessageReceived(channel)) {
                    /* 接收到网络消息,进入被动唤醒状态 */
                    ComM_ChannelState[channel] = COMM_PASSIVE_WAKE_UP;
                    ComM_StartTimer(channel, COMM_T_PASSIVE_WAKE_UP);
                }
                break;
                
            case COMM_PASSIVE_WAKE_UP:
                /* 检查是否有通信请求 */
                if (ComM_HasRequest(channel)) {
                    /* 有用户请求通信,进入全通信状态 */
                    ComM_ChannelState[channel] = COMM_FULL_COMMUNICATION;
                    ComM_ActivateNetworkCommunication(channel);
                } else if (ComM_IsTimerExpired(channel)) {
                    /* 超时无请求,返回无通信状态 */
                    ComM_ChannelState[channel] = COMM_NO_COMMUNICATION;
                    ComM_DeactivateNetworkCommunication(channel);
                }
                break;
                
            case COMM_FULL_COMMUNICATION:
                /* 检查是否仍有通信请求 */
                if (!ComM_HasRequest(channel)) {
                    /* 无通信请求,进入准备睡眠状态 */
                    ComM_ChannelState[channel] = COMM_READY_SLEEP;
                    ComM_StartTimer(channel, COMM_T_MIN_FULL_COM_MODE_DURATION);
                }
                break;
                
            case COMM_READY_SLEEP:
                /* 检查是否有新的通信请求 */
                if (ComM_HasRequest(channel)) {
                    /* 有新的通信请求,返回全通信状态 */
                    ComM_ChannelState[channel] = COMM_FULL_COMMUNICATION;
                } else if (ComM_IsTimerExpired(channel)) {
                    /* 超时无请求,进入无通信状态 */
                    ComM_ChannelState[channel] = COMM_NO_COMMUNICATION;
                    ComM_DeactivateNetworkCommunication(channel);
                }
                break;
                
            default:
                /* 处理未知状态 */
                break;
        }
        
        /* 通知状态变化 */
        ComM_NotifyStateChange(channel, ComM_ChannelState[channel]);
    }
}

/* 通信请求函数 */
Std_ReturnType ComM_RequestComMode(ComM_UserHandleType User, ComM_ModeType ComMode)
{
    Std_ReturnType result = E_NOT_OK;
    uint8 channel;
    
    /* 检查参数有效性 */
    if (User < COMM_USER_COUNT && 
        (ComMode == COMM_FULL_COMMUNICATION || ComMode == COMM_NO_COMMUNICATION)) {
        
        /* 更新用户请求 */
        ComM_UserRequest[User] = ComMode;
        result = E_OK;
        
        /* 更新关联通道的状态 */
        for (channel = 0; channel < COMM_CHANNEL_COUNT; channel++) {
            if (ComM_IsUserAssignedToChannel(User, channel)) {
                ComM_EvaluateChannelState(channel);
            }
        }
    }
    
    return result;
}

5. BSW模式管理器

5.1 模式交互机制

在这里插入图片描述

5.2 模式请求与仲裁

BSW模式管理器是AUTOSAR模式管理架构中的核心组件,负责协调不同层次和不同组件之间的模式变化。以下是BSW模式管理器的关键功能解析:

组件 模式请求源:

  • 描述: 各种可以发起模式变更请求的组件。
  • 类型:
    • 应用软件组件(SWC): 应用级别的模式请求
    • 通信事件: 通信状态变化触发的请求
    • 网络事件: 网络状态变化触发的请求
    • ECU事件: ECU状态变化触发的请求
    • 诊断事件: 诊断会话变化触发的请求

组件 模式声明组:

  • 描述: 定义一组相关的模式状态及其转换规则。
  • 类型:
    • ECU模式: 定义ECU的运行状态
    • 通信模式: 定义通信系统的运行状态
    • 应用模式: 定义应用程序的运行状态
    • 诊断模式: 定义诊断系统的运行状态

BSW模式管理器的主要职责是接收来自各种源的模式请求,根据预定义的规则进行仲裁,然后决定实际的模式变更,并通知相关的模式用户。以下是BSW模式管理器的代码示例:

/* BSW模式管理器模式请求处理函数 */
void BswM_RequestMode(BswM_RequestSourceType RequestSource, BswM_ModeType RequestedMode)
{
    /* 记录模式请求 */
    BswM_ModeRequests[RequestSource] = RequestedMode;
    
    /* 触发模式仲裁 */
    BswM_ArbitrateMode();
}

/* BSW模式管理器模式仲裁函数 */
void BswM_ArbitrateMode(void)
{
    /* 遍历所有模式声明组 */
    for (BswM_ModeDeclarationGroupType group = 0; group < BSWM_MODE_GROUP_COUNT; group++) {
        BswM_ModeType currentMode = BswM_ModeGroups[group];
        BswM_ModeType targetMode = BswM_DetermineTargetMode(group);
        
        /* 如果目标模式与当前模式不同,执行模式切换 */
        if (targetMode != currentMode) {
            /* 更新模式组状态 */
            BswM_ModeGroups[group] = targetMode;
            
            /* 执行模式切换相关操作 */
            BswM_ExecuteModeActions(group, targetMode);
            
            /* 通知模式用户 */
            BswM_NotifyModeChange(group, targetMode);
        }
    }
}

/* 确定模式声明组的目标模式 */
BswM_ModeType BswM_DetermineTargetMode(BswM_ModeDeclarationGroupType Group)
{
    BswM_ModeType targetMode;
    
    /* 根据模式组类型执行不同的仲裁逻辑 */
    switch (Group) {
        case BSWM_MDG_ECU_STATE:
            /* ECU状态模式仲裁 */
            targetMode = BswM_ArbitrateEcuStateMode();
            break;
            
        case BSWM_MDG_COMM_MODE:
            /* 通信模式仲裁 */
            targetMode = BswM_ArbitrateCommMode();
            break;
            
        case BSWM_MDG_APP_MODE:
            /* 应用模式仲裁 */
            targetMode = BswM_ArbitrateAppMode();
            break;
            
        default:
            /* 使用默认模式 */
            targetMode = BSWM_DEFAULT_MODE;
            break;
    }
    
    return targetMode;
}

/* 执行模式切换相关操作 */
void BswM_ExecuteModeActions(BswM_ModeDeclarationGroupType Group, BswM_ModeType Mode)
{
    /* 根据模式组和目标模式执行相应操作 */
    switch (Group) {
        case BSWM_MDG_ECU_STATE:
            /* 处理ECU状态模式变更 */
            if (Mode == BSWM_ECUM_STATE_SHUTDOWN) {
                /* 请求ECU关闭 */
                EcuM_RequestShutdown();
            }
            break;
            
        case BSWM_MDG_COMM_MODE:
            /* 处理通信模式变更 */
            if (Mode == BSWM_COMM_FULL_COMMUNICATION) {
                /* 请求全通信模式 */
                ComM_RequestComMode(COMM_USER_BSWM, COMM_FULL_COMMUNICATION);
            } else {
                /* 释放通信请求 */
                ComM_RequestComMode(COMM_USER_BSWM, COMM_NO_COMMUNICATION);
            }
            break;
            
        default:
            /* 处理其他模式组 */
            break;
    }
}

6. 配置与应用

6.1 配置参数

AUTOSAR模式管理系统的配置参数主要涉及以下几个方面:

  1. ECU状态管理器配置

    • 唤醒源配置:定义哪些唤醒源在哪种睡眠模式下是有效的
    • 关闭目标配置:定义支持的关闭目标(关闭电源或睡眠模式)
    • 睡眠模式配置:定义可用的睡眠模式及其属性
  2. 通信管理器配置

    • 通信通道配置:定义物理通信通道的属性和行为
    • 用户配置:定义哪些组件可以请求通信
    • 超时配置:定义各种状态转换的超时时间
  3. BSW模式管理器配置

    • 模式声明组配置:定义系统中的模式组和有效模式
    • 模式仲裁规则:定义如何仲裁来自不同源的模式请求
    • 模式映射配置:定义不同模式组之间的影响关系
  4. 看门狗管理器配置

    • 监督实体配置:定义被监控的应用程序单元
    • 检查点配置:定义应用程序中的检查点
    • 模式配置:定义不同监控模式下的监控参数

下面是ECU状态管理器配置的代码示例:

/* ECU状态管理器配置示例 */
const EcuM_ConfigType EcuM_Configuration = {
    /* 基本配置 */
    .DefaultShutdownTarget = ECUM_SHUTDOWN_TARGET_SLEEP,
    .DefaultSleepMode = ECUM_SLEEP_MODE_0,
    .DefaultAppMode = OSDEFAULTAPPMODE,
    
    /* 唤醒源配置 */
    .WakeupSourceCount = 3,
    .WakeupSources = {
        {
            .WakeupSourceId = ECUM_WKSOURCE_POWER,
            .WakeupSourceType = ECUM_WKSOURCE_POWER_ON,
            .ValidModes = 0xFF  /* 在所有睡眠模式下有效 */
        },
        {
            .WakeupSourceId = ECUM_WKSOURCE_CAN,
            .WakeupSourceType = ECUM_WKSOURCE_INTERNAL,
            .ValidModes = 0x01  /* 仅在睡眠模式0下有效 */
        },
        {
            .WakeupSourceId = ECUM_WKSOURCE_RESET,
            .WakeupSourceType = ECUM_WKSOURCE_RESET,
            .ValidModes = 0xFF  /* 在所有睡眠模式下有效 */
        }
    },
    
    /* 睡眠模式配置 */
    .SleepModeCount = 2,
    .SleepModes = {
        {
            .SleepModeId = ECUM_SLEEP_MODE_0,
            .McuMode = MCU_MODE_SLEEP,
            .WakeupSourceMask = 0x07  /* 所有唤醒源 */
        },
        {
            .SleepModeId = ECUM_SLEEP_MODE_1,
            .McuMode = MCU_MODE_STANDBY,
            .WakeupSourceMask = 0x05  /* 电源和复位唤醒源 */
        }
    }
};

6.2 应用场景

AUTOSAR模式管理系统适用于以下应用场景:

  1. 汽车启动与关闭流程

    • 控制ECU在车辆启动时的有序初始化
    • 管理车辆关闭时ECU的有序关闭
    • 确保关键组件在适当时机启动和关闭
  2. 节能与低功耗模式

    • 在车辆停止运行时将ECU置于低功耗状态
    • 根据实际需求激活或停用通信网络
    • 优化系统资源使用以延长电池寿命
  3. 部分网络唤醒

    • 选择性地唤醒特定网络和ECU
    • 仅在需要时激活通信资源
    • 在不影响功能的前提下降低能耗
  4. 故障管理与降级

    • 在故障情况下实现系统降级
    • 调整模式以维持关键功能
    • 确保安全功能在异常情况下仍然可用
  5. 诊断与服务

    • 支持诊断会话中的特殊模式
    • 在维护和服务时提供特殊功能
    • 确保系统可维护性和可诊断性

7. 总结

AUTOSAR模式管理系统是汽车电子控制单元(ECU)的关键组成部分,通过协调不同组件的状态和模式,实现了高效、可靠的系统运行。本文深入分析了AUTOSAR模式管理的架构、状态转换和交互机制,重点介绍了ECU状态管理器、通信管理器和BSW模式管理器三个核心组件。

AUTOSAR模式管理系统的主要优势包括:

  • 标准化架构:符合AUTOSAR标准,确保不同供应商组件的互操作性
  • 模块化设计:各组件职责明确,便于单独开发和测试
  • 灵活配置:可根据具体需求定制系统行为
  • 能源优化:通过合理管理模式转换降低系统能耗
  • 安全可靠:提供故障检测和处理机制,确保系统安全

在实际应用中,模式管理系统需要根据具体的硬件平台和功能需求进行配置和调整。通过合理设计状态转换策略和模式仲裁规则,可以实现更高效、更可靠的汽车电子系统。

随着汽车电子系统复杂度的不断提高,模式管理将在未来发挥更加重要的作用,特别是在电动汽车和自动驾驶领域,能源管理和功能安全将对模式管理提出更高的要求。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值