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**** 1984585 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 包含以下函数:

Fullscreen
1
2
3
4
boolean pbistIsTestCompleted(void)
{
return ((systemREG1->MSTCGSTAT & 0x1U) != 0U);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


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

Fullscreen
1
2
3
4
5
boolean pbistIsTestCompleted(void)
{
uint32 stat = systemREG1->MSTCGSTAT;
return ((stat & 0x1U) != 0U);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

进行此修改后、系统进入预取中止异常。 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 -

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

    您好!

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

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

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

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

    ——
    谢谢、此致、
    Jagadish。

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

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

x 出现错误。请重试或与管理员联系。