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.

[参考译文] TMS570LS1114:tiarmclang:用于简单分配的错误汇编输出!!!

Guru**** 2393835 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1060510/tms570ls1114-tiarmclang-wrong-assembly-output-for-simple-assignment

器件型号:TMS570LS1114
主题中讨论的其他器件:HALCOGENTMS570LC4357

我从 HALCoGen 版本04.05.01中导出了以下代码片段:

sys_startup.c 文件:

/* Release the MibSPI1 modules from local reset.
     * This will cause the MibSPI1 RAMs to get initialized along with the parity memory.
     */
     mibspiREG1->GCR0 = 0x1U;

/**
.
.
other code (unrelated to SPI)
.
.
*/

/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Hardware status bit read check" */
    while ((mibspiREG1->FLG & 0x01000000U) == 0x01000000U)
    { 
    }/* Wait */ 

对 GCR0中的 nRESET 位进行简单分配的线路按如下方式进行组装:

mibspiREG1->GCR0 = 0x1U;
0002a604:   E5810000            str        r0, [r1]
0002a608:   E30F1800            movw       r1, #0xf800
0002a60c:   E34F1FF7            movt       r1, #0xfff7

请注意、值1或任何值都没有立即值。 使用调试器会发现、GCR0寄存器肯定不会按照 C 代码的指示分配值1!!!

这会导致对标志的轮询为一个无限循环、从而导致系统在启动代码上立即停止。

使用 TI_ARM_V20.2.5LTS 编译的相同行提供了以下汇编代码:

 mibspiREG1->GCR0 = 0x1U;
0002b0a8:   E59F00C0            ldr        r0, [pc, #0xc0]
0002b0ac:   E3A0C001            mov        r12, #1
0002b0b0:   E580C000            str        r12, [r0]

它实际上会将立即值1加载到正确的位置、应用程序工作正常!!!

我的问题是:

这只是编译器要做的一件非常基本的事情、那么是否有任何命令行参数可以修复此问题或应在结构上应用的属性? 请注意、这是 HALCoGen 导出的代码、因此它不是开发人员编写的代码、而且以前工作正常!!

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

    您好、Mazen、

    HalCoGen 生成的代码没有问题。 我还没有尝试过用于 Hercules 器件的 Clang 编译器。 请在 CS/编译器论坛中查看此问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="504659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum 1060510/tms570ls1114-tiarmclang-wrong-assembly-output-for simple-assignment">请注意、值1或任何值都没有立即值。 使用调试器可以发现、GCR0寄存器当然不会按照 C 代码的指示分配值1!!![/quot]

    我已经了解了 如何使用 HALCoGen 04.07.01为 TMS570LC4357生成的 mibspiInit 函数。

     mibspiInit 函数中的初始语句如下、第一个语句位于源文件行70中:

        mibspiREG1->GCR0 = 0U;
        mibspiREG1->GCR0 = 1U;

    如果将 TI ARM 编译 器 v20.2.5.LTS 与-opt_level=off 和-keep_asm 配合使用以保留生成的汇编器、则生成的汇编器为:

    	.dwpsn	file "../source/HL_mibspi.c",line 70,column 5,is_stmt,isa 2
            LDR       A1, $C$CON1           ; [DPU_V7R4_PIPE0] |70| 
            MOV       V9, #0                ; [DPU_V7R4_PIPE0] |70| 
            STR       V9, [A1, #0]          ; [DPU_V7R4_PIPE0] |70| 
    	.dwpsn	file "../source/HL_mibspi.c",line 71,column 5,is_stmt,isa 2
            LDR       A1, $C$CON1           ; [DPU_V7R4_PIPE0] |71| 
            MOV       V9, #1                ; [DPU_V7R4_PIPE0] |71| 
            STR       V9, [A1, #0]          ; [DPU_V7R4_PIPE0] |71| 
    
    <snip>
    	.sect	".text"
    	.align	4
    ||$C$CON1||:	.bits		0xfff7f400,32

    因此、从生成的汇编器中、您可以看到寄存器写入指令在源语句的行号之后进行排序。

    如果使用具有-O=0 (禁用优化)和-save-temps 的 TI Clang v1.3.0.LTS 来保留生成的汇编器、则生成的汇编器为:

    	movw	r2, #62464
    	movt	r2, #65527
    	mov	r0, #0
    .Ltmp0:
    	.loc	7 70 41 prologue_end            @ ../source/HL_mibspi.c:70:41
    	str	r0, [r2]
    	mov	r1, #1
    	.loc	7 71 41                         @ ../source/HL_mibspi.c:71:41
    	str	r1, [r2]
    	movw	r2, #62576
    	movt	r2, #65527
    	.loc	7 74 78                         @ ../source/HL_mibspi.c:74:78

    TI Clang 编译器已插入指令将0和1写入 mibspiREG1->GCR0、但设置寄存器地址(R2)和要写入的值(r0或 r1)的指令显示在源语句之前。 即、就可以看出 TI Clang 编译器已生成预期的指令而言、但指令与用于将源语句编码为调试器指令的源文件.loc 之间存在偏差。

    这是否说明了您看到的问题?

    如果不是、 请按照文章 如何提交编译器测试用例中的说明进行操作。