Autosar知识:BSW生成规范要点-开发规范(上)

本文摘抄了《AUTOSAR_SWS_BSWGeneral》中关于功能、接口、软件配置相关内容。着重于对开发者有用的内容。

虽说内容比较枯燥,但作为开发者必须认真阅读并了解这些内容。

Autosar知识:BSW生成规范要点-开发规范(上)_第1张图片 标题 声明:本文章属Autosar官方技术文档搬运,不具有任何商业用途。

 

 

1、平台独立性和编译器抽象

根据其对实现平台的依赖,该规范将BSW模块分为两类:

  - 平台独立 BSW 模块: 所有BSW 模块除了 复杂驱动, MCAL 模块 和 OS.

  - 平台依赖 BSW 模块: MCAL 模块, 复杂驱动, OS.

平台依赖包括对使用的工具链和硬件的依赖。与编译器和处理器相关的平台相关的BSW模块拥有或可能拥有对微控制器硬件的直接访问。因此,它们的实现是特定于平台的独立于平台的BSW模块可以开发一次,然后无需任何更改就可以在所有平台上编译。任何必要的处理器或编译器的特定指令(如内存定位符、编译程序、原子位操作的使用等)都必须被宏封装并通过包含文件导入这对于最小化变量的数量和相应的开发工作是必要的。

 

2、可配置性

配置工具可以在配置期间或预处理器在运行时对配置参数进行合理性检查。

详细的配置规则和约束也可以是模块自己的规范和BSW模块的文档的一部分,它是随模块实现一起交付的。

BSW模块的可选功能不应消耗资源(RAM、ROM和运行时)。可以使用适当的配置参数在预编译时启用或禁用这些功能。

如果BSW正在实现的配置可选功能模块包含可选的功能,那么这个功能应当启用(STD_ON)或禁用(STD_OFF)由预编译时间配置参数。

禁用的功能将不会成为已编译代码的一部分。如果代码是自动生成的,例如在配置之后,禁用的功能甚至可能不是源代码的一部分。如果BSW软件提供商不支持这种配置,那么它也可能永远不会被实现。

这些符号STD_ON和STD_OFF及其值在Std_Types.h中定义

 

3、不同的命名约定

空格用下划线替代

枚举文字、状态值和预处理指令的命名约定:

