DSP

CCS7.2软/硬件断点设置,精确计算代码运行时间及定时器定时时间验证(适用于C28x芯片)

2019-07-13 16:03发布


一、 C28x 芯片软件断点(software breakpoint)、硬件断点(hardware breakpoint)的设置方法
软件断点(software breakpoint)的设置
方法一:
For the C28x devices, the software breakpoint instruction is: asm( “ESTOP0”)。
在需要设置断点的地方,加上一条汇编指令asm (” ESTOP0”);即可。理论上可以设置无数个软件断点。然后,运行程序到这条指令就会自动停下来。

这里写图片描述
方法二:
使用RAM_lnk.cmd文件编译(如:28035-RAM-lnk.cmd)。使程序在RAM中运行。
在代码左边行号上双击就自动生成了一个软件断点。然后将鼠标放在小圆圈上,如下图所示,出现S/W BP 代表是软件断点。
这里写图片描述
硬件断点(hardware breakpoint)的设置
方法一:
使用FLASH.cmd文件编译(如:F28035.cmd)。程序在FLASH中运行。
在代码左边行号上双击就自动生成了一个硬件断点。然后将鼠标放在小圆圈上,如下图所示,出现H/W BP 代表是硬件断点。
这里写图片描述
方法二:
打开Breakpoints窗口,点击断点下拉框选择Hardware Breakpoint.
这里写图片描述
二、 精确计算代码运行时间
CCS中可以对程序运行时间进行测量,有两种方法测试代码的运行时间。
方法一:使用clock功能,这种方法操作比较简单,比较实用。
使用方法是,先打开clock功能,步骤是Run -> clock -> Enable。
右下角有个时钟的图标出现。 这里写图片描述 双击它可以清零。
在要测试的代码上打两个断点,分别运行到两个断点处,就可以看到代码运行周期了。
使用公式 time = 1/CLK可以算得程序运行时间。
例如时钟周期为300MHz,测得数据为1000,则代码运行时间time = 1000 * (1/300,000,000) = 3.3 μs。
方法二:使用Count Event功能。
说明:这种方法分为硬件断点和软件断点两种情况来分析。对于C28X in CCS官方资料中有这么一段话。
Note: If you are setting software breakpoints (ie code is in RAM) then you can set any number of breakpoints. If they are hardware breakpoints or code is in Flash, then you will only be able to set 1 breakpoint if Count Event is enabled. So you would need to run to the first breakpoint, then disable the first breakpoint and enable the second, and run to the second breakpoint.
如果设置是软件断点可以使用任意数量的断点。如果使用硬件断点,当Count Event被使能时只能使用1个断点。所以需要先运行到第一个断点,再关掉第一个断点,然后使能第2个断点,再运行到第2个断点。完整操作步骤后面会介绍。
小贴士:
关于C28x的硬件断点。C28x只能设置2个硬件中断,设置第三个时会出现错误
Error enabling this function:This task cannot be accomplished with the existing AET resources.
这里写图片描述
前提条件是做如下设置:菜单Run->Debug Configurations…
图示Halt at program termination及Enable CIO function use不勾选时,可以有2个硬件断点使用。
这里写图片描述
情况一:软件断点实现Count Event功能(C28x不建议使用这种方法,因为断点多于2个以上时,在第3个断点不能自动停止运行。)
步骤:
1、现将程序编译并Debug下载到开发板。打开断点窗口:View->Breakpoints
然后在右上角(默认设置)窗口中会多出一个断点窗口,点击断点下拉框选择Count Event。如下:
这里写图片描述
弹出提示框后选择Clock Cycles,然后点击OK
这里写图片描述
(注意:设置Count Event之前要将,clock功能关闭,否则会弹出以下窗口,关闭的方法:Run -> clock -> Disable)
这里写图片描述
2、经过第1步后在断点窗口中会多出一个Count Event断点,在Count Event上鼠标点击右键选择Breakpoint Properties对此断点进行配置。
将Reset Count on Run改为true,点击OK保存。即每次按RUN时计数器自动清零。
这里写图片描述
3、将要测试的代码加上2断点(在设置断点的地方双击代码左边行号),如图,假如我要测试程序从1到2需要运行多少时间,则将1所在的行设置断点同时把2设置断点,此时可以看到断点窗口多了2个断点。(注:每次按RUN时,计数器Count Event都会自动从0开始计数。遇到一个断点就自动停下来。)
这里写图片描述
4、运行时间计算
由前面知道从代码1到代码2用了364个机器中期,时钟频率为60Mhz,那这段代码运行时间就是364 * (1/(60*1000000)=0.00000607,约为6.07us
情况二:硬件件断点实现Count Event功能
如果是硬件断点时,当使能count event时,只有一个硬件断点可以被使用。做法是:双击代码左边行号,设置第一个断点。按RUN先运行到第一个断点,再关掉第1个断点(断点上双击),再设置第2个断点(在设置断点的地方双击代码左边行号)。然后运行到第2个断点。
三、如何验证定时器中断时间是否准确
1、在中断程序中,翻转一个GPIO口的输出电平,用示波器观察波形。
2、还有一种方法就是在中断程序里第一条指令打个断点,使能ccs的clock功能,看每进一次中断用了多少clock。
实测数据:
定时器延时500ms,测得周期数为30004182 计算30004182*(1/(60*1000000))= 0.50006975s
定时器延时100ms,测得周期数为6004519 计算6004519*(1/(60*1000000))= 0.10007532s