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.

[参考译文] 编译器/TMS320F2.8379万D:编译器错误或driverlib错误???

Guru**** 2585275 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655376/compiler-tms320f28379d-compiler-bug-or-driverlib-bug

部件号:TMS320F2.8379万D
主题中讨论的其他部件:C2000WARE

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

不确定这是C预处理程序的错误,还是仅是Driverlib的错误。   

我从C2000ware 1.03 中导入了ADC_EX2_SOC_ePWM示例程序,并在试用。  (使用Code Composer 7.3)。

在ADC_EX2_SOC_ePWM.c文件的顶部,我更改了:

//
//定义
//
#define results_buffer_size 256
//#define EX_ADC_resolution ADC_resolution 12 bit //或ADC_resolution _16BIT
//#define EX_ADC_SIGNAL_MODE ADC_MODE_SINGLE_END_END_//或ADC_MODE_DIFFERENTIAL
#define EX_ADC_Resolution ADC_Resolution ADC_16BIT
#define MODE (EX_ADC_ADC_ADC_ADC_SIGNAL模式) 

然后运行示例,乍一看,它似乎起作用了。  我在调试器中看到ADC_setMode()确实将ADC设置为16位差动模式。

然而,我被initADCSOC()抛弃了。  在编辑器中,它似乎仍然像我所期望的那样灰掉ADC_Resolution _16BIT的更改。  为了确认它没有被执行,我将代码调整为:

////
功能,用于配置ADCA的SOC0由ePWM1触发。
//
void initADCSOC(void)
{
//
//将ADCA的SOC0配置为转换引脚A0。 EPWM1SOCA信号为
//触发器。
//
//对于12位分辨率,采样窗口为15 (200MHz时为75 ns
// SYSCLK率)。 对于16位分辨率,的采样窗口
//将使用64 (200MHz SYSCLK速率时为320 ns)。
//
#IF (EX_ADC_Resolution = ADC_Resolution _12位)
ADC_setupSOC (ADCA_BASE,ADC_SOC_NUMBER0,ADC_TRIGG_EPWM1_SOCA,
ADC_CH_ADCIN0,15);
#Elif (EX_ADC_Resolution == ADC_Resolution _16BIT)
错误;
ADC_setupSOC (ADCA_BASE,ADC_SOC_NUMBER0,ADC_TRIGG_EPWM1_SOCA,
ADC_CH_ADCIN0,64);
#endif

//
//设置SOC0以设置中断1标志。 启用中断并生成
//确保其标志已清除。
//
ADC_setInterruptSource (ADCA_BASE,ADC_INT_NUMBER1,ADC_SOC_NUMBER0);
ADC_enableInterrupt (ADCA_BASE,ADC_INT_NUMBER1);
ADC_clearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1);
}

它仍然很好!!! (错误未导致错误)。  我不确定问题是#if()语句格式错误,还是CPP正因为ADC_Resolution _16BIT是枚举类型而阻塞。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    预处理程序不会看到枚举类型,它们是C语言构造。 任何无法识别的宏将被视为0。

    要调试此问题,请执行以下操作:
    步骤1:添加\#else子句以捕获意外情况
    第2步:向\#如果的每个分支添加一个\#警告,告知您使用了哪个分支。
    步骤3:添加一系列测试,如下所示:
    \#如果已定义(ADC_Resolution _12位)
    \#警告"ADC_Resolution _12位已定义"
    \#否则
    \#警告"ADC_Resolution _12位未定义"
    \#endif

    我预计这将显示ADC_Resolution _12位未定义为预处理宏。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在编辑器中,它似乎仍然灰掉了ADC_Resolution _16BIT的更改,正如我所期望的那样。  为了确认它没有被执行,我调整了代码[/QUOT]

    了解预处理过程中发生的情况的另一种方法是使用生成选项--gen_preprocessor_listing,然后检查生成的.rl文件。  请在 C28x编译器手册中阅读有关该选项的更多信息

    谢谢,此致,

    -George

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

    感谢您的回复。  我不确定预处理程序是否可以解析枚举类型。  我猜编写此代码的TI员工也不是。

    我同意您的说法,即1.03 .0.0 存在错误。  

    个人而言,我很欣赏“adc.h”中使用ADC位分辨率枚举类型的方法,以实现未来的可扩展性,但是由于预处理程序的这种限制,这似乎不是便携式代码的最佳方法。

    最后一个问题。  如何将此情况报告给维护/发布该库的个人/团队?

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

    Gary Brack 说:
    如何将此问题报告给维护/发布该库的个人/团队?[/QUOT]

    我要将此主题转移到C2000论坛。  这就是C2000Ware (包含driverlib)的所有者所在。  我会让他们知道发现了问题。

    谢谢,此致,

    -George

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

    谢谢,我已经报告了此问题,因此可以修复。

    此致
    Chris