所有枚举文字,状态值和预处理程序指令(# define)应标记在以下方式:

<大模块缩写>_<具体名称>

例如:

typedef enum

{

    EEP_21_LDEXT_DRA_CONFIG,

    EEP_21_LDEXT_ARE,

    EEP_21_LDEXT_EV

} Eep_21_LDExt_NotificationType;

#define EEP_21_LDEXT_PARAM_CONFIG
#define EEP_21_LDEXT_SIZE

错误值的命名约定:

 

<大模块缩写>_E_<具体名称>

例如 EEPROM 驱动的错误值:

EEP_21_LDEXT_E_BUSY

EEP_21_LDEXT_E_PARAM_ADDRESS

EEP_21_LDEXT_E_PARAM_LENGTH

EEP_21_LDEXT_E_WRITE_FAILED

 

 

4、配置参数

配置参数名称的命名约定

未公布的配置参数的配置参数名称,应当采用下列方式之一命名:

驼峰命名: <BSW模块缩写><参数名>

如果配置参数被发布,则使用以下约定之一应使用:

驼峰命名: _<供应商id>_<供应商中缀><参数名> 

驼峰命名的参数为:具体参数名称

全大写命名:是特定参数的名字

参数名由几个单词组成,这些单词可以用下划线分隔,也可以不用下划线分隔

 

5、共享代码

重复的代码可能会在代码维护期间导致bug。这可以通过在必要时共享代码来避免。共享代码简化了功能组合、可重用性、代码大小减少和可维护性。

 

6、避免代码重复

BSW模块的实现应该避免代码的重复。

注意,如果BSW模块实现了共享代码,那么实现可能需要确保该代码的可重入性(如果它暴露于抢占式环境)。可重入性支持是API规范的一部分。

 

7、全局数据

为了避免全局数据的多重定义和不受控制的传播

全局变量必须是有限的。

定义全局变量:如果BSW模块定义了全局变量,那么他们的定义应当发生在实现源文件。

为全局变量命名约定:所有由BSW模块定义的全局变量应按照以下规定进行标识:

其中为BSW模块的模块实现前缀,为变量名,以驼峰大小写写入。

全局变量名的例子:

- Can_21_Ext_MessageBuffer[CAN_21_EXT_BUFFER_LENGTH]

- Nm_RingData[NM_RINGDATA_LENGTH]

原则上,在抢占式运行时环境中,由于额外的阻塞工作,应该避免所有全局数据。如果不采取预防措施,可能会发生无法预料的后果。如果数据用作常量数据,则仅在使用const限定符显式声明数据为只读时才允许全局公开。

定义常数全局变量

如果BSW模块定义了具有只读目的的全局变量,则应该通过将const限定符分配给它们的定义和声明来将其形式化。

 

8、宏和内联函数的使用

允许使用宏和内联函数而不是函数来改进运行时行为。必须特别注意可重入的功能。

例如,允许使用宏和内联函数来改进运行时行为。建议考虑MISRA-C 2012关于内联函数和宏的规则。

宏可以代替使用源代码和运行时很关键的函数。内联函数可以用于相同的目的。内联函数的优点是(与宏相比)编译器可以对函数参数和返回值进行类型检查。

 

9、调用调度函数(主要处理函数)

为了避免BSW模块之间的间接和非透明定时依赖关系,调度函数的调用被限制在BSW调度器提供的任务体中。

调用调度函数是受限制的:BSW模块实现不应包含对预定函数(主要处理函数)的调用。

调用未初始化的BSW模块的调度函数可能会导致不希望的和未定义的行为。

未初始化调度函数的行为:如果从BSW调度器调用未初始化的BSW模块的调度函数(主要处理函数),则它应立即返回,而不执行任何功能,也不会引发任何错误。

 

10、专属区域

定义排他区域是为了确定优先级,以防止同时访问共享资源。每个专用区域都有唯一的名称。

排他区域的描述包括访问调度函数(主要处理函数)、API服务、回调函数和ISR函数。

定义并记录独占区域: BSW模块的专属区域应按照BSW模块描述中的《BSW模块描述模板》规范中的描述进行定义和文档化。

 

限制专属区域的使用: BSW模块的专用区域只能保护模块内部数据。

 

11、调出函数

定义调出函数的原型:

如果BSW模块使用调出函数,那么它应该在自己的实现头中定义调出的原型

包含Callout函数实现的文件可以包含这个头文件来检查Callout的声明和定义是否匹配。

 

Callout函数原型声明的约定:

用于声明调出函数原型的下列约定应使用:

/* --- 开始分段宏定义: --- */
#define _START_SEC__CODE
/* --- Function prototype definition: --- */
FUNC(void, __CODE)  (void);
/* --- 结束分段宏定义: --- */
#define _STOP_SEC__CODE

 

其中是调用模块的模块实现前缀,是Callout名称,该名称应该与Callout名称(包括模块引用)具有相同的拼写,但是用大写字母表示,是Callout名称,使用传统的驼峰大小写表示法表示API名称。

 

模块开发人员不知道用于调出函数的内存段。集成器需要独立于模块设计的自由来映射这些函数。

 

调出函数的内存段和内存类:

每个调出函数都应该映射到它自己的内存段和内存类。然后在集成时将这些内存类映射到实际实现的内存类。

#define COM_START_SEC_SOMEMODULE_SOMECALLOUT_CODE
#include “Com_MemMap.h”
FUNC(void, COM_SOMEMODULE_SOMECALLOUT_CODE)
Somemodule_SomeCallout (void);
#define COM_STOP_SEC_SOMEMODULE_SOMECALLOUT_CODE
#include “Com_MemMap.h”

 

 

 

 

 

你可能感兴趣的:(Autosar知识:BSW生成规范要点-开发规范(上))