【功能开发】DSP F2837x 检测中断所有函数运行一次的时间
要查看 DSP F28377 的 CPU 在 50 微秒一次的中断内所有程序运行完总共占用了中断多长时间,可以采用硬件定时器测量和软件计时两种常见方法。
方法一:使用硬件定时器测量
原理
利用 DSP 内部的高精度硬件定时器,在中断开始时记录定时器的值,在中断结束时再次记录定时器的值,通过两次记录值的差值来计算中断程序的执行时间。
步骤
1.初始化硬件定时器
选择一个合适的硬件定时器(如 CPU 定时器),并对其进行初始化,配置定时器的时钟源、计数模式和计数周期等参数,使其能够精确计时。
#include "F28x_Project.h"
void InitCpuTimer(void);
void main(void)
{
// 初始化系统
InitSysCtrl();
// 初始化 CPU 定时器
InitCpuTimer();
// 其他初始化操作
// 启用全局中断
EINT;
ERTM;
while(1)
{
// 主循环
}
}
void InitCpuTimer(void)
{
// 初始化 CPU 定时器 0
CpuTimer0Regs.TCR.all = 0x00000000;
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
CpuTimer0Regs.TCR.bit.TSS = 1; // 停止定时器
CpuTimer0Regs.TCR.bit.TRB = 1; // 重载定时器
}
2.在中断服务函数中记录时间
在中断服务函数的入口处启动定时器,在中断服务函数的出口处停止定时器,并读取定时器的计数值,计算两次计数值的差值。
__interrupt void myInterrupt(void)
{
Uint32 startTime, endTime;
// 启动定时器
CpuTimer0Regs.TCR.bit.TSS = 0;
// 记录开始时间
startTime = CpuTimer0Regs.TIM.all;
// 中断服务程序代码
// ...
// 记录结束时间
endTime = CpuTimer0Regs.TIM.all;
// 停止定时器
CpuTimer0Regs.TCR.bit.TSS = 1;
// 计算中断执行时间
Uint32 executionTime = startTime - endTime;
// 处理执行时间,例如打印输出
// ...
// 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
3.换算时间
根据定时器的时钟频率,将计数值的差值换算成实际的时间(微秒)。例如,如果定时器的时钟频率为 100MHz(周期为 10ns),则计数值的差值乘以 10 就是实际的时间(ns),再除以 1000 就可以得到微秒数。
方法二:软件计时
原理
利用一个全局变量在中断开始时记录系统时钟的计数值,在中断结束时再次记录系统时钟的计数值,通过两次计数值的差值来计算中断程序的执行时间。
步骤
1.定义全局变量
在全局作用域定义一个用于记录系统时钟计数值的变量。
#include "F28x_Project.h"
volatile Uint32 systemClockCount;
void main(void)
{
// 初始化系统
InitSysCtrl();
// 其他初始化操作
// 启用全局中断
EINT;
ERTM;
while(1)
{
// 主循环
}
}
2.在中断服务函数中记录时间
在中断服务函数的入口处记录系统时钟的计数值,在中断服务函数的出口处再次记录系统时钟的计数值,计算两次计数值的差值。
__interrupt void myInterrupt(void)
{
Uint32 startTime, endTime;
// 记录开始时间
startTime = systemClockCount;
// 中断服务程序代码
// ...
// 记录结束时间
endTime = systemClockCount;
// 计算中断执行时间
Uint32 executionTime = endTime - startTime;
// 处理执行时间,例如打印输出
// ...
// 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
3.更新系统时钟计数值
在一个定时中断(如 CPU 定时器中断)中更新系统时钟计数值。
__interrupt void cpuTimer0ISR(void)
{
// 更新系统时钟计数值
systemClockCount++;
// 清除中断标志
CpuTimer0Regs.TCR.bit.TIF = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
4.换算时间
根据定时中断的周期,将计数值的差值换算成实际的时间(微秒)。例如,如果定时中断的周期为 1 微秒,则计数值的差值就是实际的时间(微秒)。
通过以上两种方法,可以准确地测量中断内所有程序运行完总共占用的时间。