主题中讨论的其他器件: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
为什么会发生这种情况? 如何找到问题? 非常感谢!
