AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral
AUTOSAR基础软件模块通用规范详解
目录
- 1. 概述
- 1.1 AUTOSAR架构简介
- 1.2 文档约定
- 2. AUTOSAR基础软件架构
- 2.1 分层架构
- 2.2 模块组织
- 3. BSW模块配置
- 3.1 配置类型
- 3.2 版本管理
- 4. BSW模块初始化
- 4.1 初始化流程
- 4.2 依赖管理
- 5. BSW模块状态管理
- 5.1 状态转换
- 5.2 错误处理
- 6. BSW模块API接口
- 6.1 通用API
- 6.2 错误处理API
- 7. 总结
1. 概述
1.1 AUTOSAR架构简介
本文档是AUTOSAR基础软件模块的通用规范,作为各个BSW模块的补充规范,为BSW模块定义了一套通用的工作产出和规则。
AUTOSAR(汽车开放系统架构)是一个标准化的汽车软件架构,旨在简化汽车电子控制单元(ECU)的开发和集成。其基础软件(BSW)是整个架构的核心,提供了标准化的接口和服务。
1.2 文档约定
本文档中的规范项描述了BSW模块实现或其部分与基础软件规范的关系。对于每个BSW模块,本文档和相应的BSW模块规范建立了规范项与基础软件需求之间的可追溯性。
2. AUTOSAR基础软件架构
2.1 分层架构
AUTOSAR采用分层架构设计,清晰地分离了不同层次的功能,提高了软件的可维护性和可移植性。
图2.1 AUTOSAR基础软件分层架构
图表解释:
应用层 (Application Layer):
- 功能:包含实现具体应用功能的软件组件(SWC)
- 组件:
- 应用软件组件(SWC):实现特定功能的软件单元,如车身控制、发动机管理等
- RTE:运行时环境,为应用软件组件提供标准接口,屏蔽底层实现细节
基础软件层 (Basic Software Layer):
- 功能:提供标准化的服务和硬件抽象
- 子层:
- 服务层:提供高层次的服务,如通信服务、内存服务、诊断服务和操作系统服务
- ECU抽象层:抽象ECU特定的硬件功能,包括通信硬件抽象、存储硬件抽象和I/O硬件抽象
- 微控制器抽象层(MCAL):直接操作微控制器硬件,提供标准化接口
- 复杂驱动层:处理复杂设备的驱动,直接连接到RTE和微控制器驱动
代码示例:
/* AUTOSAR BSW模块头文件示例 */
#ifndef MODULE_NAME_H
#define MODULE_NAME_H/* 标准AUTOSAR类型头文件 */
#include "Std_Types.h"
#include "ComStack_Types.h"/* 模块版本信息 */
#define MODULENAME_VENDOR_ID 42
#define MODULENAME_MODULE_ID 123
#define MODULENAME_SW_MAJOR_VERSION 2
#define MODULENAME_SW_MINOR_VERSION 5
#define MODULENAME_SW_PATCH_VERSION 1/* 服务层模块API */
Std_ReturnType ModuleName_Init(const ModuleName_ConfigType* ConfigPtr);
void ModuleName_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr);
Std_ReturnType ModuleName_ProvidedService(uint8 ServiceId);/* 微控制器抽象层的API调用示例 */
void ModuleInit_Example(void) {/* 调用MCAL模块接口 */Mcu_Init(&McuConfig); /* 初始化MCU */Port_Init(&PortConfig); /* 初始化IO端口 */Dio_WriteChannel(LED_CHANNEL, STD_HIGH); /* 设置IO状态 *//* 服务层模块初始化 */Com_Init(&ComConfig); /* 初始化通信模块 *//* 应用RTE接口示例 */Rte_Write_AppSignal_Value(signalValue);
}#endif /* MODULE_NAME_H */
2.2 模块组织
AUTOSAR基础软件层包含多个功能模块,每个模块都有特定的职责和标准化的接口。这些模块按照其功能和层次进行组织,形成一个完整的软件栈。
在AUTOSAR架构中,基础软件模块之间的依赖关系需要明确定义,以确保正确的初始化顺序和运行时行为。
3. BSW模块配置
3.1 配置类型
每个AUTOSAR BSW模块都需要一套配置结构,用于初始化和参数化模块行为。这些配置结构定义了模块的运行参数、功能选项和行为特征。
图3.1 AUTOSAR BSW模块配置类图
图表解释:
配置类型体系:
-
Std_VersionInfoType:
- 描述:标准版本信息类型,用于模块版本管理
- 属性:
- vendorID:供应商标识符,类型uint8
- moduleID:模块标识符,类型uint8
- sw_major_version:软件主版本号,类型uint8
- sw_minor_version:软件次版本号,类型uint8
- sw_patch_version:软件补丁版本号,类型uint8
-
ModuleConfigType:
- 描述:基础模块配置类型,所有BSW模块配置的基类
- 属性:
- moduleId:模块标识符,类型uint8
- moduleEnabled:模块启用状态,类型boolean
- moduleState:模块初始状态,类型uint8
- versionInfo:版本信息,类型Std_VersionInfoType
-
派生配置类型:
- Module_PreInitConfigType:预初始化配置,包含modulePreInitState
- Module_InitConfigType:初始化配置,包含moduleInitState和configDataPtr
- Module_PostBuildConfigType:后期构建配置,支持链接后配置修改
-
辅助配置类型:
- Module_PublishedInformationType:发布信息配置,包含idBase、numberOfInstances等
- Module_ConfigConsistencyHashType:配置一致性哈希,用于验证配置完整性
代码示例:
/* AUTOSAR BSW模块配置类型定义示例 *//* 标准版本信息类型 */
typedef struct {uint8 vendorID; /* 供应商ID,例如Bosch为1,Continental为2等 */uint8 moduleID; /* 模块ID,如Com=20, CanIf=60等 */uint8 sw_major_version; /* 软件主版本号 */uint8 sw_minor_version; /* 软件次版本号 */uint8 sw_patch_version; /* 软件补丁版本号 */
} Std_VersionInfoType;/* 基础模块配置类型 */
typedef struct {uint8 moduleId; /* 模块标识符 */boolean moduleEnabled; /* 模块启用状态 */uint8 moduleState; /* 模块初始状态 */Std_VersionInfoType versionInfo; /* 版本信息 */
} ModuleConfigType;/* 预初始化配置类型 */
typedef struct {ModuleConfigType moduleConfig; /* 基础模块配置 */uint8 modulePreInitState; /* 预初始化状态 */
} Module_PreInitConfigType;/* 初始化配置类型 */
typedef struct {ModuleConfigType moduleConfig; /* 基础模块配置 */uint8 moduleInitState; /* 初始化状态 */void* configDataPtr; /* 配置数据指针 */
} Module_InitConfigType;/* 后期构建配置类型 */
typedef struct {ModuleConfigType moduleConfig; /* 基础模块配置 */uint16 configChecksum; /* 配置校验和 */void* postBuildPtr; /* 后期构建指针 */
} Module_PostBuildConfigType;/* 模块配置实例初始化示例 */
const Module_InitConfigType ModuleConfig = {{ /* 基础模块配置 */123, /* moduleId */TRUE, /* moduleEnabled */MODULE_STATE_UNINIT, /* moduleState */{ /* 版本信息 */1, /* vendorID */20, /* moduleID */2, /* sw_major_version */5, /* sw_minor_version */0 /* sw_patch_version */}},MODULE_STATE_READY, /* moduleInitState */NULL /* configDataPtr */
};
3.2 版本管理
AUTOSAR BSW模块的版本管理是确保软件兼容性和可追溯性的关键部分。版本信息通常包含在模块的头文件中,并在运行时可通过API获取。
版本管理信息包括:
- 供应商ID (Vendor ID):标识开发模块的供应商
- 模块ID (Module ID):标识特定模块
- 软件版本:主版本、次版本和补丁版本
4. BSW模块初始化
4.1 初始化流程
AUTOSAR BSW模块遵循标准化的初始化流程,确保模块按照正确的顺序启动并建立必要的依赖关系。
图4.1 AUTOSAR BSW模块初始化序列图
图表解释:
初始化阶段:
-
预初始化阶段:
- 目的:执行基础设置,不依赖其他模块
- 操作:调用ModuleName_PreInit()函数
- 特点:只进行最基本的初始化,不涉及复杂依赖
-
初始化阶段:
- 目的:配置模块,建立模块间依赖
- 操作:调用ModuleName_Init(Config)函数
- 流程:
- 校验配置参数
- 调用依赖模块API
- 初始化内部数据和硬件接口
- 设置模块状态
-
周期函数启动阶段:
- 目的:启动模块的周期性任务
- 操作:调用ModuleName_MainFunction()函数
- 功能:执行需要定期处理的任务,与其他模块交互
-
应用程序启动阶段:
- 目的:使应用程序能够访问模块功能
- 操作:应用程序通过调用模块API使用服务
交互参与者:
- ECU启动:触发整个初始化流程
- BSW调度器:协调各模块的初始化和运行
- BSW模块:被初始化的目标模块
- 依赖模块:与目标模块有依赖关系的其他模块
- OS/硬件:底层操作系统和硬件平台
- 应用层:使用BSW模块服务的应用程序
代码示例:
/* AUTOSAR BSW模块初始化示例 *//* 预初始化函数 - 不依赖其他模块 */
void ModuleName_PreInit(void) {/* 基础硬件初始化,不涉及其他模块依赖 *//* 模块内部变量初始化为默认值 */moduleState = MODULENAME_STATE_PRE_INIT;/* 仅执行必要的自包含初始化步骤 */for (uint8 i = 0; i < MODULENAME_MAX_CHANNELS; i++) {moduleChannels[i].state = CHANNEL_STATE_IDLE;}
}/* 完整初始化函数 - 包含配置检查和依赖模块调用 */
Std_ReturnType ModuleName_Init(const ModuleName_ConfigType* ConfigPtr) {Std_ReturnType result = E_NOT_OK;/* 检查模块状态 */if (moduleState != MODULENAME_STATE_PRE_INIT) {/* 报告错误: 模块未处于预初始化状态 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_INIT_API_ID, MODULENAME_E_UNINIT);return E_NOT_OK;}/* 参数检查 */if (ConfigPtr == NULL) {/* 报告错误: 配置指针为空 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_INIT_API_ID, MODULENAME_E_PARAM_POINTER);return E_NOT_OK;}/* 检查配置版本兼容性 */if ((ConfigPtr->versionInfo.sw_major_version != MODULENAME_SW_MAJOR_VERSION) ||(ConfigPtr->versionInfo.sw_minor_version != MODULENAME_SW_MINOR_VERSION)) {/* 报告错误: 版本不匹配 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_INIT_API_ID, MODULENAME_E_VERSION_MISMATCH);return E_NOT_OK;}/* 调用依赖模块API */if (DependModule_GetState() != DEPENDMODULE_STATE_READY) {/* 初始化依赖模块(如果需要) */result = DependModule_Init(&dependModuleConfig);if (result != E_OK) {/* 报告错误: 依赖模块初始化失败 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_INIT_API_ID, MODULENAME_E_DEPEND_MODULE);return E_NOT_OK;}}/* 保存配置 */moduleConfig = ConfigPtr;/* 初始化内部数据结构 */for (uint8 i = 0; i < ConfigPtr->numChannels; i++) {moduleChannels[i].config = &ConfigPtr->channelConfigs[i];moduleChannels[i].state = CHANNEL_STATE_READY;}/* 初始化硬件接口(如果适用) */HW_Init(&ConfigPtr->hwConfig);/* 设置模块状态 */moduleState = MODULENAME_STATE_INIT;return E_OK;
}/* 主函数 - 周期性调用 */
void ModuleName_MainFunction(void) {/* 检查模块状态 */if (moduleState != MODULENAME_STATE_INIT && moduleState != MODULENAME_STATE_RUNNING) {/* 模块未初始化,不执行任何操作 */return;}/* 执行周期性任务 */for (uint8 i = 0; i < moduleConfig->numChannels; i++) {/* 处理每个通道的状态 */ProcessChannelState(&moduleChannels[i]);/* 与其他模块交互 */if (moduleChannels[i].state == CHANNEL_STATE_ACTIVE) {DependModule_ProcessData(moduleChannels[i].data);}}/* 第一次主函数调用后,将状态设置为RUNNING */if (moduleState == MODULENAME_STATE_INIT) {moduleState = MODULENAME_STATE_RUNNING;}
}
4.2 依赖管理
BSW模块之间存在复杂的依赖关系,正确管理这些依赖是确保系统稳定性的关键。AUTOSAR规定了明确的模块初始化顺序,确保依赖模块在被依赖模块之前初始化。
依赖管理的关键点:
- 模块初始化顺序遵循依赖关系图
- 低层模块先于高层模块初始化
- 模块应检查其依赖模块的状态
- 初始化失败应向上传播错误
5. BSW模块状态管理
5.1 状态转换
AUTOSAR BSW模块实现了标准化的状态管理机制,确保模块在整个生命周期中的行为一致性和可预测性。
图5.1 AUTOSAR BSW模块状态转换图
图表解释:
模块状态:
-
未初始化(UNINIT):
- 描述:上电后的初始状态,模块未被初始化
- 特点:模块功能不可用,API调用可能返回错误
- 转换:通过ModuleName_PreInit()转换到PRE_INIT状态
-
预初始化(PRE_INIT):
- 描述:模块已执行基础初始化,但配置未加载
- 特点:只有基本功能可用,大部分API不可用
- 转换:通过ModuleName_Init(Config)转换到INIT状态
-
初始化(INIT):
- 描述:模块已完成配置加载和初始化
- 特点:所有API可用,但模块可能尚未完全激活
- 转换:初始化成功后自动转换到RUNNING状态
-
运行(RUNNING):
- 描述:模块完全运行状态,所有功能可用
- 特点:模块执行正常功能,定期调用MainFunction
- 转换:通过ModuleName_PrepareShutdown()转换到PREPARE_SHUTDOWN状态
-
关闭准备(PREPARE_SHUTDOWN):
- 描述:模块准备关闭,完成未完成的操作
- 特点:限制新请求,完成现有操作
- 转换:通过ModuleName_Shutdown()转换到SHUTDOWN状态
-
关闭(SHUTDOWN):
- 描述:模块已关闭,资源已释放
- 特点:模块功能不可用,API调用返回错误
- 转换:通过系统重置转换到UNINIT状态
-
错误(ERROR):
- 描述:模块遇到无法恢复的错误
- 特点:模块功能受限或不可用
- 转换:通过系统重置或恢复机制转换到UNINIT状态
状态转换触发:
- 正常初始化路径:UNINIT → PRE_INIT → INIT → RUNNING
- 正常关闭路径:RUNNING → PREPARE_SHUTDOWN → SHUTDOWN → UNINIT
- 错误处理路径:任何状态 → ERROR → UNINIT
代码示例:
/* AUTOSAR BSW模块状态管理示例 *//* 模块状态定义 */
typedef enum {MODULENAME_STATE_UNINIT = 0, /* 未初始化状态 */MODULENAME_STATE_PRE_INIT = 1, /* 预初始化状态 */MODULENAME_STATE_INIT = 2, /* 初始化状态 */MODULENAME_STATE_RUNNING = 3, /* 运行状态 */MODULENAME_STATE_PREPARE_SHUTDOWN = 4, /* 准备关闭状态 */MODULENAME_STATE_SHUTDOWN = 5, /* 关闭状态 */MODULENAME_STATE_ERROR = 0xFF /* 错误状态 */
} ModuleName_StateType;/* 模块当前状态 */
static ModuleName_StateType moduleState = MODULENAME_STATE_UNINIT;/* 状态获取函数 */
ModuleName_StateType ModuleName_GetState(void) {return moduleState;
}/* 状态转换示例 - 关闭准备 */
Std_ReturnType ModuleName_PrepareShutdown(void) {/* 检查当前状态是否允许转换 */if (moduleState != MODULENAME_STATE_RUNNING) {/* 报告错误: 模块不在运行状态 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_PREPARESHUTDOWN_API_ID, MODULENAME_E_INVALID_STATE);return E_NOT_OK;}/* 完成所有未完成的操作 */for (uint8 i = 0; i < moduleConfig->numChannels; i++) {/* 如果通道有未完成的操作,等待完成或中止 */if (moduleChannels[i].pendingOperations > 0) {FinishPendingOperations(&moduleChannels[i]);}}/* 更新模块状态 */moduleState = MODULENAME_STATE_PREPARE_SHUTDOWN;/* 通知依赖模块(如果需要) */NotifyModuleStateChange(MODULENAME_STATE_PREPARE_SHUTDOWN);return E_OK;
}/* 状态转换示例 - 关闭 */
Std_ReturnType ModuleName_Shutdown(void) {/* 检查当前状态是否允许转换 */if (moduleState != MODULENAME_STATE_PREPARE_SHUTDOWN) {/* 报告错误: 模块未处于准备关闭状态 */Det_ReportError(MODULENAME_MODULE_ID, 0, MODULENAME_SHUTDOWN_API_ID, MODULENAME_E_INVALID_STATE);return E_NOT_OK;}/* 释放资源 */for (uint8 i = 0; i < moduleConfig->numChannels; i++) {ReleaseChannelResources(&moduleChannels[i]);}/* 重置内部变量 */ResetModuleVariables();/* 更新模块状态 */moduleState = MODULENAME_STATE_SHUTDOWN;return E_OK;
}/* 错误状态处理示例 */
void ModuleName_HandleError(uint8 errorId) {/* 记录错误信息 */moduleLastError = errorId;/* 尝试安全处理错误 */switch (errorId) {case MODULENAME_E_MINOR_ERROR:/* 可恢复的轻微错误,尝试恢复 */if (RecoverFromError(errorId) == E_OK) {/* 恢复成功,保持当前状态 */return;}break;case MODULENAME_E_MAJOR_ERROR:case MODULENAME_E_FATAL_ERROR:/* 严重错误,无法恢复 */break;default:/* 未知错误 */break;}/* 无法恢复,转入错误状态 */moduleState = MODULENAME_STATE_ERROR;/* 通知系统错误管理器 */Dem_ReportErrorStatus(MODULENAME_E_ERROR_STATUS, DEM_EVENT_STATUS_FAILED);
}
5.2 错误处理
AUTOSAR提供了标准化的错误处理机制,确保系统能够检测、报告和管理模块中的错误。
错误处理机制包括:
- 开发错误检测(DET):用于检测和报告开发阶段的错误
- 故障管理(DEM):用于生产环境中的错误报告和管理
- 运行时错误处理:模块内部的错误检测和恢复机制
6. BSW模块API接口
6.1 通用API
AUTOSAR规范要求每个BSW模块提供一组标准化的API接口,确保模块之间的一致性和互操作性。
图6.1 AUTOSAR BSW模块通用API接口图
图表解释:
API接口组成:
-
通用API接口:
- 描述:每个AUTOSAR BSW模块必须实现的标准接口
- 函数:
- ModuleName_Init():初始化模块
- ModuleName_GetVersionInfo():获取模块版本信息
- ModuleName_GetState():获取模块当前状态
- ModuleName_MainFunction():执行周期性任务
- ModuleName_Shutdown():关闭模块
-
配置类型:
- 描述:模块配置结构,定义初始化参数
- 属性:
- moduleId:模块标识符
- moduleEnabled:模块启用状态
- versionInfo:版本信息
- specificConfig:模块特定配置
-
错误处理:
- 描述:提供错误报告和管理功能
- 函数:
- ModuleName_ReportError():报告错误
- ModuleName_GetErrorStatus():获取错误状态
- ModuleName_ClearError():清除错误
-
高级接口:
- 描述:模块特定的扩展功能
- 函数:
- ModuleName_SpecificFunction1():模块特定功能1
- ModuleName_SpecificFunction2():模块特定功能2
- ModuleName_CallbackFunction():回调函数
-
版本定义:
- 描述:定义模块版本常量
- 常量:
- MODULENAME_VENDOR_ID:供应商ID
- MODULENAME_MODULE_ID:模块ID
- MODULENAME_SW_MAJOR_VERSION:软件主版本号
- MODULENAME_SW_MINOR_VERSION:软件次版本号
- MODULENAME_SW_PATCH_VERSION:软件补丁版本号
代码示例:
/* AUTOSAR BSW模块API接口示例 *//* 模块头文件 */
#ifndef MODULENAME_H
#define MODULENAME_H/* 包含标准类型定义 */
#include "Std_Types.h"/* 模块版本定义 */
#define MODULENAME_VENDOR_ID 42
#define MODULENAME_MODULE_ID 123
#define MODULENAME_SW_MAJOR_VERSION 2
#define MODULENAME_SW_MINOR_VERSION 5
#define MODULENAME_SW_PATCH_VERSION 1/* API服务ID定义 */
#define MODULENAME_INIT_API_ID 0x01
#define MODULENAME_GETVERSIONINFO_API_ID 0x02
#define MODULENAME_GETSTATE_API_ID 0x03
#define MODULENAME_MAINFUNCTION_API_ID 0x04
#define MODULENAME_SHUTDOWN_API_ID 0x05/* 错误代码定义 */
#define MODULENAME_E_UNINIT 0x10
#define MODULENAME_E_ALREADY_INIT 0x11
#define MODULENAME_E_PARAM_POINTER 0x12
#define MODULENAME_E_INVALID_STATE 0x13
#define MODULENAME_E_VERSION_MISMATCH 0x14/* 模块状态类型定义 */
typedef enum {MODULENAME_STATE_UNINIT = 0,MODULENAME_STATE_INIT = 1,MODULENAME_STATE_RUNNING = 2,MODULENAME_STATE_SHUTDOWN = 3,MODULENAME_STATE_ERROR = 0xFF
} ModuleName_StateType;/* 模块配置类型定义 */
typedef struct {uint8 moduleId;boolean moduleEnabled;Std_VersionInfoType versionInfo;/* 模块特定配置... */
} ModuleName_ConfigType;/* 核心API函数 *//* 初始化函数 */
Std_ReturnType ModuleName_Init(const ModuleName_ConfigType* ConfigPtr
);/* 获取版本信息 */
void ModuleName_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr
);/* 获取模块状态 */
ModuleName_StateType ModuleName_GetState(void);/* 主函数 - 周期调用 */
void ModuleName_MainFunction(void);/* 关闭函数 */
Std_ReturnType ModuleName_Shutdown(void);/* 错误处理函数 */
void ModuleName_ReportError(uint8 instanceId,uint8 apiId,uint8 errorId
);uint8 ModuleName_GetErrorStatus(uint8 instanceId
);void ModuleName_ClearError(uint8 instanceId
);/* 模块特定功能函数 */
Std_ReturnType ModuleName_SpecificFunction1(uint8 param1,uint16 param2
);void ModuleName_SpecificFunction2(uint8 param1
);/* 回调函数类型定义 */
typedef void (*ModuleName_CallbackFunctionType)(uint8 eventId,uint8 status
);/* 回调注册函数 */
Std_ReturnType ModuleName_RegisterCallback(ModuleName_CallbackFunctionType callbackFunc
);#endif /* MODULENAME_H */
6.2 错误处理API
AUTOSAR BSW模块应提供标准化的错误处理API,用于报告、查询和管理模块内的错误状态。这些API与开发错误跟踪(DET)和诊断事件管理(DEM)模块集成,提供全面的错误管理能力。
7. 总结
AUTOSAR基础软件模块通用规范提供了BSW模块实现的基础框架,确保了不同模块之间的一致性和互操作性。通过标准化的架构、配置、初始化、状态管理和API接口,AUTOSAR简化了复杂汽车电子系统的开发,提高了软件质量和可重用性。
主要优势包括:
- 标准化的模块结构和接口
- 清晰的层次化架构
- 一致的配置和初始化机制
- 可靠的状态管理和错误处理
- 良好的可移植性和可维护性
遵循这些规范的BSW模块可以更容易地集成到AUTOSAR系统中,提高开发效率,降低成本,并确保跨平台和跨供应商的兼容性。