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.

[参考译文] 编译器/LAUNCHXL2-RM57L:HalCoGen 04.07.00生成的 GCC 程序由于 Hercules _SW-6008而不能运行- getResetSource 上的 GCC naked Attribute 不正确(最初以为 GNU arm v7.2.1编译器为 Cortex-R5函数生成了不正确的代码)

Guru**** 2535150 points
Other Parts Discussed in Thread: RM57L843, HALCOGEN

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/909137/compiler-launchxl2-rm57l-halcogen-04-07-00-generated-gcc-program-doesn-t-run-due-to-hercules_sw-6008---incorrect-gcc-naked-attribute-on-getresetsource-initially-thought-gnu-arm-v7-2-1-compiler-generated-incorrect-code-for-a-c

器件型号:LAUNCHXL2-RM57L
主题中讨论的其他器件:RM57L843HALCOGEN

工具/软件: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 函数之后的操作。

e2e.ti.com/.../RM57L843_5F00_GCC_5F00_halcogen.zip

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

    [引用 user="Chester Gillon">该项目选择 GNU v7.2.1 (Linaro)编译器我还尝试使用 GNU v9.2.1 (Linaro)编译该项目、但为 getResetSource 生成的汇编器未更改。 即、较新版本的编译器未修复此问题。

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

    [引用 user="Chester Gillon">生成的汇编器似乎已在源函数中混淆 IF 结构、并将对 SYS_EXception 的所有赋值置于一个线性序列中、该序列在函数末尾无条件执行。 此外、函数末尾没有"BX LR"、因此执行只会继续执行 到存储器中的 getResetSource 函数后面的内容。我刚刚注意到、但在 使用 -save-temps -verbose-asm 选项创建的 Debug/HL_system.s 文件中、有以下注释:

    @ naked 函数:程序员提供的起始代码和结束代码。 

    由 HalCoGen 04.07.00生成的 include/HL_system.h 中的以下声明对此进行了解释:

    resetSource_t getResetSource (void)__attribute__((naked)); 

    如果我在  getResetSource 函数的声明中临时注释掉__attribute__((Baked),则为 getResetSource 生成的汇编器看起来正确。

    也就是说、GNU ARM 编译 器毕竟没有问题、而是 HalCoGen 将 getResetSource 函数标记为 naked 这一事实。 需要检查这是否是 HalCoGen 中的错误。

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

    [引用 user="Chester Gillon">也就是说、GNU ARM 编译  器毕竟没有问题、但 HalCoGen 将 getResetSource 函数标记为 naked 这一事实。 需要检查 这是否是 HalCoGen 中的一个错误。我使用 的是 HalCoGen 04.07.00。

    发现 HalCoGen 04.07.01有以下错误修复:

    [Hercules SW-6008]||应删除 getResetSource GCC 裸属性

    即升级到 HalCoGen 04.07.01可解决此问题。

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

    切斯特、

    感谢您的辛勤工作、并关闭了这个环路!

    乔治