zoukankan      html  css  js  c++  java
  • 用SWD调试接口测量代码运行时间 ( SWO )

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

    关于时间测量的种种问题

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

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

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

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

    但是如果在测量中,其它代码也会控制这个管脚电平或者周期性动作,这时便需要在<动作1>之前
    增加前导码,从而便于在繁杂的波形中,一眼识别出需要特定的波形

    同时,如果测量的时间值非常小,那么用示波器即便可以识别,但不容易捕获

    SWD解决方案

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

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

    IAR中使用SWD测量时间

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

    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数据量过大的时候,容易出现过冲的情况,解决方案是在调试模式下,单步进行,从而避免发送大数据

    全文完,希望本文对您有帮助^_^

  • 相关阅读:
    Django 登录页面重定向
    python 调试命令
    错误
    错误
    图算法之图的创建
    Git 常用命令详解(三)
    Git 常用命令详解(二)
    如何提问
    项目常用jquery/easyui函数小结
    我是怎么发现并解决项目页面渲染效率问题的(IE调试工具探查器的使用)
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4763227.html
Copyright © 2011-2022 走看看