小猫爪:S32K3学习笔记21-S32K3之SAF及其应用

  • 1 前言
  • 2 SAF简介
  • 3 SAF框架
  • 4 SAF组件
    • 4.1 eMcem和Bist
    • 4.2 sReco
    • 4.3 mSel
    • 4.4 sBoot
    • 4.5 sCheck
  • 5 SAF集成
  • 6 SAF应用
  • END

1 前言

  这一篇来讲一讲NXP针对S32K3的Safety特征安全软件框架SAF。这篇文章旨帮助使用SAF的用户更好更快的理解和上手SAF,更多的细节还是需要仔细参考SAF每个模块的UM手册。NXP官方提供了一个免费评估的版本,感兴趣的可以去下载一下。

2 SAF简介

  SAF是什么呢?它是一个完整的安全软件框架,简单的来说,SAF实现了从一个错误发生,到这个错误被检测,再到这个错误被处理,再到这个MCU针对这个错误的反应这一系列行为内容。所以它是一个完整的软件框架,只需要客户将其移植到自己的应用中,作一些小小的完善和改变就OK了。

  去官网上下载SAF的体验卡安装包后,如下:

  这些模块所实现的具体的功能为:

名字 完整名字 描述
Base 、、、 一些头文件,无需移植
SafetyBase 、、、 一些跟安全相关的必要头文件
Rte 、、、 一种防覆盖的软件保护措施
Bist BIST Manager BIST管理模块(STCU2)
eMcem Error Manager 错误管理模块(FCCU, ERM, EIM, XBIC, DCM)
sBoot Safe Boot 检测硬件外设配置
sCheck Square Check 潜在错误检测模块,主动发起检测
sReco Software Recovery 软件恢复模块,发生错误后,通过复位来修复错误
mSel Mode Slector 进行安全分析,进行MCU状态模式切换,相当于是SAF的状态切换机

3 SAF框架

  完整的SAF的软件框架如下:

  从图中可以看出在有SAF的软件运行流程如下:

  1. POR阶段
      POR阶段也就是复位事件产生,MCU正式启动,如果使能了HSE,那MCU进入 HSE boot阶段,如果没有使能HSE, MCU进入Safe Boot阶段。
  2. HSE boot阶段
      如果使能Security Boot功能,那么就会进行HSE信息安全启动验证程序的合法性。验证通过,MCU进入Safe Boot阶段。
  3. Safe Boot阶段
      在这个阶段,主要做三件事。第一件事是使用Bist模块进行BIST测试,再使用mSel进行安全分析,决定是否进行MCU状态模式切换;第二件事是使用sCheck进行相关错误检测,继续使用mSel进行安全分析和模式切换;第三件事就是一系列的初始化,包括SAF相关外设的初始化和用户应用外设初始化。在此过程中,mSel根据MCU的状态进行安全分析并进行模式切换,会决定MCU模式状态,而mSel定义的的状态模式有三种,分别是Normal Mode,Degraded mode和Software Recovery 。安全分析后,如果没有任何错误则切换至Normal Mode,MCU进入Normal Operation阶段;如果有一些可恢复错误(用户自定义)则切换至Degraded mode,MCU进入Degrad Operation阶段;如果有致命错误(用户自定义)则切换至Software Recovery,MCU会立即执行复位操作。
  4. Normal Operation阶段
      在这个阶段其实就是正常运行模式,第一步就是使用sBoot来检测一些外设的配置是否正确,如果不正确的话,则MCU复位。如果正确,则进入while循环状态,周期性的运行一些任务,比如SCST, sCheck,用户自定义任务等等。在整个while循环阶段,如果发生错误后,错误被eMcem收集并处理(详情见FCCU文章),如果FCCU最终触发NMI中断,那么就会使用sReco进行MCU复位,在执行sReco复位前,SAF会将相关错误信息存储到RAM或者NVM中,供启动后的下个Safe Boot阶段中的mSel作错误分析,以决定MCU状态模式。
  5. Degrad Operation阶段
      这个阶段其实就是安全运行模式,用户可以定义多个安全模式,来决定在不同的安全模式下运行不同的安全应用任务,除了安全任务,当然也可以运行SCST, sCheck。 同Normal Operation阶段一样,如果在整个过程中发生错误,还是会走eMcem错误处理机制。
  6. Shutdown阶段
      因为很多错误恢复的手段都是复位,所以如果在以上阶段MCU复位次数累计超过设置的阈值,MCU就会进入Shutdown阶段,即MCU卡在复位的DEST0阶段不启动。

  对于S32K3来说,由于其功能结构比较简单,所以说阉割版的SAF更加适合S32K3,如下:

  与完整SAF相比,K3上阉割版SAF就少了Degrad Operation阶段,所以mSel进行安全分析后切换MCU状态模式时只有两个选择,要不就是没有任何错误进入Normal Mode,要不就是有错误使用sReco进行复位清除错误。这样的阉割版SAF被称为SAF的Normal Mode Only Mode

