主题中讨论的其他器件:RM57L843、 HALCOGEN
工具/软件:TI C/C++编译器
附加的项目是在 CCS 10中创建的、目标是 使用 HalCoGen 生成的源代码的 RM57L843。 该项目选择 CCS 在 gcc-arm-none-eabi-7-2017-Q4-majer-Win32目录中安装的 GNU v7.2.1 (Linaro)编译器。
source/hL_system.c 文件中的以下 C 函数:
resetSource_t getResetSource (void) { 寄存器 resetSource_t rst_source; if ((SYS_EXception &(UINT32) powerON_RESET)!= 0U) { /*上电复位条件*/ RST_SOURCE = POWERON_RESET; /*清除所有异常状态标志并在通电后继续进行*/ SYS_EXception = 0x0000FFFFU; } 否则(((SYS_EXception &(UINT32) EXT_RESET)!= 0U) { /*由于外部复位导致的复位。 * RST_SOURCE = EXT_RESET; SYS_EXception =(UINT32) EXT_RESET; } 如果((SYS_EXCE异常 和(UINT32) DEBUG_RESET)!=0U)则为其他 { /*由于调试复位请求导致的复位*/ RST_SOURCE = DEBUG_RESET; SYS_EXception =(UINT32) debug_reset; } 如果((SYS_EXception &(UINT32) OSC_failure_reset)!= 0U)则为其他值 { /*由于振荡器故障导致的复位。 在此处添加用户代码以处理振荡器故障*/ RST_SOURCE = OSC_FAILY_RESET; SYS_EXception =(uint32) OSC_failure_reset; } 如果((SYS_EXCE异常 和(UINT32)安全装置复位)!=0U)则为其他 { /*由于违反看门狗而导致的复位*/ RST_SOURCE =安全装置复位; SYS_EXception =(uint32) watchdog_reset; } 如果((SYS_EXCE异常&(UINT32) WATCHDOG2_RESET)!=0U)则为其他 { /*由于违反看门狗而导致的复位*/ RST_SOURCE = WATCHDOG2_RESET; SYS_EXception =(UINT32) WATCHDOG2_RESET; } 否则(((SYS_EXCE异常&(UINT32) CPU0_RESET)!=0U) { /*由于 CPU0复位导致的复位。 CPU 复位可能由 CPU 自检完成、或引起 通过切换 CPU 复位控制寄存器的"CPU RESET"位。 * RST_SOURCE = CPU0_RESET; SYS_EXception =(UINT32) CPU0_RESET; } 否则(((SYS_EXception &(UINT32) SW_RESET)!= 0U) { /*由于软件复位导致的复位。 * RST_SOURCE = SW_RESET; SYS_EXception =(UINT32) SW_RESET; } 其他 { /*发生了 No_reset。 * RST_SOURCE = NO_RESET; } 返回 rst_source; }
生成以下汇编器(如使用 -save-temps -fverbose-asm 选项创建的 Debug/HL_system.s 文件中所示、使编译器保存生成的汇编器):
.align2 .globalgetResetSource .Syntax unified .arm .fpu vfpv3-D16 .typegetResetSource、%function getResetSource: .lFB7: .loc 1 .454_startproc @ naked function:prologueue 和 CFI 程序员提供的结语。 @ args = 0、假装= 0、帧= 0 @ frame_need=0、uses_anonymous _args = 0 @./source/HL_system.c:457: 如果((SYS_EXception &(uint32) power_reset)!= 0U) .loc 1 457 0 mvnR3、#0@ tmp127、 LDRR3、[R3、#-27]@_1、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#32768@_1、 bne.l25@、 @../source/HL_system.c:465: 否则、如果((SYS_EXException &(UINT32) EXT_RESET)!= 0U) .loc 1 465 0 mvnR3、#0@ tmp130、 LDRR3、[R3、#-27]@_3、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#8@_3、 bne.l26@、 @../source/HL_system.c:471: 否则、如果(((SYS_EXCE异常 和(UINT32) DEBUG_RESET)!=0U) .loc 1 471 0 mvnR3、#0@ tmp133、 LDRR3、[R3、#-27]@_5、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#2048@_5、 bne.l27@、 @../source/HL_system.c:477: 否则、如果((SYS_EXception &(uint32) OSC_failure_reset)!= 0U) .loc 1 477 0 mvnR3、#0@ tmp136、 LDRR3、[R3、#-27]@_7、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#16384@_7、 bne.l28@、 @../source/HL_system.c:484: 否则、如果(((SYS_EXception &(UINT32) Watchdog_reset)!=0U) .loc 1 484 0 mvnR3、#0@ tmp139、 LDRR3、[R3、#-27]@_9、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#8192@_9、 bne.l29@、 @../source/HL_system.c:490: 否则、如果((SYS_EXCE异常&(UINT32) WATCHDOG2_RESET)!=0U) .loc 1 490 0 mvnR3、#0@ tmp142、 LDRR3、[R3、#-27]@_11、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#4096@_11、 bne.l30@、 @../source/HL_system.c:496: 否则、如果((SYS_EXception &(UINT32) CPU0_RESET)!=0U) .loc 1 496 0 mvnR3、#0@ tmp145、 LDRR3、[R3、#-27]@_13、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#32@_13、 bne.l31@、 @../source/HL_system.c:504: 否则、如果((SYS_EXception &(uint32) sw_reset)!= 0U) .loc 1 504 0 mvnR3、#0@ tmp148、 LDRR3、[R3、#-27]@_15、 MEM[(volatile UINT32 *) 4294967268B] TSTR3、#16@_15、 bne.l32@、 @../source/HL_system.c:513: RST_SOURCE = NO_RESET; .loc 1 513 0 movr0、#0@ , .LVL18: @./source/HL_system.c:517:} .loc 1 517 0 .LVL19: .L25: @../source/HL_system.c:463: SYS_EXception = 0x0000FFFFU; .loc 1 463 0 mvnR3、#0@ tmp128、 movwR2、#65535@ tmp129、 strR2、 [R3、#-27]@ tmp129、MEM[(volatile UINT32 *) 4294967268B] @./source/HL_system.c:460: RST_SOURCE = POWERON_RESET; .loc 1 460 0 movr0、#32768@ , .LVL20: .L26: @…/source/HL_system.c:469: SYS_EXception =(uint32) EXT_RESET; .loc 1 469 0 movr0、#8@ tmp132、 mvnR3、#0@ tmp131、 strr0、 [R3、#-27]@ tmp132、MEM[(volatile UINT32 *) 4294967268B] .LVL21: .L27: @../source/HL_system.c:475: SYS_EXception =(uint32) debug_reset; .loc 1 475 0 movr0、#2048@ tmp135、 mvnR3、#0@ tmp134、 strr0、 [R3、#-27]@ tmp135、MEM[(volatile UINT32 *) 4294967268B] .LVL22: .l28: @../source/HL_system.c:482: SYS_EXception =(uint32) OSC_failure_reset; .loc 1 482 0 movr0、#16384@ tmp138、 mvnR3、#0@ tmp137、 strr0、 [R3、#-27]@ tmp138、MEM[(volatile UINT32 *) 4294967268B] .LVL23: .l29: @../source/HL_system.c:488: SYS_EXception =(uint32) watchdog_reset; .loc 1 488 0 movr0、#8192@ tmp141、 mvnR3、#0@ tmp140、 strr0、 [R3、#-27]@ tmp141、MEM[(volatile UINT32 *) 4294967268B] .LVL24: .l30: @../source/HL_system.c:494: SYS_EXception =(uint32) WATCHDOG2_reset; .loc 1 494 0 movr0、#4096@ tmp144、 mvnR3、#0@ tmp143、 strr0、 [R3、#-27]@ tmp144、MEM[(volatile UINT32 *) 4294967268B] .LVL25: .l31: @../source/HL_system.c:502: SYS_EXception =(uint32) CPU0_RESET; .loc 1 502 0 movr0、#32@ tmp147、 mvnR3、#0@ tmp146 、strr0、 [R3、#-27]@ tmp147、MEM[(volatile UINT32 *) 4294967268B] .LVL26: .l32: @../source/HL_system.c:508: SYS_EXception =(uint32) sw_reset; .loc 1 508 0 movr0、#16@ tmp150、 mvnR3、#0@ tmp149、 strr0、 [R3、#-27]@ tmp150、MEM[(volatile UINT32 *) 4294967268B] .fi_endproc .LFE7: .sizegetResetSource、.-getResetSource
生成的汇编器似乎已经在源函数中混淆了 IF 结构、并将对 SYS_EXception 的所有赋值置于一个线性序列中、该序列在函数末尾无条件执行。 此外、函数末尾没有"BX LR"、因此执行过程会继续执行 存储器中 getResetSource 函数之后的操作。