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.

[参考译文] 修改 pbistIsTestCompleted 后的预取中止

Guru**** 2537060 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1444053/prefetch-abort-after-modifying-pbististestcompleted

器件型号:TMS570LS1227
主题中讨论的其他器件:HALCOGEN

工具与软件:

由 HalCoGen 生成的 sys_selftest.c 包含以下函数:

boolean pbistIsTestCompleted(void)
{
    return ((systemREG1->MSTCGSTAT & 0x1U) != 0U);
}


它违反了 MISRA-C 2004  12.2 "复杂表达式中的易失性变量"的规定、因此我 将其替换为这个等效函数

boolean pbistIsTestCompleted(void)
{
  uint32 stat = systemREG1->MSTCGSTAT;
  return ((stat & 0x1U) != 0U);
}

进行此修改后、系统进入预取中止异常。 nERROR 引脚可能会发生切换、即由该引脚控制的继电器会相互切换。

寄存器为 CP15.CPAR=0x0d IFSR、CP15.IFAR=0xc3CB2 (无效地址)、CP15.AIFSR=0x0。

如果我撤消此修改、预取中止将消失。 如果我将其相加、预取会再次发生。  如果我在调试器中逐步运行代码、预取将消失。

我认为不是我的代码导致这个问题,因为它在运行 main ()之前会进入预取异常,而在 main ()之前运行的代码是由 HalCoGen 生成的,除了 pbistIsTestCompleded。

尽管 C 代码看起来是等效的、但汇编语言却非常不同。 但我不明白为什么它与预取中止相关。 编译器标志为-mv7R4 --code_state=32 --float_support=VFPv3D16 --include_path="C:/ti/ccs1260/ccs/tools/compiler/ti-cgt-arm_20.2.7.LTS/include --include_path="C:/ti/Hercules/F021 Flash api/02.01/include"-g --symdebug:dwarf_version=3 --c99 --diag_warning=225 - diag_funfem=on-example_subsectionsections=-on-gen_display_subsections--gen_subsectionsections=on-gen_type=on-abi-packed -gen_subsectionsections=on -

boolean pbistIsTestCompleted(void)
{
    return ((systemREG1->MSTCGSTAT & 0x1U) != 0U);
}
          pbistIsTestCompleted():
000176cc:   E3E0C097            mvn        r12, #0x97
000176d0:   E59C1000            ldr        r1, [r12]
000176d4:   E3A00000            mov        r0, #0
000176d8:   E3110001            tst        r1, #1
000176dc:   E3A0C000            mov        r12, #0
000176e0:   0A000000            beq        $C$L11
000176e4:   E3A0C001            mov        r12, #1
          $C$L11:
000176e8:   E35C0000            cmp        r12, #0
000176ec:   0A000000            beq        $C$L12
000176f0:   E3A00001            mov        r0, #1
 315      }
          $C$L12:
000176f4:   E12FFF1E            bx         lr

boolean pbistIsTestCompleted(void)
{
    uint32 stat = systemREG1->MSTCGSTAT;
    return ((stat & 0x1U) != 0U);
}
          pbistIsTestCompleted():
00016ea0:   E24DD008            sub        r13, r13, #8
 312          uint32 stat = systemREG1->MSTCGSTAT;
00016ea4:   E3E0C097            mvn        r12, #0x97
00016ea8:   E59CC000            ldr        r12, [r12]
00016eac:   E58DC000            str        r12, [r13]
 313          return ((stat & 0x1U) != 0U);
00016eb0:   E59D1000            ldr        r1, [r13]
00016eb4:   E3A00000            mov        r0, #0
00016eb8:   E3110001            tst        r1, #1
00016ebc:   E3A0C000            mov        r12, #0
00016ec0:   0A000000            beq        $C$L11
00016ec4:   E3A0C001            mov        r12, #1
          $C$L11:
00016ec8:   E35C0000            cmp        r12, #0
00016ecc:   0A000000            beq        $C$L12
00016ed0:   E3A00001            mov        r0, #1
 316      }
          $C$L12:
00016ed4:   E28DD008            add        r13, r13, #8
00016ed8:   E12FFF1E            bx         lr

为什么会发生这种情况? 如何找到问题? 非常感谢!

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

    您好!

    你是完全正确的,我可以看到同样的行为在我的最后

    我修改了变量声明、如下所示:

    这样解决了这个问题、我的意思是、可能是在 RAM 存储器中创建一个变量、从而造成了这个问题。 这就是我选择为变量分配寄存器的原因、它最终解决了问题

    请以此进行测试、同时进行 MISRA 验证、并让我知道结果。

    ——
    谢谢、此致、
    Jagadish。

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

    在声明中添加 register 关键字可解决该问题。 它不会违反我的静态分析工具检查的 MISRA 规则。  感谢您的解决方案!