4 SAF组件

  这一节详细来说说SAF每个组件的工作原理。

4.1 eMcem和Bist

  eMcem和Bist是SPD的组件,所以说SPD是SAF的一小部分,其中eMcem是SAF的错误管理器,而Bist是专门用来进行BIST测试的,其在Safety系列文章已经对这两个模块的使用进行了详细的介绍。详情请见如下文章:

  1. 《S32K3之FCCU》
  2. 《S32K3之STCU2》

  注:关于eMcem模块和Bist模块的MCAL配置在其的UM手册已经被描述的非常清楚了,这里就不多做介绍了,详情请见《S32K3_SAF_BIST_UM.pdf》和《S32K3_SAF_EMCEM_UM.pdf》。

4.2 sReco

  在简介中提到sReco是软件恢复模块,发生错误后,恢复MCU状态。下图显示了sReco在SAF中充当的角色:

  可以看到sReco在SAF中被调只存在两种情况:第一是mSel模式选择时未能进入Normal Mode和Degraded Mode;第二是MCU发生致命错误进入NMI中断。查看其源码就能了解到它恢复MCU状态的方式其实就是让MCU进行软件功能性复位。需要注意的是在进行复位前,如果发现有ECC错误,那么它会记录发生ECC错误的地址信息至RAM中,所以为了在复位之后保留这个数据,需要在启动时加个判断,如果是软件复位或者FCCU复位,那么则不进行RAM ECC 初始化。

  该模块是一个纯粹的执行模块,没有相对应的MCAL配置模块,无需配置。

4.3 mSel

  在上面说SAF软件状态机切换流程的时候,提到mSel是用来在Safety Boot阶段切换MCU状态模式的,那么mSel的工作原理是怎样的呢?如下图所示:

  mSel会整合所有的错误源信息来做安全分析,而这些错误源信息包括eMcem模块收集的错误信息, sCheck模块检查的结果,Bist模块执行后的结果,以及mSel存储的历史错误信息。整合所有的错误信息进行安全分析后,来决定MCU状态模式。

  下面再来说说mSel安全分析的原理是怎样?首先mSel会划分若干个功能域(Functional Region),比如我先划分四个功能域,分别是A,B,C,D,接下来再把所有的错误源按照一定需求分别链接到这四个功能域。如果当一个功能域所链接的所有错误源都没有发生错误,那么则就撑这个功能域为正常,反之异常。比如我将所有的Memory ECC错误源链接到A域,那么mSel作安全分析时,如果没有任何的ECC错误,则A域正常。接下里用户可将功能域与不同的MCU状态模式按照需求进行关联,如果我将A,B,C,D四个功能域关联到Normal Mode,那么就代表着进入Normal Mode必须要求这四个功能域都正常,显然只有当所有的功能域全部正常时,mSel才会切换至Normal Mode;如果我将A域和B域关联到Degraded Mode0,那么就代表着进入Degraded Mode0只要求这A域和B域都正常。所以当有些功能域不正常导致MCU无法进入Normal Mode时,此时如果A域和B域正常,则mSel会切换MCU至Degraded Mode0。当然有Degraded Mode0,那肯定也能有Degraded Mode1,所以可以同时有多个Degraded Mode,用户可自定义。如果由于功能域的状态无法进入所定义的所有模式,那么mSel就会直接存储错误信息并切换状态至Software Recovery让MCU进行功能性复位。

  上面提到过mSel可以存储错误信息至RAM或者NVM中供下次mSel作安全统计分析使用。首先mSel是一定会将数据存储到RAM中,所以为了避免RAM中在复位后被清除,那么就要需要在RAM初始化加个判断,读取复位原因,如果是软件功能性复位或者FCCU功能复位,那么则不进行RAM ECC初始,并且还需要将这些变量链接到启动时不会进行初始化的数据section。而存储在NVM中则是可选的,如果使能这个功能,则客户必须初始化mSel读写NVM的接口供mSel调用。

  mSel还提供了一个Threshold机制,这个机制其实就是为所有的错误源设置一个阈值,当错误源出现错误时,SAF会进行其次数累加并将其存储,只有当一个错误源出现错误的次数到达其对应的阈值,SAF才会认定该错误源所链接的功能域异常。

  mSel还提供了事件戳功能,记录所有错误发生的时间,在做安全分析时,还会对错误时间戳进行判断,不符合时间要求的错误源不会被包括在判断范围内。所以用户在进行代码集成时,需要在代码中维护提供时间戳的外设源。

  注:关于mSel模块的MCAL配置在其的UM手册已经被描述的非常清楚了,这里就不多做介绍了,详情请见《S32K3_SAF_MSEL_UM.pdf》。

