前言
在实现功能安全需求时一般会划分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
1.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)。
多个分区可以共享一个内核,从而允许在一个内核上执行混合 ASIL 软件。
1.2 什么是Application
AUTOSAR 操作系统必须能够支持组成一个功能单元的操作系统对象 (任务,中断,警报,挂钩等) 集合。此对象集合称为 OS-Application。属于同一个 OS-Application 的所有对象都可以相互访问。访问是指允许在 API 服务中使用这些对象。其他应用程序的访问权限可以单独授予。
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的访问权限就确定了。
1.5 什么是Trusted Application
Application下Trusted配置项可以配置该Application是否是Trusted, Trusted Application下的所有Objects都是Trusted.
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.
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函数。
第2步:改写User_SWC_DioWrite()
没改写前:
ChannelId, Dio_LevelType Level)
{
Dio_WriteChannel (ChannelId, Level);
};
改写后:
typedef struct
{
Dio_ChannelType ChannelId;
Dio_LevelType Level;
Dio_WriteChannel_Param_Type;
ChannelId, Dio_LevelType Level)
{
Dio_WriteChannel_Param_Type Config;
ChannelId = ChannelId;
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完成真正的功能调用。给出的示例及其简单,仅供了解原理参考,实际的工程应用还得根据项目情况考虑非常多的情况。
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
AUTOSAR架构下NVM Block连续写及Default Value问题分析
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号
原文始发于微信公众号(汽车电子嵌入式):AUTOSAR架构下QM Application如何访问ASIL Application
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论