AUTOSAR 库详解
目录
1. 概述
1.1 AUTOSAR库的作用
AUTOSAR (AUtomotive Open System ARchitecture) 库是AUTOSAR标准的重要组成部分,为其他BSW (基础软件) 模块和应用软件组件 (SW-C) 提供基础功能支持。这些库提供了通用的、可重用的功能集合,可以被任何软件组件调用,无需通过复杂的RTE (运行时环境) 通信机制,极大地提高了开发效率和代码重用率。
AUTOSAR库提供的功能包括位操作、CRC校验计算、定点和浮点数学计算、插值函数以及端到端通信保护等,这些都是汽车电子控制单元 (ECU) 中常用的基础功能。
1.2 AUTOSAR库的类型
AUTOSAR标准定义了以下几种库:
- Bfx (位处理库):提供位操作相关功能
- Crc (CRC校验库):提供8位、16位、32位和64位CRC校验计算
- Mfx (定点数学计算库):提供定点数学计算功能
- Ifx (定点插值函数库):提供定点数插值功能
- Efx (定点扩展函数库):提供定点数扩展功能
- Mfl (浮点数学计算库):提供浮点数学计算功能
- Ifl (浮点插值函数库):提供浮点数插值功能
- E2E (端到端通信保护库):提供安全相关通信的保护功能
2. AUTOSAR库架构
2.1 整体架构
下图展示了AUTOSAR库的整体架构和组织结构,包括各个库模块及其与调用者的关系:
图2.1 AUTOSAR库架构图
该架构图清晰地展示了AUTOSAR库的组成部分和调用关系:
-
库模块组成:
- Bfx (位处理库):提供位级操作功能,如设置位、清除位、获取位等
- Crc (CRC校验库):包含8位、16位、32位和64位CRC计算功能
- 定点数计算库:包括Mfx (数学计算)、Ifx (插值函数) 和Efx (扩展函数)
- 浮点数计算库:包括Mfl (数学计算) 和Ifl (插值函数)
- E2E (端到端通信保护库):为安全相关通信提供保护
-
调用者:
- BSW模块:基础软件模块可以直接调用库功能
- 软件组件 (SW-C):应用软件组件可以直接调用库功能
- RTE:运行时环境也可以调用库功能
- 复杂驱动:复杂驱动程序可以调用库功能
-
库特点:
- 提供C函数接口
- 不依赖BSW模块函数
- 函数可重入
- 不通过端口访问,直接调用
- 函数名统一使用"Library short name_"前缀
- 行为不可配置,确保确定性
2.2 库的分类与功能
AUTOSAR库可根据功能类型分为以下几类:
-
基础数据处理库:
- Bfx (位处理库):提供位级操作,如位设置、清除、获取、逻辑操作等
- Crc (CRC校验库):提供多种标准的CRC校验算法,支持不同的计算方式和多项式
-
数值计算库:
- 定点数库:包括Mfx (基础数学计算)、Ifx (插值函数) 和Efx (扩展功能)
- 浮点数库:包括Mfl (基础数学计算) 和Ifl (插值函数)
-
通信保护库:
- E2E (端到端通信保护库):为安全相关的SW-C间通信提供保护机制
2.3 库在AUTOSAR架构中的位置
下图展示了AUTOSAR库在整个AUTOSAR架构中的位置和与其他模块的关系:
图2.3 AUTOSAR库与其他模块关系图
该图展示了AUTOSAR库在ECU软件架构中的特殊位置:
-
库的独立性:
- 库不属于传统的BSW层次结构(服务层、ECU抽象层、微控制器抽象层)
- 库提供横向服务,可被任何层级的组件调用
-
调用关系:
- 应用层软件组件可以直接调用库(虚线所示),而不通过RTE
- RTE可以调用库
- 所有BSW层组件(服务层、ECU抽象层、微控制器抽象层)都可以调用库
- 操作系统(OS)和ECU管理器(EcuM)也可以调用库
-
特殊性质:
- 库在ECU初始化最早阶段就可用
- 库可在ECU关闭最后阶段仍然可用
- 库不依赖于任何BSW模块
- 库通过直接调用方式使用,不经过RTE或端口机制
3. AUTOSAR库接口
3.1 接口设计原则
AUTOSAR库的接口设计遵循以下几个关键原则:
- 标准化:所有库函数使用统一的命名规则和接口风格
- 简单直接:不使用复杂的配置或调用机制,直接通过C函数调用
- 可重入性:所有库函数都必须是可重入的,以支持多任务环境
- 独立性:库函数不依赖其他BSW模块,只能调用其他库函数
- 确定性:对于给定的输入,库函数必须产生确定的输出,行为不可配置
3.2 库接口结构
下图展示了AUTOSAR库的接口结构和调用方式:
图3.2 AUTOSAR库接口类图
该类图详细说明了AUTOSAR库的接口结构:
-
库函数命名规则:
- 所有函数名以库的短名称为前缀,如
Bfx_GetBit()
、Crc_CalculateCRC32()
- 命名风格统一,确保可识别性和可读性
- 所有函数名以库的短名称为前缀,如
-
库接口特点:
- 每个库提供一个独立的头文件(如
Bfx.h
、Crc.h
等) - 头文件定义库的公共接口
- 头文件可能定义特定类型(如果AUTOSAR标准类型不足)
- 调用者直接包含库头文件,不通过RTE或端口机制
- 每个库提供一个独立的头文件(如
-
库的直接调用:
- 通过C标准的
#include
机制包含头文件 - 直接调用函数,无需通过RTE或端口
- 库函数行为确定不可配置
- 通过C标准的
-
类型定义:
- 库可以定义自己的特定类型,但仅限于AUTOSAR标准类型(如
std_types.h
)中未定义的类型 - 类型名称也使用库短名称前缀
- 库可以定义自己的特定类型,但仅限于AUTOSAR标准类型(如
3.3 库的使用方式
AUTOSAR库的使用方式非常直接:
- 包含库头文件:
#include "Bfx.h" // 包含位处理库
#include "Crc.h" // 包含CRC校验库
- 直接调用库函数:
boolean bitValue = Bfx_GetBit(data, position); // 获取位值
uint32 crcValue = Crc_CalculateCRC32(data, length, initialValue); // 计算CRC
- 函数调用特点:
- 调用不通过RTE或端口机制
- 库函数行为确定,不可配置
- 函数可在任何执行上下文中调用(任务、中断等)
4. AUTOSAR库调用机制
4.1 调用流程
下图展示了AUTOSAR库的调用流程和不同调用场景:
图4.1 AUTOSAR库调用流程序列图
该序列图说明了库调用流程的几个重要方面:
-
初始化阶段调用:
- 库在ECU启动最早阶段即可用
- 库不需要初始化
- OS/EcuM可以在初始化阶段调用库函数
-
BSW模块调用:
- BSW模块包含库头文件
- 直接调用库函数
- 库函数可调用其他库函数
- 库函数不能调用BSW模块函数
-
软件组件调用:
- 软件组件直接包含头文件(不通过RTE)
- 直接调用库函数
- 调用方式简单高效
4.2 错误处理机制
AUTOSAR库有统一的错误处理机制:
-
参数检查:
- 库函数在运行时检查输入参数
- 捕获错误情况如除以零、超出范围等
- 根据SWS规定,对错误情况返回固定值
- 返回值不可配置,确保行为一致
-
错误响应:
- 库函数不使用DET(默认错误跟踪器)或其他BSW错误处理机制
- 库函数必须自己处理错误并返回适当的错误值
- 错误处理逻辑必须内置在库函数中
4.3 分步计算机制
对于处理大量数据的库函数(特别是CRC计算),AUTOSAR提供了分步计算机制:
-
CRC分步计算:
- 支持分块计算大数据块
- 首次调用使用初始值(通常为0)
- 后续调用使用前一次计算的结果作为新的初始值
- 可避免长时间阻塞系统
- 允许看门狗重置
-
调用示例:
// 第一步:计算前16字节的CRC,初始值为0
uint32 crcValue = Crc_CalculateCRC32(dataChunk1, 16, 0);
// 第二步:计算接下来16字节的CRC,使用上一步的结果作为初始值
crcValue = Crc_CalculateCRC32(dataChunk2, 16, crcValue);
// 继续处理后续数据块...
5. AUTOSAR库的关键要求
5.1 功能要求
AUTOSAR对库模块提出了以下功能要求:
-
初始化与关闭:
- [SRS_LIBS_00002] 库必须在所有BSW模块和应用SW-C初始化之前即可操作
- [SRS_LIBS_00003] 库必须在关闭阶段仍然可操作,直到shutdown
- 库不需要初始化操作
-
接口规范:
- [SRS_LIBS_00004] 使用库不需要通过端口(直接调用)
- [SRS_LIBS_00005] 每个库必须提供一个头文件,命名为
<library short name>.h
- [SRS_LIBS_00011] 所有函数名和类型名必须以"Library short name_"为前缀
-
行为配置:
- [SRS_LIBS_00001] 库函数的功能行为不可配置
- [SRS_LIBS_00015] 可以配置微控制器,使库代码在所有调用者之间共享
-
内部调用限制:
- [SRS_LIBS_00018] 库函数只能调用其他库函数,不能调用BSW模块函数
5.2 非功能要求
AUTOSAR还对库模块提出了以下非功能要求:
-
重入性:
- [SRS_LIBS_00009] 所有库函数必须是可重入的
- 函数必须能处理来自多个任务的并发调用
-
性能优化:
- [SRS_LIBS_08518] CRC库必须提供不同的计算方法,优化性能或内存使用
- [SRS_LIBS_08521] 所有CRC例程必须支持大数据块的分步计算
-
错误处理:
- [SRS_LIBS_00013] 运行时检查输入参数的错误情况必须在SWS中列出
- 对于每种错误情况,必须返回SWS中规定的固定值
-
标准合规:
- [SRS_LIBS_08525] CRC库必须支持标准生成多项式
- [SRS_LIBS_08526] CRC库必须支持当前CRC计算标准
5.3 兼容性要求
为确保向后兼容性和稳定性,AUTOSAR对库接口提出了以下兼容性要求:
-
接口稳定性:
- [SRS_LIBS_00008] 一旦函数原型名称成为AUTOSAR最终发布的一部分,其行为和参数就不能再改变
- 如果需要修改规范,必须创建新的函数原型,保留旧的函数原型不变
-
类型定义:
- [SRS_LIBS_00010] 库只能定义自己的特定类型,前提是这些类型尚未被AUTOSAR定义
- 类型必须在库头文件中定义
-
参数传递:
- [SRS_LIBS_00012] 允许使用结构体传递参数
- 当参数较多或功能分组需要时,可以使用结构体简化调用
-
非AUTOSAR库:
- [SRS_LIBS_00016] 软件组件可以使用市场上可获得的非AUTOSAR库
- 供应商特定库应使用特定前缀以避免名称冲突
6. 总结
AUTOSAR库是AUTOSAR标准的重要组成部分,为整个软件架构提供了基础的、可重用的功能模块。它们具有以下关键特性:
-
直接可用性:
- 库不需要初始化,在ECU启动最早阶段即可使用
- 库在关闭阶段仍然可用
- 库提供直接的C函数接口,不通过RTE或端口机制
-
独立性:
- 库不依赖其他BSW模块
- 库函数只能调用其他库函数
- 所有库函数必须是可重入的
-
标准化:
- 统一的命名规则("Library short name_"前缀)
- 每个库提供一个标准头文件
- 函数行为一致且不可配置
-
基础功能覆盖:
- 位处理(Bfx)
- CRC校验(Crc)
- 定点和浮点数学计算(Mfx、Mfl)
- 插值函数(Ifx、Ifl)
- 端到端通信保护(E2E)
通过提供这些基础功能,AUTOSAR库简化了软件开发,提高了代码重用率,并确保了跨平台的兼容性。库的设计遵循AUTOSAR的标准化原则,使不同供应商的实现可以互相替换,同时保持接口稳定性和行为一致性。
在AUTOSAR软件架构中,库模块是一个独特的横向服务提供者,可以被从应用层到微控制器抽象层的任何组件直接调用,为整个软件栈提供基础功能支持。