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.

[参考译文] CCS/LAUNCXL-F2.8027万:Code Composer Studio问题。 请提供帮助。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/572363/ccs-launchxl-f28027-code-composer-studio-problem-help-please

部件号:LAUNCHTXL-F2.8027万
主题中讨论的其他部件:TMS320F2.8027万

工具/软件:Code Composer Studio

大家早上好,昨天,我在Code Composer Studio论坛中发布了一条线程,要求解决代码不稳定的问题。 在那篇文章中,我解释了我正在开发一个带有ePWM中断,ADC等的代码,并且我正在通过控制台进行一些打印。然后我说,当我删除或向该程序添加不同的行时,代码会变得不稳定, 即使该行与程序的功能不相关。  

我遇到了程序不停止中断之类的实验问题(在程序的一部分中,它必须有stop ePWM int才能执行一些数学操作,这些运算需要存储在内存中的一系列数据,只有100个整数数据)。 或者我在对源代码进行最小更改时看到的另一个问题(例如,注释一个与该功能相互关联的简单指令)是CCS未启用ePWM的中断以继续程序。  

然后我注意到,如果我逐步运行程序,它会阅读说明,但当我得到关键点(如 禁用中断)程序忽略了我的跳过,它又重新播放了,它取决于CCS的心情=/。而且它忽略了我的跳过,就像指令不在那里一样,它继续与中断保持同步。

我还注意到,我的程序没有按我想要的那样运行,因为CCS正在“跳过”关键指令(例如,启用或禁用中断),但我重复一遍,如果我对我的功能代码进行了不重要的更改,但源代码却非常不稳定,就会发生这种情况。 ”“这种行为没有任何道理,也不知道如何解决。 CCS是否实施了某种"优化",即"跳转指令"和无读取指令? 如何解决此问题? 请你帮忙。现在我不知道该怎么办。

最后,它假定我必须将数据存储在.txt文件中,它工作正常,而我不稳定但功能正常的代码存储数据, 但是它只执行一次,如果我想覆盖我的数据,就像它再次跳过指令一样,因为它不存储任何数据,只需将.txt文件留空而不存储任何数据。

如果有人知道发生了什么事并帮助我解决问题,我会非常感激。

