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.

[参考译文] Compiler/SIMPLELINK-CC2640R2-SDK:C编译器优化问题

Guru**** 2556800 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/588606/compiler-simplelink-cc2640r2-sdk-c-compiler-optimization-question

部件号:SIMPLELINK-CC2640R2-SDK

工具/软件:TI C/C++编译器

我遇到了一些C编译器优化问题。

我使用的是7.0 Studio版本:0.0.0022万

ARM编译器工具16.9 .0.LTS com.ti.CGT.tcsci 470.15.win32.feature.group德州仪器(TI)

以下是源代码:

typedef uint64_t RF_EventMask;

#define RF_EventLastCmdDone (1<1)
#define RF_EventRxEntryDone (1<23)

#pragma function_options(ull_scanDoneCb,"--opt_level=1")
void ull_scanDoneCb (RF_handle rfHandle,RF_CmdHandle cmdle,RF_EventMask事件)

IF (事件和RF_EventRxEntryDone)

/*对讲机已收到数据包*/
uble_buildAndPostEvt (UB_EVTDST_LL,ull_EVT_SCAN_RX_SUCCESS,NULL,0);
}
否则,如果(Events & RF_EventLastCmdDone)

...

从SWI调用回调时,"Events"应为"RF_EventRxEntryDone"(0x80万)或"RF_EventLastCmdDone | RF_EventRxEntryDone"(0x0080000002)。

以下是opt_level=0的程序集:

519{
ull_scanDoneCb():
0.0006万f6c:B580 push{r7,LR}
0.0006万f6e:4618 mov r0,R3
524 IF (事件和RF_EventRxEntryDone)
0.0006万f70:F44F0100 mov.w R1,#0x80万
0.0006万f74:2300 MOV R3,#0
0.0006万f76:4011 ands R1,R2
0.0006万f78:EA3.07万和.w r7,R3,r0
0.0006万f7c:2F00 CMP r7,#0
0.0006万f7e:d100 bne $C$L7
0.0006万f80:2900 CMP R1,#0
$C$L7:
0.0006万f82:d123 bne $C$L10
532其他IF (事件和RF_EventLastCmdDone)

当“opt_level=0”时,代码按预期分支为$C$L10。 在调用ull_scanDoneCb()之前,R2为0x80万或0x80.0002万。

以下是opt_level=1的程序集:

519{
ull_scanDoneCb():
0.0006万d84:4618 mov r0,R3
524 IF (事件和RF_EventRxEntryDone)
0.0006万d86:F44F0100 mov.w R1,#0x80万
0.0006万d8a:B580 push{r7,LR}
0.0006万d8c:2300 MOV R3,#0
0.0006万d8e:4011 ands R1,R2
0.0006万d90:EA3.07万和.w r7,R3,r0
0.0006万d94:2F00 CMP r7,#0
0.0006万d96:D100 bne $C$L7
0.0006万d98:2900 CMP R1,#0
$C$L7:
0.0006万d9a:d123 bne $C$L10
532其他IF (事件和RF_EventLastCmdDone)

当"opt_level=1"时,它没有分支到$C$L10。 奇怪的是,R2在调用ull_scanDoneCb()之前始终为0x0.0002万。

在调用函数之前,设置函数级别优化似乎会以不同的方式填充R2。 请注意,没有#pragma的相同代码在IAR中运行良好(也在最高优化设置中)。 如果您需要更多信息,请告诉我。 请尽快通知。

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

    Supertrainmegazord 说:
    void ull_scanDoneCb (RF_handle rfHandle,RF_CmdHandle cmdHandle,RF_EventMask事件)

    根据ARM编译器的寄存器约定,事件在寄存器R2中传递。  

    Supertrainmegazord 说:
    "opt_level=1"时,它没有分支到$C$L10。 奇怪的是,R2在调用ull_scanDoneCb()之前始终为0x0.0002万。

    如果R2包含0x0.0002万,则如果...

    Supertrainmegazord 说:
    如果(事件和RF_EventRxEntryDone)

    不应采取.。  因此,您需要弄清楚为什么R2 (事件)具有意外值。

    谢谢,此致,

    -George

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

    感谢您的快速响应。 但从我的角度来看,关闭ull_scanDoneCb()中的优化将“修复”问题。 ull_scanDoneCb()中的优化级别会影响R2输入。 这怎么可能? 请注意,ull_scanDoneCb()是从SDK中的库调用的。 我不确定它是如何构建的,或者使用了什么优化级别。

    库中的优化级别不匹配是否会导致此问题? 我应该尝试哪些步骤来证明这一点? 我希望避免将 #pragma 放在周围或编译整个模块而不进行优化。

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

    Supertrainmegazord 说:
    在ull_scanDoneCb()中的优化级别以某种方式影响R2输入。

    不直接。  您的系统可能始终存在某些问题。  使用不同的优化级别构建ull_scanDoneCb会导致出现或隐藏问题。

    谢谢,此致,

    -George