4.4 sBoot

  前面在SAF框架中提到sBoot模块主要是在MCU从Safe Boot阶段进入Normal Operation阶段时检查一下当前外设的初始化情况是否正常,如果不正确的话,则MCU复位。

  其实sBoot的检查项内容也是非常的简单,我截取一小部分(详细请参照sBoot的UM手册的Table4)如下:

  sBoot的检查项主要有时钟是否使能,一些外设的Debug模式是否使能,一些外设的Freeze模式是否使能。此外用户可根据自己的需求来决定每一个检查项是否被检查。

  注:关于sBoot模块的MCAL配置在其的UM手册已经被描述的非常清楚了,这里就不多做介绍了,详情请见《S32K3_SAF_SBOOT_UM.pdf》。

4.5 sCheck

  sCheck是用来发现错误和收集错误信息,其主要是让MCU主动运行一些安全检测机制来发现潜在的错误,并收集错误信息。

  sCheck根据MCU的启动阶段,运行阶段和复位阶段这3种状态提供了3种检测方式,分别是Start-up Test,Runtime Test和Shutdown Test。

  1. Start-up Test
       Start-up Test应该在MCU启动时被启动,它可能会修改一些外设的配置而不会复原,所以启动 Start-up Test后用户必须要重新初始化自己的外设,所以一般都是在开机后以及用户初始化外设之前启动Start-up Test。如果是S32K324这种双核运行的PN上,Start-up Test只能在主核被调用。Start-up Test会在mSel进行安全分析时会被执行(mSel_SelectMode), 无需用户自己启动。
  2. Runtime Test
      Runtime Test应该是在MCU运行时被启动,它也会修改外设配置但是它在检测结束后是会恢复现场的,所以它可以在应用中反复被启动,其可以同时在不同的核上被调用。在启动测试时,用户需要考虑到sCheck和APP同时访问外设的情况,这样会导致sCheck失败,所以在启动 Runtime Test时必须要确保APP已经释放了那些测试外设的访问。另外Runtime Test需要用户调用函数自行启动。
  3. Shutdown Test
      Shutdown Test应该是在MCU执行复位复位前被启动,它也会修改外设配置但是它在检测结束后是会恢复现场的,其可以同时在不同的核上被调用。在启动测试时,用户需要考虑到sCheck和APP同时访问外设的情况,这样会导致sCheck失败,所以在启动 Runtime Test时必须要确保APP已经释放了那些测试外设的访问。另外Shutdown Test需要用户调用函数自行启动。

  下面列举一些sCheck的检测项(其他检测项请参考sCheck的UM手册中Table 4):

  可以看到在这个表中,对每一个检测项所检测的内容,建议放在哪种检测方式中以及运行检测时长都作了详细的介绍,可自行去参考。

  注:在运行sCheck的时候可能会做一些如修改寄存器,禁用中断等一些操作,这势必会影响用户APP的运行,所以对于sCheck的一些检测项强烈建议将其尽量放在Start-up Test和Shutdown Test中被执行。用户可参考sCheck的UM手册中5.8 Conditions, Limitations And Side Effects章节了解每一检测项对外设的影响和限制从而评估运行sCheck对APP的影响从而决定这些测试项将以哪种方式被启动。

  注:关于sCheck模块的MCAL配置在其的UM手册已经被描述的非常清楚了,这里就不多做介绍了,详情请见《S32K3_SAF_SCHECK_UM.pdf》。

