用SWD调试接口测量代码运行时间 ( SWO )

用SWD调试接口测量代码运行时间

关于时间测量的种种问题

在嵌入式中,咱们常常须要测量某段代码的执行时间或测量事件触发的时间,常规的思路是:git

1:在测量起始点,反转电平
2:在测量结束点,再次反转电平github

而后经过示波器或者逻辑分析仪来测量反转间隔,也就是代码时间性能

这种方法,在测量两个或多个时间信号同步的时候,很是有用,实际上,这也是惟一的方法。测试

可是若是在测量中,其它代码也会控制这个管脚电平或者周期性动做,这时便须要在<动做1>以前
增长前导码,从而便于在繁杂的波形中,一眼识别出须要特定的波形大数据

同时,若是测量的时间值很是小,那么用示波器即使能够识别,但不容易捕获优化

SWD解决方案

在ARM Cortex-M 芯片中,用SWD调试接口取代了传统的JTAG调试接口,从而占用MCU更少的管脚,同时提升了调试性能。ui

SWD由四根线组成,SWO,SWDIO,SWCLK,GND;SWDIO和SWCLK组成了基本的串行调试接口,SWO则提供一个信息输出通道,
能够输出不少信息,好比指令的执行时间或者ISR触发事件,因此咱们能够经过SWD接口配合IDE来获取代码执行时间,从而在某种程度上取代示波器spa

IAR中使用SWD测量时间

注:下文假设读者已经熟悉IAR的使用方法,若是您不熟悉,请参考网上对应的入门教程debug

1:配置SWD时钟

这里,咱们须要在调试器选项中调试

1:选择SWD调试接口

2:将时钟频率设置成MCU的时钟频率,同时将SWO时钟选择成自动识别模式

配置完成后,进入debug模式,选择J-Link—>SWD Configuration配置页,重点关注SWO时钟的实际值,以下所示

若是显示不对,则说明SWO配置不对

2:设置时标变量

在示波器方案中,咱们须要用某个管脚来测量实际,SWD也相似,只不过将物理管脚替换成某个变量而已。

这里,咱们设置TimeLine变量做为时标变量

volatile uint32_t TimeLine = 0;

 

volatile是为了防止TimeLine被编译器优化,从而形成测量值不许确。

3:设置Data Log

Data Log是IAR的一种调试断点,相似数据断点,IAR会实时记录对应的变化,所以被称为Log。

在调试模式下,在TimeLine变量上右击,选择”Set Data Log Breakpoint for ‘TimeLine’”选项

 

设置后,不会像常规的断点那样用红色来标注,在IAR底下,咱们须要进入Jlink的BreakPoint Usage来查看,以下图所示

这里,咱们能够清楚的看到TimeLine已经被设置成读写断点

4:使能Data Log和Data Log Summary

在Jlink菜单下,进入Data LogData Log Summary窗口,而后右键选择Enable

至此,咱们设置完毕,能够将TimeLine放置在测量的起始,结束位置

5:开始时间测量

咱们的测试代码以下

while(1)
{
    TimeLine = 0;
    index++;
    TimeLine = 1;
    index++;
}

按上述完成配置后,点击Run全速运行几秒钟,而后暂停,能够在Data LogData Log Summary窗口看到对应的信息

 

咦,为何全是Overflow???哪里错了

还记得咱们刚开始设置SWO的时钟速度吗?当时间测量点的间隔太小,且发送速率过快时,会超出SWO的传输能力,从而形成overflow问题

为了验证确实是这个缘由,咱们将在代码中插入一些软件延时,以下所示

 

void delay(volatile uint32_t tick)
{    
    while(tick--);
}

....

while(1)
{
    TimeLine = 0;
    index++;
    delay(0xFFFF);
    TimeLine = 1;
    index++;
    delay(0xFFFF);
}

 

 重编译,进入调试模式,全是运行,暂停,ok,此次能够看到一切正常了

/******************** Data log 窗口 ************************/

Time    Approx  PC  Description Type    Value   Address
17040.43 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?
25232.68 us X   0x8000a7c   TimeLine    W   1   @ 0x20000390+?
33424.99 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?
41617.24 us X   0x8000a7c   TimeLine    W   1   @ 0x20000390+?
49809.54 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?
58001.79 us X   0x8000a7c   TimeLine    W   1   @ 0x20000390+?
66194.10 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?
74386.35 us X   0x8000a7c   TimeLine    W   1   @ 0x20000390+?
82578.65 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?
90770.90 us X   0x8000a7c   TimeLine    W   1   @ 0x20000390+?
98963.21 us X   0x8000a6c   TimeLine    W   0   @ 0x20000390+?

/********************* Data Log Summary 窗口 *****************/
TimeLine
  Total Accesses:   335
  Read Accesses:    0
  Write Accesses:   335

Approximative time count: 335

Overflow count: 0

 

 另外,咱们也能够打开J-link菜单下的TimeLine选项(不要和咱们的TimeLine变量搞混了)

效果图以下所示

6:注意事项

当SWO数据量过大的时候,容易出现过冲的状况,解决方案是在调试模式下,单步进行,从而避免发送大数据

全文完,但愿本文对您有帮助^_^

相关文章
相关标签/搜索