AUTOSAR架构下QM Application如何访问ASIL Application

发布于 2023-11-20 10:55
浏览
0收藏

前言

在实现功能安全需求时一般会划分QM Application(非功能安全Application)和ASIL Application(功能安全Application),QM Application下会包含QM相关的Task, ISR e.g., ASIL Application下包含ASIL相关的Task, ISR e.g.且QM Application是No Trusted的,ASIL Application是Trusted的,QM Application下的Object的数据应该是独立的Data/Code memory Range,ASIL Application下的Object的数据也应该是独立的Data/Code memory range,这些memory range分别都配置了MPU权限。因为ASIL Application是Trusted的,那么ASIL下的Object(Task, ISR e.g.)可以调用QM下的Object的API(读写数据,执行代码),但是QM下的Object就不能使用ASIL下的Object的服务了(会产生MPU内部保护Error)。但是,在实际工程项目中不可避免的会出现QM Application访问ASIL Application的情况(比如QM的SWC需要访问ASIL的MCAL)那该怎么办了?本文就来介绍AUTOSAR架构下如何在QM Application下调用ASIL Application的接口。


目录

1. 相关概念介绍

    1.1 什么是Partition

.2 什么是Application

    1.3 Partition和Application的关系

    1.4 Application和Memory Protection的关系

    1.5 什么是Trusted Application

2. 方案总览

3. 具体示例

4. 总结


缩略词

简写

全称

ASIL

Automotive Safety Integrity Level

QM

Quality Management, QM意味着根据公认的质量原则进行开发足以降低风险。

ISR

Interrupt Service Router

SWC

Software Component

MPU

Memory Protection Unit

注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.相关概念介绍

1.1 什么是Partition

在 AUTOSAR 中,分区是包含一组应用 SWC 和 / 或基础软件模块 的Container。 分区具有从 QM 到 ASIL D 的 SIL ,并具有专用的内存保护集(Protection Set)。

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

多个分区可以共享一个内核,从而允许在一个内核上执行混合 ASIL 软件。

1.2 什么是Application

AUTOSAR 操作系统必须能够支持组成一个功能单元的操作系统对象 (任务,中断,警报,挂钩等) 集合。此对象集合称为 OS-Application。属于同一个 OS-Application 的所有对象都可以相互访问。访问是指允许在 API 服务中使用这些对象。其他应用程序的访问权限可以单独授予。

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

1.3 Partition和Application的关系

在 AUTOSAR 中,Partition由 OS 应用程序实现。因此,这两个术语通常是同义使用的。

1.4 Application和Memory Protection的关系

Application可以配置App Memory Protection Identifier, 也就是指定该Application和哪个Protection Set绑定,而每个OS Memory Region会指定哪个Protection Set对齐有哪种访问权限(R, W, X),这样Application对每一块Memory Region的访问权限就确定了。

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

1.5 什么是Trusted Application

Application下Trusted配置项可以配置该Application是否是Trusted, Trusted Application下的所有Objects都是Trusted.

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

OS在执行Trusted的Task或者ISR(属于某个软件Part,也就是Parttion或者OsApplication)时会将PSW.S置位。


问题:PSW.S置位对软件执行有啥影响了?


:PSW.S置位,也就是OS Applications是Trusted,那么其包含的软件运行时将处于Supoervisor mode,如果没有设置OsTrustedApplicationWithProtection,那么软件可以访问整个内存空间(除了stack regions)。

2.方案总览

如下图所示,QM module不能直接调用ASIL module的Function_X_Api(),需要通过一个QMToASILSwitcher的中转模块实现。QM module调用QMToASILSwitcher_ToTrusted(),QMToASILSwitcher_ToTrusted调用OS的系统调用接口CallTrustedFunction触发OS Trap,OS Trap会调用配置好的QMToASILSwitcher_ToTrusted_Callback(),QMToASILSwitcher_ToTrusted_Callback中调用ASIL Module的API.

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

Note 1: CallTrustedFunction函数介绍

typedef P2VAR(void, TYPEDEF, OS_APPL_DATA) TrustedFunctionParameterRefType;

typedef enum
{
  QMToASILSwitcher_TrustedFunction_Core0 = 0,  
  QMToASILSwitcher_TrustedFunction_Core1 = 1,  
  QMToASILSwitcher_TrustedFunction_Core2 = 2,  
  QMToASILSwitcher_TrustedFunction_Core3 = 3,  
  QMToASILSwitcher_TrustedFunction_Core4 = 4,  
  QMToASILSwitcher_TrustedFunction_Core5 = 5,  
  OS_TRUSTEDFUNCTIONID_COUNT = 6
} TrustedFunctionIndexType;