Eliomar Conde。 谨致问候。

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

    您好,Eliomar:

    您看到的跳过步骤的问题可能与 项目中使用的优化有关。 这会影响 代码的编译和执行方式。  您的项目使用的优化级别是什么? 也许您可以在观察到行为的地方附加代码片段。

    此致,

    Ozino

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ozino你好,关于级别优化我真的不知道,我没有接触这些设置,我不知道如何查看或更改这些设置。你能告诉我吗?

    是的,我可以附加代码中我观察到此行为的部分,或者如果您需要,也可以附加完整的源代码。我只需要帮助解决我的不便。目前我只附加一个片段。

    ePWM中断服务例程。

    __interrupt void epwm1_timer_isr (void)


    VAR = 2500 + 2400* sin (2*PI*n/100);

    while (ADC_getIntStatus (myAdc,ADC_IntNumber_1)== 0){
    //printf ("esperando... \n");
    }

    ADC_clearIntFlag (myAdc,ADC_IntNumber_1);
    Buffer[n]= ADC_readResult (myAdc,ADC_ResultNumber_1);
    //Corriente[n]= ADC_readResult (myAdc,ADC_ResultNumber_2);

    n = n + 1;

    如果(n=100){
    N = 0;
    PROM = 1;
    }

    S = gPIO_getData (myGpio,gPIO_NUMBER_12);

    PWM_setCmpA (myPwm1,var); //Fijamos CMPA al valor de la senoidal

    //清除此计时器的INT标志
    PWM_clearIntFlag (myPwm1);

    //确认此中断以接收来自组3的更多中断
    PIE_clearInt (myPie,PIE_GroupNumber_3);
    }

    有时,我会看到,如果我对这个代码做一点更改。愚蠢的更改。
    就像我将“Buffer[n]= ADC_readResult (myAdc,ADC_ResultNumber_1);”更改为完全一样
    "buffer[n]= adc_readResult (myAdc,adc_ResultNumber_1)+ 70;"(相同的数字+70)
    程序设备跳过"S = gPIO_getData(myGPIo, gPIO_NUMBER_12)"行;
    因为此行必须停止ePWM中断并运行main()中存储的代码的下一部分:

    如果(S == 1){

    //pie禁用(myPie);
    //pie_disableAllInts(myPie);
    CPU_disableGlobalInts (myCpu);
    CPU_clearIntFlags (myCpu);

    PWM_setCmpA (myPwm14999);
    PWM_setDeadBandOutputMode (myPwm1,PWM_DeadBandOutputMode_Bypass);

    GPIO切换(myGpio,GPIO编号_3);

    V = 0;

    DELAY _US (100万);

    Archivo = fopen("Voltaje.txt","w+");

    对于(i=0;i<100;i++){
    V = V +缓冲[I];
    fprintf (存档,"缓冲区[%d]=%d \n",i,缓冲区[i]);
    //fprintf (Archivo,"Corriente[%d]=%d \n",i,Corriente[i]);

    }

    fclose (Archivo);

    VDC = V*(1/VDC 100.0);

    VDC =(VDC*(0.2.3376万598399</xmt-block>59.8399万))+ 2.5 ;

    S = 0;

    同时(S == 0){
    S = gPIO_getData (myGpio,gPIO_NUMBER_12);
    }

    printf ("%f Voltios DC \n",VDC);

    GPIO切换(myGpio,GPIO编号_3);

    DELAY _US (100万);
    S = 0;

    同时(S == 0){
    S = gPIO_getData (myGpio,gPIO_NUMBER_12);

    }

    DELAY _US (100万);
    GPIO切换(myGpio,GPIO编号_3);
    PWM_setDeadBandOutputMode (myPwm1,PWM_DeadBandOutputMode_EPWMxA_Rising _EPWMxB_Falling);

    S = 0;

    CPU_enableGlobalInts (myCpu);
    CPU_enableDebugInt(myCpu);

    }

    }

    如果您看到,则代码的这一部分将禁用全局中断,我需要更改GPIO12的状态三次以再次启用中断。

    问题是,有时取决于我对程序所做的更改。例如,注释打印电压线(这对程序功能没有任何显著影响)。
    它会启动错误的行为,例如即使按下GPIO12按钮,中断也不会停止。 或者另一件事是,程序有效地禁用中断,但随后不启用中断,并且程序已失效(因为进程的生命周期是中断例程)。 或者另一件事也发生了,.txt文件第一次只保存数据,第二次只保存并清空文件。
    如果您需要,我可以向您发送完整的源代码,以便您可以对其进行测试,但此时,左侧片段只是外围配置,PWM,ADC,GPIO,PIE, 等等

    我希望你能帮我做这个Ozino。 提前感谢。
    此致。 Eliomar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eliomar,

    通过右键单击项目并选择属性,可以查看优化设置。 在弹出窗口中,导航至Build (构建)-> C2000 Compiler (C2000编译器)-> Optimization (优化)。 这是优化信息所在的位置。

    此致,
    Ozino
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊,还可以。它在级别“0”。这是否意味着编译器不会优化代码? 或者我应该将代码优化设置为“关闭”?
    问题的原因可能是优化之外的其他问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是优化级别,我将设置更改为"关闭",我的问题仍然存在。 一个问题,当我逐步运行代码时。
    步入意味着我进入指令的内部否?
    步过意味着它通过了指令? 不是指示的操作,就是指示的内侧没有显示?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Eliomar:
    尝试运行:interrupt void epwm1_timer_isr(void) 在RAM中,它可以解决您的问题
    此致
    哈米德
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eliomar,

    进入,将进入说明并等待下一个操作。 步过函数不会进入指令,而是将 其在 一个完整的步骤中执行。

    您的项目是否包含任何库(.lib)? 如果是这样,您可能看到的某些内容可能是由于库中的函数在执行过程中被调用。  如果您正在 逐步执行C代码,您 将体验  到您所描述的内容。  但是 ,如果您逐步完成拆卸,您仍应能够逐步完成每个说明。

    此致,

    Ozino

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊,好的。但是在源代码的关键部分(disable和enable inerrupts指令)中,它有时会禁用或启用中断。我的意思是,CCS并非总是禁用或启用中断。
    我的程序包括tms320f2.8027万的stdio,数学和外设库。
    因此,如果我逐个步进指令,那么CCS有时会在自动调整上播放代码是可以的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eliomar,

    我相信CCS没有什么问题。 您需要确保检查中断的优先级。 您还需要确保您有足够的带宽来处理您尝试调用的其他中断。 您必须调整中断的优先级以适应所需的功能。

    此外,当您步入单行代码时,CCS将获取与C代码等效的低级程序集,并执行该程序集,直到下一行C代码。 请注意,C代码不必是函数调用,它适用于C代码的任何行。 这也意味着您也可以单步执行等效汇编代码。

    如果还跳转到代码中的特定行。 CCS不会始终在两行之间执行整个代码。

    希望这能有所帮助,
    Ozino