This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L430:无法将 SafeTI 库集成到我的应用中

Guru**** 667810 points
Other Parts Discussed in Thread: HALCOGEN, RM46L430
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601929/rm46l430-cannot-integration-safeti-library-into-my-application

器件型号:

我尝试将 SafeTI 诊断库集成到我的应用中、但遇到了一些严重问题。

整个自检正在运行、但在 SRAM 测试运行时、我会得到未屏蔽的中断。

演示应用程序有一个 VIC 和数据中止中断示例、但我无法理解这应该如何在功能安全相关应用程序中工作。

演示应用程序中的'exception_handler.c'文件包含一个实际存在于私有 SafeTI 诊断库模块中的函数的手动原型:

布尔 SL_FLAG_GET (sint32 flag_id);//避免编译器警告*/ 

这似乎是避免物理上包含 SafeTI 诊断库私有头文件的一种方法、我是否正确解释了?

异常处理程序是应用程序还是 SafeTI 诊断库的一部分?

演示应用程序仅屏蔽异常、自检如何确保异常被实际引发?

似乎存在故障注入测试回调日志记录的实现、但它不会对记录的结果执行任何操作、它是应用程序的一部分、并且包含 SafeTI 诊断库的专用 API。

演示应用程序异常处理程序本身包含一个屏蔽机制来停止自检期间生成的异常的传播。 正是这种机制使用 SafeTI 诊断库中的专用接口。

