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

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

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

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

 

 

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”

 

12、中断服务例程

中断服务程序(ISR)的实现是高度依赖于微控制器的。

 

ISR的实现依赖于平台:

如果BSW正在模块分为平台独立的模块,BSW不得执行中断服务例程。

 

保持ISR的运行时间尽可能短:

中断服务例程(ISR)和在中断上下文中运行的函数的运行时间应该保持较短。例如,从ISRs调用的回调函数也会影响运行时间。

如果ISR可能需要很长时间,那么应该使用操作系统任务

 

定义并记录ISR例程:

如果BSW模块实现了中断服务例程(ISR),则这些功能应按照BSW模块描述中的BSW模块描述模板[4]规范中的描述进行定义和文档化。

 

支持中断类CAT2:

如果BSW模块实现了中断服务例程(ISR),那么该实现至少应该支持中断类CAT2。

 

AUTOSAR架构不允许在应用程序级别的中断上下文中执行。考虑到这一点,需要特别注意由中断例程调用的嵌套函数。

 

从ISR到OS任务的过渡是受限制的:

如果BSW模块实现了中断服务例程(ISR),并且需要从ISR过渡到OS任务,那么这种过渡应该在基础软件的尽可能低的级别进行:

- 在CAT2 ISR情况下,它的上下文最后只能到RTE。

- 在CAT1 ISR情况下,他的上下文最后只能在MCAL layer。

 

处理中断的BSW模块应部分或全部作为源代码交付,以便能够编译为使用CAT1或CAT2中断。

示例:来自MCAL层的BSW模块作为目标代码交付。中断处理程序可以写成一对小存根(一个CAT1存根和一个CAT2存根),作为源代码交付。在模块集成过程中,根据需要编译代码—调用主处理程序。

 

13、受限的操作系统功能访问

为了避免BSW模块的操作系统集成过于复杂,有必要对操作系统服务的使用进行一些限制。

 

限制操作系统服务的使用

根据下表,BSW模块实现只允许使用OS服务:

Autosar知识:BSW生成规范要点-开发规范(下)_第2张图片

Autosar知识:BSW生成规范要点-开发规范(下)_第3张图片

 


 

13、对硬件寄存器的访问

并发访问寄存器:

所有可以直接访问硬件寄存器的BSW模块都应该允许从其他模块并发访问这些寄存器,特别是从复杂的驱动程序。以下寄存器将被要求:

   -由于配置原因而未使用的寄存器,例如通道或组未配置/启用

   -常用的寄存器,包括广泛使用的域或位,例如中断掩码、内存保护位等

BSW模块应该允许使用防御机制并发访问硬件寄存器

其行为和技术包括:

   -保护读-修改-写访问不被中断

   -使用原子(不可中断)指令进行读-修改-写访问

   -保护对必须一起修改的一组寄存器的访问不受中断

 

注意:

-多主系统(多核系统,采用DMA的系统)中的内存映射硬件寄存器假设只由一个主系统操作。

-内存映射硬件寄存器不会被不可屏蔽的中断例程或不可屏蔽的异常/陷阱例程操作。

 

访问“写一次”寄存器:

如果MCAL驱动程序初始化“写一次”寄存器,那么驱动程序应该提供配置选项来禁用具有访问这些寄存器的功能,或者具有对这些寄存器的依赖。

例子:

在MCU中,应该有一个开关来禁用对Mcu_InitClock()的调用,如果在启动代码期间执行了时钟设置,在AUTOSAR平台启动之前,并且硬件不允许重新配置。

 

14、数据类型

Autosar标准类型:

所有的AUTOSAR标准类型和常量都放在并组织在AUTOSAR标准类型标头(Std_Types.h)中。这头文件有:

- 包括硬件平台依赖的类型头文件 (Platform_Types.h)

- 包括编译器特殊语言扩展头文件 (Compiler.h)

- Std_ReturnType 定义 类型

