用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 = ;
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 Log
和Data Log Summary
窗口,然后右键选择Enable
至此,我们设置完毕,可以将TimeLine放置在测量的起始,结束位置
5:开始时间测量
我们的测试代码如下
while()
{
TimeLine = ;
index++;
TimeLine = ;
index++;
}
按上述完成配置后,点击Run
全速运行几秒钟,然后暂停,可以在Data Log
和Data Log Summary
窗口看到对应的信息
咦,为什么全是Overflow???哪里错了
还记得我们刚开始设置SWO的时钟速度吗?当时间测量点的间隔过小,且发送速率过快时,会超出SWO的传输能力,从而造成overflow问题
为了验证确实是这个原因,我们将在代码中插入一些软件延时,如下所示
void delay(volatile uint32_t tick)
{
while(tick--);
} .... while()
{
TimeLine = ;
index++;
delay(0xFFFF);
TimeLine = ;
index++;
delay(0xFFFF);
}
重编译,进入调试模式,全是运行,暂停,ok,这次可以看到一切正常了
/******************** Data log 窗口 ************************/ Time Approx PC Description Type Value Address
17040.43 us X 0x8000a6c TimeLine W @ 0x20000390+?
25232.68 us X 0x8000a7c TimeLine W @ 0x20000390+?
33424.99 us X 0x8000a6c TimeLine W @ 0x20000390+?
41617.24 us X 0x8000a7c TimeLine W @ 0x20000390+?
49809.54 us X 0x8000a6c TimeLine W @ 0x20000390+?
58001.79 us X 0x8000a7c TimeLine W @ 0x20000390+?
66194.10 us X 0x8000a6c TimeLine W @ 0x20000390+?
74386.35 us X 0x8000a7c TimeLine W @ 0x20000390+?
82578.65 us X 0x8000a6c TimeLine W @ 0x20000390+?
90770.90 us X 0x8000a7c TimeLine W @ 0x20000390+?
98963.21 us X 0x8000a6c TimeLine W @ 0x20000390+? /********************* Data Log Summary 窗口 *****************/
TimeLine
Total Accesses:
Read Accesses:
Write Accesses: Approximative time count: Overflow count:
另外,我们也可以打开J-link菜单下的TimeLine选项(不要和我们的TimeLine变量搞混了)
效果图如下所示
6:注意事项
当SWO数据量过大的时候,容易出现过冲的情况,解决方案是在调试模式下,单步进行,从而避免发送大数据
全文完,希望本文对您有帮助^_^
用SWD调试接口测量代码运行时间 ( SWO )的更多相关文章
- python接口自动化:调试接口的代码(无token情况下)
实现代码如下: #接口调试 import requests,time class api_demo1: def __init__(self,RequestWay,url,data): self.s=r ...
- python测量代码运行时间方法
Python 社区有句俗语: “python自己带着电池” ,别自己写计时框架. Python3.2具备一个叫做 timeit 的完美计时工具可以测量python代码的运行时间. timeit 模块: ...
- C# 精准获取代码运行时间
纯粹转载,转载请注明参考链接及作者! 参考链接:http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html,作者:博客园 大佬辉 ...
- 浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
JTAG协议 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协 ...
- C#如何测试代码运行时间
1.System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // 需要测试 ...
- c语言调试接口
http://blog.chinaunix.net/uid-10106787-id-2985587.html 在C语言程序设计中,常会出现各种各样的bug:段错误.参数异常等等.我们需要尽快定位错误, ...
- C# JAVA 记录代码运行时间
C# System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // cod ...
- C#打印代码运行时间
使用以下方法可以准确的记录代码运行的耗时. System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); / ...
- linux上使用J-Link调试S3C2440裸机代码
linux上使用J-Link调试S3C2440裸机代码 工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb ...
随机推荐
- 洛谷 P1056 排座椅 桶排序
桶排序大法好! 每次一看到这种范围小的题,本萌新就想用桶排. 因为题目中的m,n都小于1000,我们就可以定义两个1000的数组,表示每一行或每一列可以隔开几对讲话的童鞋. 然后再定义两个1000的数 ...
- 关于webpack下热更新?&自动刷新?的小记(非vue-cli)
写本随笔时:webpack4.6.0 为何标题用?号,因为老衲也不知是否用词正确,大概是这样的说法: webpack4.0引入生产模式和开发模式,在开发时使用 webpack 打包后不压缩,所以只需要 ...
- [转]python ctypes 探究 ---- python 与 c 的交互
近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...
- linux系统时间不同步解决办法(同步本地时间)
改变/etc/目录下的localtime文件,既可以改变当前的时区 1.方法是到/usr/share/zoneinfo目录下找到你要相对应的时区文件,例如上海在/usr/share/zoneinfo/ ...
- 三、vue脚手架工具vue-cli的使用
1.vue-cli构建 vue-cli工具构建:https://blog.csdn.net/u013182762/article/details/53021374 npm的镜像替换成淘宝 2.项目运行 ...
- jenkins之参数化构建
事件背景: 今天一早接到一个需求,说要jenkins持续集成,输入自定义URL,然后完成回归测试,当时有点蒙,不知道如何下手,听群里的大神思路后豁然开朗,就记录了下 一.先安装插件 插件: [Buil ...
- stylus项目知识点
1.在项目中,引入.sty文件的时候,用来下面方式 @import "~common/stylus/variable.styl" ~ 是stylus的写法,参考https://gi ...
- Coursera台大机器学习技法课程笔记11-Gradient Boosted Decision Tree
将Adaboost和decision tree相结合,需要注意的地主是,训练时adaboost需要改变资料的权重,如何将有权重的资 料和decision tree相结合呢?方法很类似于前面讲过的bag ...
- 2017-2018-2 20155225《网络对抗技术》实验一 PC平台逆向破解
2017-2018-2 20155225<网络对抗技术>实验一 PC平台逆向破解 1.直接修改程序机器指令,改变程序执行流程 理清思路: 我们的目标文件是一个linux可执行文件,格式为E ...
- 基于用Path.Combine的优化
Path.Combine: 什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候! 所以下面的代码可以完美的工作: public static void Main() { strin ...