5 SAF集成

  接下来就是SAF的集成了,集成起来也是非常简单,具体步骤如下:

  1. 将SAF软件包中的主体源文件加入自己的工程中,如下:

  2. 将SAF软件包中的相关接口源文件加入工程中:

  3. 按照下图修改链接文件,将SAF的相关段按照要求链接指定地方,在每个模块的UM手册的Software Integration->Memory Allocation章节对其都进行详细的介绍,截取一部分如下:

    然后再结合每个模块对应的x_Memmap.h文件找到对应的section名,截取一部分如下:

    之后就可以在链接文件中将这些section链接到要求的位置,截取链接文件的一部分如下:

    之后编译代码,可能会出现一些错误,按照错误提示将错误消除掉就好了。

  4. 查看interrupt.c文件,发现有很多中断服务函数,这是运行sCheck测试项时,有些测试项会主动触发中断,需要这些中断服务函数来配合sCheck完成测试,所以我们需要在一开始注册这些函数,详情见interrupt.c中的Handle_Init函数。

  5. 在mSel中提到其有错误时间戳记录功能,所以需要为其提供一个时间戳,这里我使用STM0为其提供,所以需要在STM0中断中周期调用mSel_TimerCnt_Update来维护mSel时间戳,详情见interrupt.c中的STM0_initISR_STM0函数(注:用户也可以使用其他定时外设来实现)。

  6. sCheck还会触发HardFault中断,所以需要重定义HardFault中断函数,详情见interrupt.c中的HardFault_Handler函数。

  7. sCheck的有一些检测项会触发一些外设的中断,比如CMU,SWT,所以需要编写相关的中断服务函数来配合sCheck完成检测,详情见interrupt.c中的ISR_SWTxISR_CMUxISR_EMAC函数。

  8. 如果错误最终导致FCCU触发NMI中断,根据SAF软件框架,SAF必须调用sReco来复位MCU,所以需要重定义NMI中断服务函数,详情见interrupt.c中NMI_Handler函数。

  9. 到此,SAF的软件框架算是全部移植完毕了,此外用户需要根据自己的应用需求来完善一个非常重要的函数,那就是FCCU的Alarm中断callback函数eMcemDefaultAlarmHandler,用户需要根据自己的需求在此函数中添加一些自己的处理手段。在《S32K3之FCCU》中对其作了详细的介绍。

6 SAF应用

  至于SAF的应用,它的使用方式大抵和SAF软件框架一致,在每个模块的UM手册中对每个模块的API函数都作了详细的介绍,再结合相关SAF的Demo自行参考,就比较简单了。可参考SAF的软件包里的SAF Demo,也可参考NXP提供的其他例程。

END