- 定义 E_OK 和 E_NOT_OK 符号 和 它们 的 值

- 定义 STD_ON 和 STD_OFF 符号 和 它们 的 值

 

硬件平台依赖类型:

改变微控制器和编译器只能影响有限数量的文件。因此,在AUTOSAR中,目标和编译器特定范围的所有整数类型定义都放置在一个文件中,并组织在一个特定于平台的类型头文件中(Platform_Types.h)。

 

Autosar整型数据类型

自带c -数据类型(char、int、short、long)的使用通常不能在不同的平台上移植和重用。

 

不使用自带C数据类型

BSW模块不应使用自带C数据类型。而是使用AUTOSAR整数数据类型应使用。这些类型是在平台特定类型头(Platform_Types.h)中定义的。

平台特定类型标头(Platform_Types.h)是通过AUTOSAR标准类型标头(Std_Types.h)包含的。

 

数据类型的位数:

Autosar知识:BSW生成规范要点-开发规范(下)_第4张图片

Autosar知识:BSW生成规范要点-开发规范(下)_第5张图片

最小尺寸保证,为特定平台选择最佳类型(只允许模块内部使用,不允许作为API参数)

Autosar知识:BSW生成规范要点-开发规范(下)_第6张图片

如果需要最佳性能,可以选择后缀为_least的数据类型(例如for循环计数器)。

例如:uint8_least和uint32_least都可以在32位平台上编译为32位(牺牲了内存空间)。

 

提示:对于没有限制值范围的整数变量,应该使用Platform_Types.h中定义的AUTOSAR整数类型。

 

布尔类型:

对于简单的逻辑值,对于它们的检查和API的返回值,AUTOSAR类型布尔型,在Platform_Types.h中定义。用于这个类型,也定义了以下值:

FALSE = 0
TRUE = 1

 

允许对布尔变量进行操作:

对于布尔类型的变量,唯一允许的操作是:赋值、返回和相等、不等和逻辑not with TRUE或FALSE。

提供不能被禁用的布尔数据类型的编译器供应商必须更改他们的编译器(即使其符合ANSI C)。​​​​​​​

/* File Eep_21_LDExt.h: */
…
/* this automatically includes Platform_Types.h: */
#include "Std_Types.h"
…
boolean Eep_21_LDExt_Busy(void) {…}
…
/* File: calling module */
…
if (Eep_21_LDExt_Busy() == FALSE) {…}
…

 

15、在多分区系统上的分布式执行

AUTOSAR架构支持在多个分区上执行BSW模块功能,可能运行在不同的核心上。如果一个模块在多个分区上提供服务,那么:

1. RTE将服务调用传输到应该执行该调用的BSW模块实体所在的分区,或者

2. BSW模块实体在调用它的分区上接收调用,并自主地处理它的执行(4.1版本中新增的)。这意味着,它可以在同一个分区上执行调用,也可以将其转发给另一个分区,或者两者结合——这取决于BSW供应商的实现策略。

 

每个分区上都有相同的API

如果一个BSW模块实体可以从多个分区(例如,多个核)访问,那么它应该在每个分区上提供相同的API,模块实体应该可以访问。

多核安全:

如果一个BSW模块实体应该在多个分区(如多个核)上执行,那么整个模块实体代码应该是“并发安全的”。

注:“并发安全”指的是BSW模块实体的整体设计,该实体应在不同核上的多个分区中并行执行。例如,如果不同分区中的模块代码访问相同的数据,那么共享的数据应该受到排他区域的保护。

 

可重入函数代码:

如果向SWC提供了一个BSW模块实体,且该实体应在多个分区(如多个核)上执行,则该模块实体的功能代码应根据“并发安全”级别实现。

这允许在代码中为从不同分区调用的模块函数使用相同的入口点。然后,模块功能的分区特定处理应通过模块内的分区相关分支来实现。


 

 

 

 

 

 

 

 

 

 

 

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