/*
由于访问 L2存储器的非法事务而导致 DAbort?
* 0x00000008表示它是由读取引起的外部中止、是 AXI 解码错误
* 0xFFF80000是用于创建 L2互连错误陷阱 AXI 解码错误
的受保护位置*
if ((true = sl_FLAG_GET (INTERL2CONNECT_UNPRIVELEGED_ACCESS)))&&)
((0x00000008u =(0x0000008u &_SL_GET_DataFault_Status ()))&&
(0xFFF7A400U =_SL_GET_DataFault_Address ()))
){
maskDAbort = true;
} 

以上代码片段来自演示应用。 我的应用是功能安全相关产品、我需要能够证明上述代码的正确性。 要实现整个屏蔽机制、需要详细了解用于生成错误的存储器地址和引起的异常数量等项目、但在 SafeTI 诊断库 API 或安全手册中无法找到这一点。

此外,上述代码片段使用'_sl_get_DataFault_Address',SafeTI 诊断库 API 中将其描述为'note: for future enhancions. 请勿使用这些 API。

如何在不访问 SafeTI 诊断库中的专用 API 的情况下实现屏蔽机制?

如何在没有有关 SafeTI 诊断库中诊断测试的详细信息的情况下实施屏蔽机制?

有人能不能帮助我、我不知道如何继续我的集成、因为我不知道在这里要实现什么、 我找不到 SafeTI 诊断库文档中的相关信息、似乎需要在应用中实现自检库的一个大型后端部分。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好!

    请在下面查看您原始帖子的上下文中查看我的评论。

    [引用用户="Mark Kingstin"]

    器件型号: RM46L430

    我尝试将 SafeTI 诊断库集成到我的应用中、但遇到了一些严重问题。

    整个自检正在运行、但在 SRAM 测试运行时、我会得到未屏蔽的中断。

    cwd-->我需要有关正在发生哪些中断以及在哪些 SRAM 测试期间的更多详细信息? 即、在 PBIST 执行期间? 中断 NMI 中断是否与 ESM 相关?

    演示应用程序有一个 VIC 和数据中止中断示例、但我无法理解这应该如何在功能安全相关应用程序中工作。

    cwd-->我必须深入研究代码,以完全了解他们尝试执行的操作,但最可能的解释是他们忽略了异常,因为异常是由测试本身创建的。 在完全启动的 FS 应用程序中、您必须确定您的处于此诊断模式、并实施一个异常处理程序、该处理程序可以在发生测试条件时处理中止、而在活动应用程序模式下处理的路径不同。 即、根据发生异常的上下文处理异常。

    演示应用程序中的'exception_handler.c'文件包含一个实际存在于私有 SafeTI 诊断库模块中的函数的手动原型:

    布尔 SL_FLAG_GET (sint32 flag_id);//避免编译器警告*/ 

    这似乎是避免物理上包含 SafeTI 诊断库私有头文件的一种方法、我是否正确解释了?

    异常处理程序是应用程序还是 SafeTI 诊断库的一部分?

    演示应用程序仅屏蔽异常、自检如何确保异常被实际引发?

    cwD-->正如我在前面所说的、由于这不是真正的实现方式、并且只是一个示例、您作为积分器需要填补一些缺点。 对于某些情况、异常处理需要像我在前面提到的那样具有上下文感知能力、因为某些测试会根据设计导致异常、而应用程序必须确定异常是诊断结果还是实际事件结果。 根据您在下面显示的代码中的使用情况、我假设原型仅获得特定测试/或故障类型的结果、并对照故障状态的内容进行检查 (很可能是 ESM 通道、也可能是 CPU 中的 FSR、还会检查错误地址是否与测试代码中使用的地址相对应。 如果所有这些都为真、则作为诊断的副产品忽略异常、并验证错误通知路径。 如果中止发生且此信息不匹配、则还可能存在其他条件、以便中止由另一个源生成。 如果按原样保留、中止将保留在 tact 中、不会被忽略/屏蔽、并且可以由主线代码作为一个真正的异常进行处理。

    似乎存在故障注入测试回调日志记录的实现、但它不会对记录的结果执行任何操作、它是应用程序的一部分、并且包含 SafeTI 诊断库的专用 API。

    cwD-->我认为回拨日志记录的目的是用于调试、而不是用于应用程序。 即、您可以在验证过程中监控日志记录、以确保在适当的条件下调用所有诊断、作为代码对您的总体要求的验证。

    演示应用程序异常处理程序本身包含一个屏蔽机制来停止自检期间生成的异常的传播。 正是这种机制使用 SafeTI 诊断库中的专用接口。

    /*
    由于访问 L2存储器的非法事务而导致 DAbort?
    * 0x00000008表示它是由读取引起的外部中止、是 AXI 解码错误
    * 0xFFF80000是用于创建 L2互连错误陷阱 AXI 解码错误
    的受保护位置*
    if ((true = sl_FLAG_GET (INTERL2CONNECT_UNPRIVELEGED_ACCESS)))&&)
    ((0x00000008u =(0x0000008u &_SL_GET_DataFault_Status ()))&&
    (0xFFF7A400U =_SL_GET_DataFault_Address ()))
    ){
    maskDAbort = true;
    } 

    以上代码片段来自演示应用。 我的应用是功能安全相关产品、我需要能够证明上述代码的正确性。 要实现整个屏蔽机制、需要详细了解用于生成错误的存储器地址和引起的异常数量等项目、但在 SafeTI 诊断库 API 或安全手册中无法找到这一点。

    cWD-->与之比较的地址将是==语句的左侧。 即0xFFF7A400U、但这似乎与代码上方的注释不匹配、因此这有点令人困惑。 这当然可以通过单步执行代码来验证。

    此外,上述代码片段使用'_sl_get_DataFault_Address',SafeTI 诊断库 API 中将其描述为'note: for future enhancions. 请勿使用这些 API。

    cwD-->我也不知道注释的来源或注释。 当然、如果函数调用正在执行此操作、则可以直接读取 FSR。 这将消除一个影响性能的抽象级别、但如果在许多地方(不应该是这样)使用、则会增加占用空间。

    如何在不访问 SafeTI 诊断库中的专用 API 的情况下实现屏蔽机制?

    cwD-->我不知道私有 API 的意图。 它可以是为演示而创建的、而不是整个诊断库的一部分(即、CSP 中的所有措施都不适用于此情况)。 如果它不是 DIAG 库的正式组成部分、则集成商需要实施相同的功能、并由集成商进行测试/验证。 请注意、虽然用于检索标志的函数可能是专用 API 的一部分、但掩码 定义并不是这样、这将使您的应用程序能够使用它来发出测试模式或测试状态通知。  

    如何在没有有关 SafeTI 诊断库中诊断测试的详细信息的情况下实施屏蔽机制?

    cwd-->如果诊断代码是作为源代码提供的,则不能从该源代码派生此信息? 了解在文档中提供更详细的信息会更好、但如果没有、源资源是否是可能的?

    有人能不能帮助我、我不知道如何继续我的集成、因为我不知道在这里要实现什么、 我找不到 SafeTI 诊断库文档中的相关信息、似乎需要在应用中实现自检库的一个大型后端部分。

    cwD-->当然、积分器仍然需要资源来实现诊断库。 本质上、我们无法预测库的使用情况或给定应用的要求、因此必须由系统集成商定义某种程度的断开连接。 虽然提供的诊断是定义诊断措施的一个重要步骤、但开发人员仍需要做出一些决定、以确定如何处理诊断结果以及对更大系统实施的影响。

    [/报价]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    cwd-->我需要有关正在发生哪些中断以及在哪些 SRAM 测试期间的更多详细信息? 即、在 PBIST 执行期间? 中断 NMI 中断是否与 ESM 相关?

    II 已响应单独的线程、并提供了有关此 SRAM 问题的更多详细信息。

    cwd-->我必须深入研究代码,以完全了解他们尝试执行的操作,但最可能的解释是他们忽略了异常,因为异常是由测试本身创建的。 在完全启动的 FS 应用程序中、您必须确定您的处于此诊断模式、并实施一个异常处理程序、该处理程序可以在发生测试条件时处理中止、而在活动应用程序模式下处理的路径不同。 即、根据发生异常的上下文处理异常。

    《‘手册》或 API 帮助文件中没有足够的信息来实施“完全开启”功能安全应用。

    cwD-->正如我在前面所说的、由于这不是真正的实现方式、并且只是一个示例、您作为积分器需要填补一些缺点。 对于某些情况、异常处理需要像我在前面提到的那样具有上下文感知能力、因为某些测试会根据设计导致异常、而应用程序必须确定异常是诊断结果还是实际事件结果。 根据您在下面显示的代码中的使用情况、我假设原型仅获得特定测试/或故障类型的结果、并对照故障状态的内容进行检查 (很可能是 ESM 通道、也可能是 CPU 中的 FSR、还会检查错误地址是否与测试代码中使用的地址相对应。 如果所有这些都为真、则作为诊断的副产品忽略异常、并验证错误通知路径。 如果中止发生且此信息不匹配、则还可能存在其他条件、以便中止由另一个源生成。 如果按原样保留、中止将保留在 tact 中、不会被忽略/屏蔽、并且可以由主线代码作为一个真正的异常进行处理。

    当《安全手册》中没有有关测试顺序和流程的信息时,应用程序如何确定它是否是测试异常?

    cWD-->与之比较的地址将是==语句的左侧。 即0xFFF7A400U、但这似乎与代码上方的注释不匹配、因此这有点令人困惑。 这当然可以通过单步执行代码来验证。

    地址是从代码中查找中获取的幻数、测试的规范在哪里?

    cwD-->我也不知道注释的来源或注释。 当然、如果函数调用正在执行此操作、则可以直接读取 FSR。 这将消除一个影响性能的抽象级别、但如果在许多地方(不应该是这样)使用、则会增加占用空间。

    即使我自己阅读 FSR、我应该期待的地址规范在哪里?

    cwD-->我不知道私有 API 的意图。 它可以是为演示而创建的、而不是整个诊断库的一部分(即、CSP 中的所有措施都不适用于此情况)。 如果它不是 DIAG 库的正式组成部分、则集成商需要实施相同的功能、并由集成商进行测试/验证。 请注意、虽然用于检索标志的函数可能是专用 API 的一部分、但掩码定义并不是这样、这将使您的应用程序能够使用它来发出测试模式或测试状态通知。

    这是 SafeTI 诊断库的专用 API。 如果我需要自己实施整个机制、那么规范在哪里?

    cwd-->如果诊断代码是作为源代码提供的,则不能从该源代码派生此信息? 了解在文档中提供更详细的信息会更好、但如果没有、源资源是否是可能的?

    你是认真的吗?

    这是一个功能安全项目。

    我不确定您是否理解您的陈述的含义。

    您‘re‘我只是工程师’一大部分安全代码,从“ifdef”意大利面代码, ‘大多数注释都涉及代码不符合 MISRA 的原因,并且经过了大量优化,因此无法进行 C’调试,因此必须在汇编器模式下进行调试?

    我应该向证书颁发机构使用哪一个参数?

    我‘不会接受“TI Hercules 安全微控制器论坛回复说是这样做的”。

    cwD-->当然、积分器仍然需要资源来实现诊断库。 本质上、我们无法预测库的使用情况或给定应用的要求、因此必须由系统集成商定义某种程度的断开连接。 虽然提供的诊断是定义诊断措施的一个重要步骤、但开发人员仍需要做出一些决定、以确定如何处理诊断结果以及对更大系统实施的影响。

    我完全理解您的论点、但文档在哪里。 《安全手册》中没有提到这一点。 根据《安全手册》中的信息和我的经理的期望、我必须做的所有事情都将 API 中的功能称为安全手册中所述的措施。 显然情况并非如此。

    为了完成 SafeTI 诊断库集成、我面临着越来越大的压力。 由于 SafeTI 诊断库已预先认证、因此项目管理销售了此解决方案、其中有一个演示应用和一个评估板可展示其全部工作情况。

    演示应用程序是个笑话,要通过一些测试,更是个黑客攻击。 大多数 RM46L430测试甚至都不运行、因为应用程序只运行适用于所有目标处理器的测试。 它似乎是一个 HalCoGEN 生成的项目、已经被 ifdef 提交。 有时、它甚至会通过堆栈来移动 LR 返回值、以跳过注入的故障指令、因为 SafeTI 诊断库没有撤消其自身故障注入的机制。 这是如何考虑的以及‘示例’的好方法?

    基于 SafeTI 诊断库 API 和"已中断"的调用序列、甚至无法在 spna106d (Hercules ARN Cortex R4F 的初始化)中执行指导线。 这是有关如何启动和运行系统的唯一实际规范。

    演示应用 sys_startup.c 文件中有37个'#if 0'区块被删除的功能、闪存 SPI 和 SafeTI 诊断源代码中甚至有几个。

    SafeTI 诊断库和 TPS 驱动器中存在1088 MISRA 违规、我最喜欢的理由是:

    /*Comment_1:
    *"Reason - Need"*/ 

    回到堆栈黑客、下面是"afeTI 诊断库堆栈黑客演示":

    #if function_profiling_enabled
    {
    if (sl_Profile_Struct[SL_Active_Profile_Testtype-TESTTYPE_MIN].abortandler_entrytick =0)
    {
    SL_Profile_Struct[SL_Active_Profile_Testtype - TESTTYPE_min].abortandler_entrytick = entrytick;
    SL_Profile_Struct[SL_Active_Profile_Testtype-TESTTYPE_min].abortandler_exittick =_pmuGetCycleCount_();
    }
    //在堆栈上更新返回地址,以便返回到下一条指令*/
    #if defined (_TMS570LS31x_)|| RM570LS46x_
    (_)| RM430_(_R64x_)| RM46x_(_RM430x_)|(_RM48x_定义的 RM430x_(_RM0_)|(_RM46x_)|(_RM46x_)| RM430_RM48x_(_RM46x_(_RM430_RM48x_)|(_RM46x_定义的 RM48x_)
    
    #8");
    __asm (" STR R0、[SP、#108]");
    #endif
    #endif defined
    (_RM42x_)|| defined (_TMS570LS04x_)
    #ifdef __TI_Compiler_version__
    _asm ("添加 SP、SP、#4 ");
    __asm (" ldmfdR13!、{r0 - R6、 r12、lr}");
    __asm (" subsPC、lr、#4 ");
    #endif
    #endif
    }
    #else
    {
    //更新栈上的返回地址,以便返回到下一条指令*/
    
    #if defined (_TMS570LS31x_)|| Defined (_TMS570LS12x_)|| Defined (_RM48x_)|| Defined (_RM46x_)|
    
    
    optimization
    
    (_define_TMS570LC43x_(_已定义)|#TMS570LC43x_(_)_ RM57x_ RM64x_)_| RM570LC43x_(_(_已定义)| RM570LC43x_ TI_RM64x_(_)_ RM64x_(_)| RM64x_(_)_ RM64x_(_)
    _asm (" LDR R0、[SP、#92]");
    _asm (" ADD R0、R0、#8");
    _asm (" STR R0、[SP、#92]");
    #endif
    define(_TMS570LS31x_)|| Defined (_TMS570LS12x_)|| Defined (_RM48x_)|| Defined (_RM46x_)
    _asm (" LDR R0、[SP、#100]");
    _asm (" ADD R0、R0、#8");
    _asm (" STR R0、[SP、#100]");
    #endif
    
    #else
    _asm (" LDR R0、[SP、#100]");
    _asm (" ADD R0、R0、#8");
    _asm (" STR R0、[SP、#100]");
    #endif
    
    #endif
    #endif #if defined
    
    (_RM42x_)|| defined (_TMS570LS04x_)
    
    #ifdef __TI_Compiler_version__
    
    _asm (" ldmfdR13!、{r0 - R5、R12、LR}");
    _asm (" subsPC、lr、#4 ");
    
    #endif
    
    #endif
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mark、您好!

    首先、我了解您对该规范的不满。 但是、为了清楚并纠正您对代码的一个非常重要的误解、它未经过预先认证。 该代码按 BSD 许可证原样免费提供。 它是在经过认证的过程中开发的(不一定转换为经过认证的 SW)、并且有一个合规性支持包来提供符合功能安全标准的证据。 此证据包括静态和动态测试结果、可与有限的 LDRA 许可证一起获取、以便在您的应用程序中对代码进行回归测试并生成特定于您的实现的证据。 这些是系统级评估所必需的项目。

    此外、必须强调的是、器件级认证不依赖于此特定的软件集/库。 器件证书严格来说是硬件认证。 我们已经并将继续有客户在不使用 SafeTI 诊断库的情况下自行实施安全机制。 此外、请注意、虽然我们已将所有安全措施纳入认证假设中、但并非所有安全措施都是每个系统实施所必需的、而且、通过应用级别理由、可以通过系统级故障分析消除某些/许多安全措施。 这是为了将 FMEDA 工具与我们的详细安全分析报告结合在一起、以便为应用定制安全指标。

    从较高层次看、SafeTI 诊断库的目的是提供一些软件诊断、以便我们的客户更轻松地实施安全手册中指定的许多诊断。 很明显、您不认为此软件实现了该目标、对此我深表歉意。 正如我之前所说的、我相信实施与安全手册中记录的机制之间存在联系。

    关于您的评论"当《安全手册》中没有有关测试顺序和流程的信息时、应用程序如何确定它是否是测试例外?" 这超出了安全手册的范围。 《安全手册》是一份简要文档、其中概述了总体安全方法(安全岛/1oo1D)和架构、以及初级和次级诊断的识别和高级描述。 诊断的实现由积分器来完成(如安全分析报告中所述)、从长远来看、与尝试使用或支持 SafeTI 诊断库相比、集成器可能更有效、更易于支持。 SafeTI 诊断库尝试在该任务中帮助集成商(即使执行不当、如您之前所述)。

    关于每项试验和预期结果等的文件记录 我必须承认,我对这部分文件缺乏了解,因为我没有对这部分文件进行全面的审查。 当然、代码中的内容、幻数和所有内容都可能记录得更好、至少可以添加注释。 我相信、在许多情况下、这些值要么是任意的、要么与 TRM 中标识的经测试的特定功能和寄存器相关联。