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.

[参考译文] RM48L952:SAFETI:L2 &L3测试损坏 RAM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598579/rm48l952-safeti-l2-l3-tests-corrupts-ram

器件型号:RM48L952

您好、再说一次、

如果有任何想法、问题所在、代码会跳转到无法屏蔽的数据中止。

如果在 L2L3测试之后执行 SRAM ECC 测试、这种情况在运行时和引导时间内发生。 出于某种原因、如果 L2L3测试仅在启动期间运行、则运行时 SRAM 测试在启动后正常工作。

制作了简单的启动测试案例、成功地重现了问题(在该代码之前、我已在启动例程的建议部分成功执行了 SRAM 测试)。

   {
       //只有这些测试可以在特权模式下运行
       const sl_SelfTestType aeIconTesting[]=
       {
           L3INTERCONNECT_RESERVE_ACCESS、
           L2INTERCONNECT_RESERVE_ACCESS
       };

       for (u32i = 0U;u32i <元素(aeIconTests);u32i++)
       {
           RetVal = sl_SelfTestL2L3Interconnect (aeIconTests[ u32I ]、NULL、0U);// REST 数据用于非私有边缘测试
           Increment_pass fail_counter (ST_Pass、RetVal、failure_proceed);
       }
   }

   {
       SL_SelfTest_Result         failInfoTCMRAM;    /* TCM RAM 故障 信息*/

       RetVal = sl_SelfTest_SRAM (SRAM_ECC_ERROR_ENCED_2BIT、TRUE、failInfoTCMRAM);
       Increment_pass fail_counter (failInfoTCMRAM、RetVal、failure_proceed);
       sl_vimREG->INTREQ0 = 1U;//清除 CH:esmHIGH (始终为 FIQ),test 将启用它
   }

运行时和启动期间的结果相同:
==data_abort==
 DFSR:0x409
 DFAR:0x8008170
 状态:0x19
 读:正确
 AxiDec:对
===========================

其中0x8008170属于 SafeTI 测试缓冲器
slamEccTestBuff        0x08008160   0x20 数据 GB sl_selftest.o [1]


在数据中止处理程序中、我从示例工程中复制了 SRAM 测试的错误处理+添加了每次识别测试时增加的变量
   if (sl_FLAG_GET ((Int32) SRAM_ECC_ERROR_ENCERAING_2BIT)))
   {
       u32Ecc2bit++;

       uint32 u32EccWrEnMask =(uint32) TCRAM_RAMCTRL_ECCWREN; /*lint !e9033 !e9053 *// TODO:为什么 lint
       uint32 u32Eec1WrEn = sl_tcram1REG->RAMCTRL & u32EccWrEnMask;
       uint32 u32Eec2WrEn = sl_tcram2REG->RAMCTRL & u32EccWrEnMask;
       if ((u32Eec1WrEn =u32EccWrEnMask)||(u32Eec2WrEn ==u32EccWrEnMask))
       {  /*看起来写入 ECC 区域已启用、请检查错误地址是否在测试缓冲区范围内*/
           maskDAbort = true;// TODO:是否应检查地址、而不仅仅是基于 sl_FLAG_GET...的屏蔽错误
       }
   }

u32Ecc2bit 的值为3、该中止在每次测试中被调用两次、这意味着第2次测试成功处理了第一个数据中止、但在测试过程中会发生某些情况。

根据调试器,在执行该_sl_Barrier 数据访问()行时调用数据中止
       /*为自检设置自检标志,以指示 ESM 处理程序将此操作作为自检的一部分来完成*/
       /*从具有2位 ECC 错误的位置读取数据这将导致生成数据中止*/
       /*SAFETYMCUSW 446 S MR:10.1. 注释_11*/
       ramread64 = sramEccTestBuff[2];
       _SL_Barche_Data_Access ();           //此处出现意外的数据中止
       /*恢复 Ctrl 寄存器*/
       sl_tcram1REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN;

       /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
       ramRead = sl_tcram2REG->RAMCTRL;
       /*为自检设置自检标志,以指示 ESM 处理程序将此操作作为自检的一部分来完成*/
       /*SAFETYMCUSW 446 S MR:10.1. 注释_11*/
       ramread64 = sramEccTestBuff[3];
       _sl_Barrier 数据访问();
       /*恢复 Ctrl 寄存器*/
       sl_tcram2REG->RAMCTRL &=~TCRAM_RAMCTRL_ECCWREN;


