各位专家:
TI-CGT-C2000_21.6.0.LTS
如果 optlv=2、speed=lv4、则会生成错误的代码
ADCSOC0CTL.bit.CHSEL (= SOC0的输入引脚)设置错误。
请告诉我为什么 CGT 优化不正确?
/*PrivateFunction*/
static void ad_x_cfg_soc( UINT16 block, INT16 soc, UINT16 pin, UINT16 sh_time, UINT16 trg ){
volatile struct ADC_REGS * adcRegs_pst;
UINT16 acqps_u16;
adcRegs_pst = _mwadRegTbl_as[ block];
acqps_u16 = (sh_time + MWAD_SYSCLK_TIME - 1)/MWAD_SYSCLK_TIME - 1U;
EALLOW;
switch( soc ){
case 0: /* SOC 0 */
adcRegs_pst->ADCSOC0CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC0CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC0CTL.bit.TRIGSEL = trg;
break;
case 1: /* SOC 1 */
adcRegs_pst->ADCSOC1CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC1CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC1CTL.bit.TRIGSEL = trg;
break;
case 2: /* SOC 2 */
adcRegs_pst->ADCSOC2CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC2CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC2CTL.bit.TRIGSEL = trg;
break;
case 3: /* SOC 3 */
adcRegs_pst->ADCSOC3CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC3CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC3CTL.bit.TRIGSEL = trg;
break;
case 4: /* SOC 4 */
adcRegs_pst->ADCSOC4CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC4CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC4CTL.bit.TRIGSEL = trg;
break;
case 5: /* SOC 5 */
adcRegs_pst->ADCSOC5CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC5CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC5CTL.bit.TRIGSEL = trg;
break;
case 6: /* SOC 6 */
adcRegs_pst->ADCSOC6CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC6CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC6CTL.bit.TRIGSEL = trg;
break;
case 7: /* SOC 7 */
adcRegs_pst->ADCSOC7CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC7CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC7CTL.bit.TRIGSEL = trg;
break;
case 8: /* SOC 8 */
adcRegs_pst->ADCSOC8CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC8CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC8CTL.bit.TRIGSEL = trg;
break;
case 9: /* SOC 9 */
adcRegs_pst->ADCSOC9CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC9CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC9CTL.bit.TRIGSEL = trg;
break;
case 10: /* SOC 10 */
adcRegs_pst->ADCSOC10CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC10CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC10CTL.bit.TRIGSEL = trg;
break;
case 11: /* SOC 11 */
adcRegs_pst->ADCSOC11CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC11CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC11CTL.bit.TRIGSEL = trg;
break;
case 12: /* SOC 12 */
adcRegs_pst->ADCSOC12CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC12CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC12CTL.bit.TRIGSEL = trg;
break;
case 13: /* SOC 13 */
adcRegs_pst->ADCSOC13CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC13CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC13CTL.bit.TRIGSEL = trg;
break;
case 14: /* SOC 14 */
adcRegs_pst->ADCSOC14CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC14CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC14CTL.bit.TRIGSEL = trg;
break;
case 15: /* SOC 15 */
adcRegs_pst->ADCSOC15CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC15CTL.bit.CHSEL = pin;
adcRegs_pst->ADCSOC15CTL.bit.TRIGSEL = trg;
break;
default:
break;
}
EDIS;
}
我更改此代码以消除对输入参数的优化、如下所示。
static void ad_x_cfg_soc( UINT16 block, INT16 soc, UINT16 pin, UINT16 sh_time, UINT16 trg ){
volatile struct ADC_REGS * adcRegs_pst;
volatile UINT16 acqps_u16;
volatile INT16 soc_s16 = soc;
volatile UINT16 pin_u16 = pin;
volatile UINT16 trg_u16 = trg;
acqps_u16 = (sh_time + (UINT16)MWAD_SYSCLK_TIME - 1U)/(UINT16)MWAD_SYSCLK_TIME - 1U;
adcRegs_pst = _mwadRegTbl_as[ block];
EALLOW;
switch( soc_s16 ){
case 0: /* SOC 0 */
adcRegs_pst->ADCSOC0CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC0CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC0CTL.bit.TRIGSEL = trg_u16;
break;
case 1: /* SOC 1 */
adcRegs_pst->ADCSOC1CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC1CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC1CTL.bit.TRIGSEL = trg_u16;
break;
case 2: /* SOC 2 */
adcRegs_pst->ADCSOC2CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC2CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC2CTL.bit.TRIGSEL = trg_u16;
break;
case 3: /* SOC 3 */
adcRegs_pst->ADCSOC3CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC3CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC3CTL.bit.TRIGSEL = trg_u16;
break;
case 4: /* SOC 4 */
adcRegs_pst->ADCSOC4CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC4CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC4CTL.bit.TRIGSEL = trg_u16;
break;
case 5: /* SOC 5 */
adcRegs_pst->ADCSOC5CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC5CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC5CTL.bit.TRIGSEL = trg_u16;
break;
case 6: /* SOC 6 */
adcRegs_pst->ADCSOC6CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC6CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC6CTL.bit.TRIGSEL = trg_u16;
break;
case 7: /* SOC 7 */
adcRegs_pst->ADCSOC7CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC7CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC7CTL.bit.TRIGSEL = trg_u16;
break;
case 8: /* SOC 8 */
adcRegs_pst->ADCSOC8CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC8CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC8CTL.bit.TRIGSEL = trg_u16;
break;
case 9: /* SOC 9 */
adcRegs_pst->ADCSOC9CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC9CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC9CTL.bit.TRIGSEL = trg_u16;
break;
case 10: /* SOC 10 */
adcRegs_pst->ADCSOC10CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC10CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC10CTL.bit.TRIGSEL = trg_u16;
break;
case 11: /* SOC 11 */
adcRegs_pst->ADCSOC11CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC11CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC11CTL.bit.TRIGSEL = trg_u16;
break;
case 12: /* SOC 12 */
adcRegs_pst->ADCSOC12CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC12CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC12CTL.bit.TRIGSEL = trg_u16;
break;
case 13: /* SOC 13 */
adcRegs_pst->ADCSOC13CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC13CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC13CTL.bit.TRIGSEL = trg_u16;
break;
case 14: /* SOC 14 */
adcRegs_pst->ADCSOC14CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC14CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC14CTL.bit.TRIGSEL = trg_u16;
break;
case 15: /* SOC 15 */
adcRegs_pst->ADCSOC15CTL.bit.ACQPS = acqps_u16;
adcRegs_pst->ADCSOC15CTL.bit.CHSEL = pin_u16;
adcRegs_pst->ADCSOC15CTL.bit.TRIGSEL = trg_u16;
break;
default:
break;
}
EDIS;
}
我检查了代码是否按预期工作、以及哪个 opt_level 与此问题相关。
| --opt_level | 结果 |
| 关闭 | 好的 |
| 0 | 好的 |
| 1 | NG |
e2e.ti.com/.../_5F00_mwad_5F00_OK_5F00_opt0.asme2e.ti.com/.../_5F00_mwad_5F00_ERR_5F00_opt1.asm
我附加了汇编文件。
此致、
Hidehiko
