工具/软件: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中运行良好(也在最高优化设置中)。 如果您需要更多信息,请告诉我。 请尽快通知。