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.

[参考译文] MSP430F2619:代码覆盖问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1367462/msp430f2619-code-coverage-question

器件型号:MSP430F2619

工具与软件:

当我执行我可以看到的代码覆盖率时、我收集时运行调试器、直到程序完成、然后分析并打开.csv、我可以看到返回频率= 1。 如果我再次运行分析、请参阅返回频率=  2.

但如果我收集运行调试器、模拟并再次运行调试器分析返回频率= 3。 如果我重新运行分析返回= 5。  

需要注意的是、我在这些测试之间删除.prf pdat 和.csv 文件。  

为什么会出现这种行为? 是否有办法获得.csv 文件而不运行/递增在另一次运行分析时收集到的内容? 我的期望是、如果您运行调试器2次、您应该返回= 2 (执行了程序2次)、并且分析将生成.csv。

编辑:

我还尝试了以下方法:

运行调试器直到程序完成、然后我转至工具配置文件 代码生成代码覆盖率。 查看.csv、其显示返回频率= 1。 我再次运行调试器、然后进行工具生成代码覆盖率并查看.csv、我看到频率=3。 为什么会这样呢? 不知道我究竟缺少什么。 任何帮助都会很棒。

编辑2:

我想我找到了问题的一部分。 如果您第二次运行调试器并删除.prf 和.csv、然后运行分析、则会显示返回2而不是3、这在我看来是正确的。  

然后我试着做一个测试、并证明即使你改变代码、它也会累积变化。

我用名为 printf ("pass_1")的行运行了 debug analyze; 它在.csv 中显示频率为1、然后将行更改为 printf ("pass_2");并再次运行(删除.prf 和.csv)、显示 pass2 frequency = 2、而在.csv 中找不到 pass1。 我不确定它为什么会这样运行。 我的预期是 pass_1和 pass_2将会在第二次运行中同时出现并具有一定的频率。  

#include <stdio.h>
#include <msp430.h>

volatile unsigned int i;
volatile unsigned long j = 0;
extern void _TI_stop_pprof_collection(void);
extern void _TI_start_pprof_collection(void);

int main(void)
{

    //start code coverage data collection
      //TI_COVDIR = "C:\Users\eVelez\PreVeil-eric.velez@mnemonics-inc.com\Documents\code_composer_work_spaces\v12\hfx2";
      //TI_COVDATA = "yeehaw";

//    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
//
//    puts("Does this string get printed?");
//    printf("hello world");
//    return 0;

  printf("yeehaw");
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P5DIR |= 0x10;                            // P5.4= output direction
  P5SEL |= 0x10;                            // P5.4= MCLK option select
  P1DIR |= 0x01;                            // P1.0 = output direction
  //P1DIR |= 0x02;                            // P1.1 = output direction

  BCSCTL1 &= ~XT2OFF;                       // Activate XT2 high freq xtal
  BCSCTL3 |= XT2S_2;                        // 3   16MHz crystal or resonator
  do
  {
    IFG1 &= ~OFIFG;                         // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);             // Time for flag to set
  }
  while (IFG1 & OFIFG);                     // OSCFault flag still set?

  BCSCTL2 |= SELM_2;                        // MCLK = XT2 HF XTAL (safe)

  P1OUT |= 0x01;                          // P1.1 = 1

  //initalize variable
  int loop_count = 0;

  for (;;)                                  // Infinite loop
  {
    for(j = 0xFFFFF; j > 0; j--);

    //P1OUT |= 0x02;                          // P1.1 = 1
    P1OUT ^= 0x01;                         // P1.1 = 0
    //P1OUT &= ~0x02;                         // P1.1 = 0

    //break out of for loop after 5 times
    if (loop_count == 5)
    {
        break;
    }

    loop_count = loop_count + 1;

  }

  //show branching if else if a =1 and a=0, switch statement//state machine
  //initalize a and b
  int a = 10;
  int b = 5;

  //    more complicated if statement to test
  if (a == 10 && b == 5) {
      printf("a = 10 and b =5\n");
  } else if (a == 5 && b == 10) {
      printf("a = 5 and b =10\n");
  }

//  switch
  int switch_var = 1;

  switch (switch_var) {
      case 1:
          printf("switch_var = 1");
          break;
      case 2:
          printf("switch_var = 2");
          break;
      case 3:
          printf("switch_var = 3");
          break;
      case 4:
          printf("switch_var = 4");
          break;
     case 5:
         printf("switch_var = 4");
         break;
    default:
          printf("not initialized.\n");
          break;
  }

  //stop code coverage data collection
  _TI_stop_pprof_collection();

    return 0;
}

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

    您好!

    对我来说、这个问题看起来像是编译器问题。 将该线程移动到编译器团队。  

    此致、

    现金豪

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

    很抱歉耽误你的时间。  我希望明天就能实现它。

    谢谢。此致、

    -乔治

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

    执行代码覆盖率时会创建三种类型的文件。   

    1. PDAT
    2. PRF
    3. CSV

    执行检测的二进制文件时创建 PDAT 文件。  PRF 文件通过以下方式处理 PDAT 文件来创建: PD 430 。  CSV 文件是通过使用 -- use_profile_info (及其它细节被省略)。  在此过程中的每一步、如果存在现有文件、则会附加新数据。  您似乎总是希望避免此附加步骤。  这意味着在每轮分析后、您必须始终删除所有这些文件。  我意识到这是不方便的。

    相关详细信息 、请在 MSP430编译器手册 中搜索标题为" 使用反馈制导优化和 使用分析信息来分析代码覆盖率"的子章节。

    谢谢。此致、

    -乔治

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

    在以下情况下附加数据的方式:

    然后我试着做一个测试、并证明即使你改变代码、它也会累积变化。

    我用名为 printf ("pass_1")的行运行了 debug analyze; 它在.csv 中显示频率为1、然后将行更改为 printf ("pass_2");并再次运行(删除.prf 和.csv)、显示 pass2 frequency = 2、而在.csv 中找不到 pass1。 我不确定它为什么会这样运行。 我的预期是 pass_1和 pass_2将会在第二次运行中同时出现并具有一定的频率。  

    是否显示 PASS_2为频率= 2、而不是 pass_1 = 1和 pass_2 = 1? 它到底是怎样递增频率的? 这就是我想了解的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    证明即使您更改代码,它也会累积更改

    遗憾的是、这不受支持。  假设在多次执行用于收集数据的程序的情况下、应用程序的源代码不会改变。  如果您更改了源代码、则必须丢弃已收集的所有数据。

    谢谢。此致、

    -乔治