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.

[参考译文] TMS320F28388D:子例程的输入参数优化错误。

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1115991/tms320f28388d-input-parameters-of-subroutine-are-wrong-optimized

器件型号:TMS320F28388D

各位专家:

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

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

    请说明有关...的所有详细信息。

    [引用 userid="183915" url="~/support/microset/C2000-microset-group/C2000/f/C2000-microset-forum/1115991/tms320f28388d-input-parameters-of-subroutine-are wrong-optimed"] ADCSOC0CTL.bit.CHSEL (= SOC0的输入引脚)错误/引用错误。]

    您看到了什么可以让您知道问题发生了?  您希望看到什么?

    我需要构建代码才能调查问题。  我不确定是要考虑没有额外易失性局部变量的代码、还是具有额外的局部变量的代码。   

    将代码放入您希望我调查的表单中。  然后 、对于该源文件、请按照文章 如何提交编译器测试用例中的说明进行操作

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢你的答复。

    >请描述有关...的所有详细信息。

    >>Hidehiko Kaya 说:
    >>ADCSOC0CTL.bit.CHSEL (= SOC0的输入引脚)设置错误。

    我们的代码在 ADC A、B、C、D 上使用 ad_x_cfg_soc ()设置 SOC0。

    我们的设计如下
    ADC A 通道选择(CHSEL):SOC0=2、SOC1=4、SOC2=14
    ADC B:SOC0=2,SOC1=4
    ADC C:SOC0=2,
    错误情况(示例=有多种模式)
    ADC A 通道选择(CHSEL):SOC0=4、SOC1=4、SOC2=14
    ADC B:SOC0=4,SOC1=4
    ADC C:SOC0=4,

    相同的 ad_x_cfg_soc ()存在一些错误情况。
    我们检查了以下几点。
    -输入参数被破坏(意外的错误写入)。
    (因为它们是全局变量)
    -堆栈溢出
    -记录输入值,本地变量,用于在 ad_x_cfg_soc ()中设置寄存器字段。
    ->输入值正确、但局部变量错误。
    因此、我怀疑编译器优化、我很难入侵 C2000安全代码。
    因此、我发布此问题需要您的支持。

    >将代码放入您希望我调查的表单中。  

    >对于该源文件, 请按照文章 How to Submit a Compiler Test Case 中的说明进行操作。

    我知道。 我将准备代码来调查此问题。

    我将在输入我们的消息来源后通知此问题。

    此致、

    Hidehiko