由于 SRAM_ECC_ERROR_ENCED_2BIT 在运行时单独工作、因此它指示测试本身正常。 由于它在启动后的运行时间为1次、但在 L2L3测试后的启动时间不能直接运行、因此它指示从启动到运行时间的转换中的某个位置将发生变化、从而允许它通过一次。

如果我正确理解下一个预期数据中止应该来自这里 ramread64 = sramEccTestBuff[3]; 因此、出现了问题。 让我们进一步检查:

我创建了这种调试陷阱、并将中断点设置为 IF
       u32Ecc2bit++;

       if (u32Ecc2bit == 3)
       {
           temptemp++;
       }

一切看起来都很好、但代码也会在相同的循环中传递该值(我有一个逻辑、在本例中设置 maskDAbort = false;)
   /*由于 SRAM ECC 2Bit 自检而导致 DAbort? *
   if (sl_FLAG_GET ((Int32) SRAM_ECC_2BIT_FAULT_Inject))
   {
   }

因此、很显然、问题是测试活动数组会受到一些损坏。

在启动运行后、这个 L3INTERCONNECT_RESERVE_ACCESS 运行
sl_priv_flag_set[0]看起来具有值4 (这意味着 SRAM_ECC_ERROR_PAGED_1BIT 处于活动状态、但 sl_FLAG_SET 使用值0和1)
执行 L2INTERCONNECT_RESERVED_ACCESS 后 、sl_priv_flag_set[3]为136 (且[0]现在为零)、这意味着 SRAM_ECC_2BIT_FAULT_Inject 处于活动状态。

这完全解释了该数据中止处理程序挂起的原因、只是想知道这些 L2和 L3会破坏什么...

为什么该测试阵列损坏、L2和 L3测试的作用是什么? 这些破坏性测试是否与 PBIST 相同、何时应执行这些测试? 我几乎在启动结束时执行它们、如果 更多的 RAM 被破坏、而不仅仅是那些测试活动插槽、这种情况就不再安全了...

这也解释了为什么 SRAM 测试在启动后开始工作->在跳转到 main()之前重新初始化变量并删除损坏的 SRAM_ECC_2BIT_FAULT_INIT……

所有想法都很受欢迎、我是否在数据中止处理程序中做了一些错误?

如果是 L3测试、SL_priv_flag_set[0]将在 IF 启动之前转到 STR 命令中的值4、此时已返回数据中止

      0xa6a6:0x0020        MOV     R0、R4
      0xa6a8:0xf001 0xfb24 BL       sl_FLAG_set            ;bcf4
           _sl_Barrier 数据访问();
      0xa6ac:0xf001 0xe826 BLX      _SL_Barrier 数据访问;bb6fc
           G_L2L3_READ_RESERTED_WORD =*((UINT32*) PCR_RESERVE_LOCATION);
      0xa6b0:0xf05f 0x407d MOVs.W   R0、#-50331648         ;0xfd000000
      0xa6b4:0x6800        LDR      R0、[R0]
      0xa6b6:0xf8df 0x1d38 LDR.W    R1、[PC、#0xd38]       ;[b3f0] g_L2L3_read_reserved_word //跳转到数据中止
      0xa6ba:0x6008        STR      R0、[R1]   //在这里看起来是损坏的
           if ((0x00000008u =(UINT32)(0x00000008u &_SL_GET_DataFault_Status ())))&&
               (((uint32) pcr_reserved_location =_sl_get_DataFault_Address ())){
      0xa6bc:0xf000 0xef60 BLX      _SL_GET_DataFault_Status;b5580
      0xa6c0:0x0700        LSLS     R0、R0、#28
      0xa6c2:0xd505        BPL.N    0xa6d0
      0xa6c4:0xf000 0xef60 BLX      _SL_GET_DataFault_Address;0xb588

L2测试会在完全相同的点破坏数据
           _sl_Barrier 数据访问();
      0xa6e6:0xf001 0xe80a BLX      _SL_Barrier 数据访问;bb6fc
           G_L2L3_READ_RESERTED_WORD =*((uint32*) SCR_RESERVE_LOCATION);
      0xa6ea:0xf05f 0x4008 MOVs.W   R0、#-2013265920       ;0x88000000
      0xa6ee:0x6800        LDR      R0、[R0]
      0xa6f0:0xf8df 0x1cfc LDR.W    R1、[PC、#0xcfc]       ;[b3f0] g_L2L3_read_reserved_word //跳转到数据中止
      0xa6f4:0x6008        STR      R0、[R1]//在这里看起来是损坏的
           _sl_Barche_Data_Access();/*已添加以避免链接器对齐问题*/
      0xa6f6:0xf001 0xe802 BLX      _SL_Barrier 数据访问;bb6fc
           if ((0x00000008u =(UINT32)(0x00000008u &_SL_GET_DataFault_Status ())))&&
               (((uint32) scr_reserved_location =_sl_get_DataFault_Address ())){
      0xa6fa:0xf000 0xef42 BLX      _SL_GET_DataFault_Status;b5580
      0xa6fe:0x0700        LSLS     R0、R0、#28
      0xa700:0xd505        BPL.N    0xa70e
      0xa702:0xf000 0xef42 BLX      _SL_GET_DataFault_Address;b0x588

在 L2测试中、R0 = 0x88000000、R1 = 0x0800A840

sl_priv_flag_set 的地址为0x0800A840
sl_priv_flag_set       0x0800a840   0x40 数据 GB sl_priv.o [1]

因此、这很可能不会破坏任何其他东西...

sl_priv_flag_set[3]的地址为0x0800A843、因此此 STR 命令会对测试数组的开头进行32位写入、并损坏它...

您能不能猜到花了3分钟才知道发生了什么...

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

    我已将您的问题转发给 SafeTI 库的开发人员。

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

    在该代码中对其进行了更多的调试

          0xa6e0:0x0020        MOV     R0、R4
          0xa6e2:0xf001 0xfb07 BL       sl_FLAG_SET            ;bbcf4
               _sl_Barrier 数据访问();
          0xa6e6:0xf001 0xe80a BLX      _SL_Barrier 数据访问;bb6fc
               G_L2L3_READ_RESERTED_WORD =*((uint32*) SCR_RESERVE_LOCATION);
          0xa6ea:0xf05f 0x4008 MOVs.W   R0、#-2013265920       ;0x88000000
          0xa6ee:0x6800        LDR      R0、[R0]
          0xa6f0:0xf8df 0x1cfc LDR.W    R1、[PC、#0xcfc]       ;[b3f0] g_L2L3_read_reserved_word
          0xa6f4:0x6008        STR      R0、[R1]
               _sl_Barche_Data_Access();/*已添加以避免链接器对齐问题*/
          0xa6f6:0xf001 0xe802 BLX      _SL_Barrier 数据访问;bb6fc
               if ((0x00000008u =(UINT32)(0x00000008u &_SL_GET_DataFault_Status ())))&&
                   (((uint32) scr_reserved_location =_sl_get_DataFault_Address ())){
     

    发生跳转至中止处理程序时、PC 为0xA6EE (由于尝试从0x88000000地址读取值、因此符合预期)
    在数据中止处理程序中、LR 为0xA6F6 (指向下一个"完整命令"、并浏览几行 asm)
    中止处理程序在堆栈前从 LR 减少-4、因此在堆栈中为0xA6F2 (是否尝试返回到之前的命令?)
    当代码返回到0xA6F4 (完全跳过0xA6F0中的命令)行时、因为它是下一个"有效地址"...

    R0和 R1在数据中止处理程序之前和之后是相同的->意味着这些寄存器的值被正确存储和恢复。

    因此、这里的真正问题是跳过了 g_L2L3_READ_RESERVE_WORD 的地址读数、因此 R1仍然指向先前操作中的活动数组、然后一直执行 STR、直到数组值损坏... 或者、跳转至错误的位置、同时应跳过 STR 命令...


    数据中止处理程序与示例代码中的处理程序类似(我猜例外矢量需要位于 ARM 中)
    #ifdef __TI_Compiler_version__
    #pragma 中断(_expt_vec_abort_data、DABT)
    void _expt_vec_abort_data ()
    #endif
    #ifdef __IAR_systems_ICC__
    extern __IRQ __arm void _expt_vec_abort_data( void );// for lint
    _IRQ __arm void _expt_vec_abort_data (void)
    #endif


    此结果为以下类型的 asm 代码
    _IRQ __arm void _expt_vec_abort_data (void)
    #endif

    _expt_vec_abort_data:
         0x207cc:0xe24ee004    sub      LR、LR、#4
         0x207d0:0xe92d50ff    推     送{R0-R7、R12、LR}
         0x207d4:0xeef10a10    VMRS     R0、FPSCR
         0x207d8:0xe92d0001    STMDB    SP!、{R0}
         0x207dc:0xe24dd004    sub      SP、SP、#4
         0x207e0:0xed2d0b10    VPUSH    {D0-D7}
         0x207e4:0xe24dd008    SUB      SP、SP、#8
       寄存器 UINT32 callbkParam1 = 0U、callbkParam2 = 0U、callbkParam3 = 0U;
         0x207e8:0xe3a01000    MOV      R1、#0


    如果这很重要、我们将使用 IAR 编译器。 处理器模式在 c/c++编译器的"code"配置选项卡中设置为 thumb。

    如果该模式设置为 ARM、则为 L2测试生成以下类型的代码

          bbf9c:0xeb000835    BL       sl_FLAG_SET            ;0xe078
               _sl_Barrier 数据访问();
          bfa0:0xeb000611    BL       _sl_Barrier 数据访问;0xd7ec
               G_L2L3_READ_RESERTED_WORD =*((uint32*) SCR_RESERVE_LOCATION);
          bfa4:0xe3a00488    MOV      R0、#-2013265920       ;0x88000000
          bfa8:0xe5900000    LDR      R0、[R0]
          0xb0xe59f1c2c    LDR      R1、[PC、#0xc2c]       ;[0xbbbe0] g_L2L3_READ_RESERVE_WORD
          0xbfb0:0xe5810000    STR      R0、[R1]
               _sl_Barche_Data_Access();/*已添加以避免链接器对齐问题*/
          bbbfb4:0xeb00060c    BL       _sl_Barrier 数据访问;0xd7ec
               if ((0x00000008u =(UINT32)(0x00000008u &_SL_GET_DataFault_Status ())))&&
                   (((uint32) scr_reserved_location =_sl_get_DataFault_Address ())){


    中止处理程序条目中的 LR 为0xBFB0、-4为0xBFAC、现在它返回读取 g_L2L3_READ_RESERVE_WORD 地址的行、并将 R1更新为正确的值、以便 STR 写入正确的地址。

    在示例工程中、模式看起来是 ARM、这是必需的吗? 或者、如果使用了 THUMB、则无法按原样使用示例项目中止处理程序?

    在安全手册中、没有提到 THUMB 或 ARM、在第6.2章中、例外处理程序不是由库提供的(但这些是在示例项目中提供的)。

    选择 ARM 模式后、整个应用程序将正常运行、如果我理解正确、拇指是 ARM 的子集、以减少代码、这样编译器将编译器选项切换到 ARM 始终是安全的移动?

    当前代码大小看起来具有很大的影响(ARM 中的代码大小多~50%)
    拇指:
     113 657字节的只读 代码存储器
      34 338字节的只读 数据存储器
      39 119字节的读写数据存储器

    ARM:
     169 699字节的只读 代码存储器
      29 420字节的只读 数据存储器
      39 119字节的读写数据存储器


    如果从数据中止处理程序中删除了_arm 关键字(CPU 模式为 thumb 时)、这将不起作用
    #ifdef __IAR_systems_ICC__
    extern __IRQ void _expt_vec_abort_data (void);// for lint
    __IRQ void _expt_vec_abort_data (void)
    #endif

    因此、最可能还有其他跳过数据中止的测试在启用 Thumb 时可能会"疯狂"?

    SafeTI 中的 FIQ 处理程序(sl_ESM_HIGH_intr_handler)具有_FIQ 关键字、并且在其开头将 lr 减小了4、看起来即使用拇指也可以正常工作...

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

    [引用 USER="Jarkko Silvasti"]因此、在启用 Thumb 时、最有可能跳过数据中止的其他测试也会执行"疯狂"的操作?[/引用]根据对 LAUNCHXL2-TMS57012的调查: 当使用 GCC 工具链中的 XDS 调试器刷写代码时、无法执行冷复位 。我认为异常处理程序需要针对 ARM 模式进行编译、但可以针对 THUMB 模式编译其他函数。

    我不使用 IAR 编译器、但您能否尝试编译从 ARM 模式的异常向量引用的函数、以及所有其他用于 Thumb 模式的函数?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我的英语不好、"引用"是什么意思? 如果 case 数据中止调用一些其他函数、这些函数也应编译为 ARM 模式或其他内容?

    我假设它需要在 IAR 中使用_arm 关键字、因为无法从工程选项中找到任何其他可能强制单个函数或文件采用该模式的内容。

    因此、这基本上对中止处理程序本身来说是可以的(此函数直接设置为 intvec 的复位条目:b _expt_vec_abort_data)

    #ifdef __TI_Compiler_version__
    #pragma 中断(_expt_vec_abort_data、DABT)
    void _expt_vec_abort_data ()
    #endif
    #ifdef __IAR_systems_ICC__
    extern __IRQ __arm void _expt_vec_abort_data( void );// for lint
    _IRQ __arm void _expt_vec_abort_data (void)
    #endif

    (笑声)


    我有内部数据中止函数、用于检查某些测试(功能与示例工程中的相同、但按函数执行、如果按函数执行条件、则实际上替换了3行、因为有多个类似的 if 语句仅具有不同的输入值)

    if (bDataAbortAxiDecoder ((Int32)L2INTERCONNECT_RESERVE_ACCESS,0x00000008u,0x88000000U))

    maskDAbort = true;


    这个 bDataAbortAxiDecoder()函数没有__arm 关键字,所以你建议我添加它吗? 只是想知道、由于在调用该函数之前已堆叠 LR 值(并且是"错误的")、这会有什么帮助。

    然后、数据中止也具有 ESM_ApplicationCallback()、就像演示应用所具有的那样。 这在演示应用中也没有_arm 关键字。 因此、如果您的意思是我理解的、那么我还应该在这里添加_arm、然后它与演示应用不同。

    如果不屏蔽中止(并且内部有很多函数)、那么我还有调试打印调用、因此尝试将下面的所有被调用函数和函数设置为 ARM 模式听起来并不实用 (我可以禁用测试打印并将__arm 添加到这2个函数中)...


    我发现了一些有趣的东西、在 DATA_ABORT 的末尾是 TI 编译器的返回地址操作、为什么不是 IAR 呢? 这是将堆叠的 LR 增加8英寸堆叠的问题
    /*更新栈上的返回地址,以便我们返回到下一条指令*/
    #if defined (_TMS570LS31x_)|| defined (_TMS570LS12x_)|| defined (_RM48x_)|| defined (_RM46x_)|| defined (_TMS570LC43x_)|| defined (_RM57Lx_)
    #ifdef __TI_Compiler_version__
    _asm (" LDR R0、[SP、#108]");
    _asm (" ADD R0、R0、#8");
    _asm (" STR R0、[SP、#108]");
    #endif
    #endif

    不同的 CPU 模型和#ifoptimization_enabled 类似

    根本原因实际上是否是堆栈的 LR 值不会针对 IAR 进行更改?

    浮点单元堆栈看起来也不是有条件的、使用 CCS 是否总是以相同的方式运行、因为在 IAR 中、您可以选择是否使用 FPU (常规选项->目标选项卡、其中有"浮点设置")... 我觉得在不使用 FPU 的情况下、堆栈偏移应该不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试在这里输入_arm 关键字、但没有我怀疑的变化。 此外还有很多其他函数、如 sl_FLAG_Get 和_sl_HoldNClear_nError()、它们在从数据中止调用的函数中使用、但实际上尝试将其放在每个位置...

    还尝试在 IAR 项目选项中启用"Interwork (交互工作)"选项、未做任何更改。 IAR 手册介绍了交互工作、因此很可能设置不会影响任何内容、因为 Hercules 的范围是 v6到 v8?
    -"注意:为 ARM 架构 v5或更高版本、或者为符合 AEABI 而编译的源代码在缺省情况下处于交互运行状态。"

    我已经了解到、只有异常矢量需要处于 ARM 模式、并且在它下面的每个其他函数都可以进行交互操作、但这超出了我的 MCU 核心能力...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    忘记说、如果我将 SafeTI 测试功能置于 ARM 模式、那么它就可以工作(但仍然怀疑其他测试可能会执行不可见的操作)
    _arm 布尔 SL_SelfTestL2L3Interconnect (sl_SelfTestType testType testType、volatile UINT32*位置、volatile UINT32* protsetreg、uint32质子位)

    因为在该代码之后、对于此函数而言、它与编译为 ARM 代码的整个代码类似(4字节指令...):

               _sl_Barrier 数据访问();
          0xa7ac:0xeb00040a    BL       _sl_Barrier 数据访问;bb7dc
               G_L2L3_READ_RESERTED_WORD =*((uint32*) SCR_RESERVE_LOCATION);
          0xa7b0:0xe3a00488    MOV      R0、#-2013265920       ;0x88000000
          0xa7b4:0xe5900000    LDR      R0、[R0]
          0xa7b8:0xe59f1d10    LDR      R1、[PC、#0xd10]       ;[bb4d0] g_L2L3_read_reserved_word
          0xa7bc:0xe5810000    STR      R0、[R1]
               _sl_Barche_Data_Access();/*已添加以避免链接器对齐问题*/
          0xa7c0:0xeb000405    BL       _sl_Barrier 数据访问;bb7dc
               if ((0x00000008u =(UINT32)(0x00000008u &_SL_GET_DataFault_Status ())))&&
                   (((uint32) scr_reserved_location =_sl_get_DataFault_Address ())){


    在每个会导致数据中止调用的 SafeTI 函数前面是否应该有用户可定义的关键字 define、这样用户就可以在不修改 SafeTI 源的情况下定义系统的行为(并查看导致数据中止的所有可能函数)?

    目前我必须在2个选项之间做出决定、a)将整个软件置于 ARM 模式->占用大量代码空间 b)修改"已认证"的 SafeTI 代码以将某些函数置于 ARM 模式...

    有什么意见?

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

    您好、Jarkko、

    注释1:

    某些诊断测试(在本例中为保留存储器访问的 L2/L3互连测试/SRAM 2位 ECC 错误)会导致数据中止。 数据中止处理程序不是安全诊断库的一部分、但由于安全库需要对由其创建的错误进行特定处理、因此必须对数据中止处理程序进行定制、以便与安全诊断库配合使用。 定制的一部分是修改从中止处理程序返回的内容。

    此外、提供的中止处理程序是一个参考实现。 我们在用户指南中提到:

    异常处理程序

    R4/R5 CPU 分支到一个异常处理程序以在运行时处理故障。 处理以下异常:

    • 预取中止(精确)
    • 数据中止(精确和不精确)
    • 未定义的指令

    这些处理程序通常由 RTOS/HAL 层定义、因此不由库提供。 但是、提供了一个参考实现来处理导致 CPU 异常的错误

    注释2:

    SafeTI 诊断库未针对 Thumb2模式进行测试。 未将此内容作为初始要求的一部分进行记录。 此 SDOCM00122841上有一个活动 TT、根本原因分析提到 Thumb2模式支持未被捕获为 SafeTI 诊断库的要求。

    由于大多数安全客户仅在 ARM 模式下运行、因此这不是关键工作项目。

    注释3:

    我想提请您注意、TI 发布的所有 Hercules 软件都没有经过认证、请参阅许可条款。 我们遵循 TUV 认证的软件开发流程、但不遵循发布软件。 客户有责任获取软件并进行认证、以帮助我们提供"合规性支持包(CSP)"、其中包含必要的工件和工具、供客户将其用于认证。

    来回答您的具体问题:

    "目前我必须在2个选项之间做出决定、a)将整个软件置于 ARM 模式->占用大量代码空间 b)修改"已认证"的 SafeTI 代码以将某些函数置于 ARM 模式... "

    如果由于存储器限制而无法迁移到100% ARM 模式、您可以修改某些 SafeTI 诊断功能并使用它们、仅针对客户无法使用 CSP 的特定功能、他们必须根据其软件质量目标/计划执行静态和动态分析。

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

    左侧有1个问题(请参阅关于注释2)

    关于 Comment1:是、但在案例指南中会提到"提供的参考实现仅在 ARM 模式下工作、原因是 X (对于其他代码模式、lr 将不会正确设置)"开始时、可以很清楚地看到、在演示应用程序不提供的两种模式之间需要额外的东西、而不仅仅是需要由自己制作的代码来处理真正的故障。


    关于 Comment2:如果我根据其他来源的注释正确理解、下一个 SafeTI 版本可能包含中止处理程序、其中第一阶段由 ASM 完成、因此尽管存在该模式、LR 始终是正确的(我已经看到(草稿?) 此类代码的版本)-最可能与您提到的 TT 编号相关。

    问题:如果准备就绪、是否可以"非正式"发布中止处理程序的最新汇编器代码部分、以便每个人都不需要从头开始手动执行该部分、以防他们不使用100% ARM 模式 (在 ARM 模式下也不会受到伤害)?


    关于 Comment3:是的、这就是我使用"认证"术语的原因、因为我知道它不是完全准备好的封装而没有任何工作。 但现在修改部分对我来说也很清楚,谢谢。 我必须按照 sl_ESM.c 中的测试函数 STC、CCMR4F、DMA 和寄存器位栈进行修复(每个实际上只有1行更改)、因此在任何情况下都需要您提到的过程。

    这种"_arm modification"可以也应该替换为上面提到的适当的中止 asm 处理程序、因此无需再担心_arm 修改、初始问题是了解发生某种情况的根本原因、因为在启动此线程时、我不清楚这种情况、 几天后发现了它。 至少我们需要准备非100% ARM 代码、因为我们还没有准备好相当大的非安全代码包、而在其他环境中需要~2MB 闪存。 因此、最好在一切准备就绪的最后阶段比遇到缺陷更早地找到这些缺陷-"只需"切换编译器模式即可将所有代码放入内存...