小猫爪:S32K3学习笔记21-S32K3之SAF及其应用相关推荐

  1. 小猫爪:S32K3学习笔记09-S32K3之Safety简介

    小猫爪:S32K3学习笔记09-S32K3之Safety简介 1 前言 2 Safety相关硬件介绍 3 Safety相关软件介绍 4 Safety文章目录 END 1 前言   接下来,就要开始进学 ...

  2. 小猫爪:S32K3学习笔记02-S32K3之FlexCAN

    S32K3学习笔记02-S32K3之FlexCAN 1 前言 2 CAN协议简介 2.5 CAN资源介绍 3 FlexCAN简介 3.1 MB(邮箱)系统 3.1.1 正常模式下 3.1.2 激活了C ...

  3. 小猫爪:S32K3学习笔记05-S32K3之ADC

    小猫爪:S32K3学习笔记05-S32K3之ADC 1 前言 2 资源简介 3 ADC功能详解 3.1 ADC mux-mode channels 3.2 ADC内部框架 3.3 时钟源 3.4 通道 ...

  4. 小猫爪:S32K3学习笔记10-S32K3之EIM和ERM

    小猫爪:S32K3学习笔记10-S32K3之EIM和ERM 1 前言 2 EIM(Error Injection Module) 3 ERM(Error Reporting Module) 4 MCA ...

  5. 小猫爪:S32K3学习笔记11-S32K3之FCCU

    小猫爪:S32K3学习笔记11-S32K3之FCCU 1 前言 2 FCCU的功能框图 2.1 错误输入 2.2 时钟输入 2.3 FSM 2.4 FOSU 3 FCCU的状态机 4 MCAL配置 5 ...

  6. 小猫爪:S32K3学习笔记04-S32K3之LCU

    小猫爪:S32K3学习笔记04-S32K3之LCU 1 前言 2 LCU的框架 3 LC逻辑运算单元 3.1 input&output&sync&force 3.2 LUT b ...

  7. 小猫爪:S32K3学习笔记03-S32K3之eMIOS

    小猫爪:S32K3学习笔记03-S32K3之eMIOS 1 前言 2 eMIOS资源介绍 3 CNT和Counter Bus 4 UC的工作模式 4.1 General-Purpose Input a ...

  8. 小猫爪:S32K3学习笔记17-S32K3之数据完整性的保障和手段

    小猫爪:S32K3学习笔记17-S32K3之数据完整性的保障和手段 1 前言 2 三个保障 2.1 EDC 2.2 XBIC 2.3 ECC 3 一个手段 END 1 前言   大家都知道,怎样保证数 ...

  9. 小猫爪:S32K3学习笔记18-S32K3之Safety外设总结

    小猫爪:S32K3学习笔记18-S32K3之Safety外设总结 总结 END 总结   在前面已经对S32K3对功能安全这一块相关的外设大致都介绍了一遍,这篇文章就来对S32K3与Safety有关的 ...

最新文章

  1. 在windows8 上安装framework 3.5
  2. 基于图像的三维模型重建——相机模型与对极几何
  3. elasticSearch6源码分析(4)indices模块
  4. python ddt mysql_Python数据驱动DDT的应用
  5. 【数据竞赛】盘点Kaggle中常见的AutoEDA工具库
  6. VTK:图表之DirectedGraphToMutableDirectedGraph
  7. Microsoft Dynamics CRM 2015 新增功能 介绍 高级查找功能
  8. 笔记本本地连接显示电缆拔出_没有安全电缆槽的笔记本电脑如何固定?
  9. PHP-高并发和大流量的解决方案
  10. java sql变更存储,MySQL更改数据库数据存储目录,mysql数据存储
  11. [使用心得]maven2之m2eclipse使用手册之二m2eclipse功能介绍
  12. php 开发工具 sublime,PHP日常开发工具-Sublime应用
  13. SECS/GEM协议库开发开源代码
  14. css媒体查询iphone4和iphone5
  15. 【Android】DatePicker时间选择器
  16. 2021-2022年度“扣哒杯”AI世青赛初赛落下帷幕
  17. 【JWT】JWT JWS JWE | 在线JWS解析工具
  18. 差分时钟、DQS与DQM - DDRx的关键技术介绍(上)
  19. http/2与http/1的区别
  20. 基于hexo使用github.io免费域名搭建个人博客记录

热门文章

  1. 【笔记】WGAN GP :WGAN自己的李普西斯条件是gradient clipping(大部分weight是正负0.01),在此基础上增加新的motivation让WGAN GP实现李普西斯条件
  2. 杜家坎装甲兵工程学院计算机二级考点,从丰台区杜家坎到东城区东十四条怎么走??...
  3. [LeetCode]561. Array Partition I (数组分区 1)
  4. 关闭eclipse控制台console中的非Java Server(ESLint、Angular Language Server等)
  5. 易拉罐被证实能增强WiFi信号 手机笔记本均适用
  6. 不是竞赛生学计算机专业,非计算机专业计算机设计大赛总结
  7. WindowsForm切换窗口的几种常见实现
  8. 移动安全--17--Android系统安全(上)
  9. Capture Allegro学习笔记1
  10. 基于微信小程序的个人电台系统的设计与实现