FUNC(StatusType, OS_CODE) CallTrustedFunction(TrustedFunctionIndexType FunctionIndex,TrustedFunctionParameterRefType FunctionParams)
{
  Os_StatusType status;
  /* #10 If a trap is needed: */
  if(Os_TrapIsTrapForWriteAccessRequired() != 0u)                                                                       
  {
    Os_TrapPacketType packet;
    /* #20 Marshal API data. */
    packet.TrapId = OS_TRAPID_CALLTRUSTEDFUNCTION;
    packet.Parameters[OS_TRAPPARAMINDEX_1].ParamApiType.ParamTrustedFunctionIndexType = FunctionIndex;                  /* SBSW_OS_PWA_LOCAL */
    packet.Parameters[OS_TRAPPARAMINDEX_2].ParamApiType.ParamTrustedFunctionParameterRefType = FunctionParams;          /* SBSW_OS_PWA_LOCAL */
    /* #30 Trigger trap. */
    Os_Hal_Trap(&packet);                                                                                               /* SBSW_OS_FC_POINTER2LOCAL */
    /* #40 Unmarshal return value. */
    status = packet.ReturnValue.ReturnOs_StatusType;
  }
  /* #50 Otherwise: */
  else
  {
    /* #50 Call the API directly. */
    status = Os_TrapCallCallTrustedFunction(FunctionIndex, FunctionParams);                                             /* SBSW_OS_TRAP_API_USERPOINTER_001 */
  }

  return Os_ErrReportCallTrustedFunction(status, FunctionIndex, FunctionParams);                                        /* SBSW_OS_TRAP_ERRREPORT_001 */
}

CallTrustedFunction的FunctionIndex参数是指定哪一个OS Trap后调用的Callback函数,FunctionParams是一个void *类型的数据,可由用户自定义,可传递用户定义的任意数据。


Note 2:  OS进入Trap后调用的Callback函数类型如下,参数和CallTrustedFunction一样,这样QM Module就能传递信息到ASIL Module。

/*! Type of user provided trusted functions. */
typedef P2FUNC(void, OS_CODE, Os_ServiceTfCbkType)
(
  TrustedFunctionIndexType,                                                                                             /* PRQA S 1336 */ /* MD_Os_Rule8.2_1336 */
  TrustedFunctionParameterRefType                                                                                       /* PRQA S 1336 */ /* MD_Os_Rule8.2_1336 */
);

3.具体示例

QM Module: User_SWC


ASIL Module: Mcal Dio


User_SWC的User_SWC_DioWrite()需要调用Dio的Dio_WrieChannel();


第1步:配置OsApplication的TrustedFunction,也就是上文说的Callback函数。

AUTOSAR架构下QM Application如何访问ASIL Application -汽车开发者社区

第2步:改写User_SWC_DioWrite()

没改写前:

User_SWC_DioWrite(Dio_ChannelType ChannelId, Dio_LevelType Level)
{
  Dio_WriteChannel (ChannelId, Level);
};

改写后:

typedef struct
{
  Dio_ChannelType ChannelId;
  Dio_LevelType Level;
} Dio_WriteChannel_Param_Type;

User_SWC_DioWrite(Dio_ChannelType ChannelId, Dio_LevelType Level)
{
  Dio_WriteChannel_Param_Type Config;
  Config. ChannelId = ChannelId;
  Config. Level = Level;
  QMToASILSwitcher_ToTrusted(&Config);
};

第3步:实现QMToASILSwitcher_ToTrusted()

QMToASILSwitcher_ToTrusted(void * Data)
{
  CallTrustedFunction(QMToASILSwitcher_TrustedFunction_Core0, Data);
};

第4步:实现QMToASILSwitcher_TrustedFunction_Core0()函数

QMToASILSwitcher_TrustedFunction_Core0(TrustedFunctionIndexType FunctionIndex, TrustedFunctionParameterRefType FunctionParams)
{
  void(FunctionIndex);
  Dio_WriteChannel_Param_Type Data = Dio_WriteChannel_Param_Type(FunctionParams);
  Dio_WriteChannel(Data. ChannelId, Data.Level);
};

这样,QM Module调用User_SWC_DioWrite() à  QMToASILSwitcher_ToTrusted() à CallTrustedFunction() à 触发OS Trap à OS调用QMToASILSwitcher_TrustedFunction_Core0() à Dio_WriteChannel().完成了QM Module到ASIL Module的访问。

4.总结

本文介绍了QM Application如何访问ASIL Application,关键就是OS提供的CallTrustedFunction()函数的调用,QM调用CallTrustedFunction通过void *参数传递参数信息且同时触发OS Trap,OS Trap能够调用预先配置好的Trusted Callback且能拿到QM传递的调用参数,最后Trussted Callback完成真正的功能调用。给出的示例及其简单,仅供了解原理参考,实际的工程应用还得根据项目情况考虑非常多的情况。


文章转载自公众号:汽车电子嵌入式

分类
标签
收藏
回复
举报
回复
相关推荐