当前位置: 首页 > news >正文

【功能开发】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 微秒,则计数值的差值就是实际的时间(微秒)。

通过以上两种方法,可以准确地测量中断内所有程序运行完总共占用的时间。

相关文章:

  • 多模态大语言模型arxiv论文略读(二)
  • 基于Edge-TTS的OpenAI兼容文本转语音API实战指南
  • QwQ-32B-GGUF模型部署
  • 快速入手-基于DRF的过滤、分页、查询配置(十五)
  • 2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)
  • 41、当你在 index.html 中引用了一个公共文件(比如 common.js),修改这个文件后,用户访问页面时仍然看到旧内容,因为浏览器缓存了旧版本
  • 人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手
  • 搭建开源笔记平台:outline
  • 如何在 Unity3D 导入 Spine 动画
  • 【NLP】15. NLP推理方法详解 --- 动态规划:序列标注,语法解析,共同指代
  • JavaScript 库:全面解析与推荐
  • 13-SpringBoot3入门-整合MyBatis-Plus
  • 【Docker镜像】Python项目之使用Dockerfile构建镜像(一)
  • 如何用Postman实现自动化测试?
  • 【Jira 查询与 JQL 使用详解】
  • 【数据结构】导航
  • Ubuntu 24.04.2 LTS 系统安装python,创建虚拟环境
  • 解决 CMS Old GC 频繁触发线上问题技术方案
  • 本地部署vanna ai+通过http请求调用vanna
  • 虚幻5入门
  • 上海启动万兆光网试点建设,助力“模速空间”跑出发展加速度
  • 深圳下调公积金利率,209万纯公积金贷款总利息减少9.94万
  • 中俄领导人将讨论从俄罗斯经蒙古至中国天然气管道项目?外交部回应
  • 魔都眼|上海多家商场打开绿色通道,助力外贸出口商品转内销
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热
  • 青岛鞋企双星名人集团家族内斗:创始人发公开信指控子孙夺权