测试程序运行时间的插桩函数和代码句

文章展示了如何在C++代码中使用`get_time`获取执行时间,并通过bash脚本对代码进行多次运行,计算平均执行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

double get_time()
{
    struct timespec t;
    clock_gettime(CLOCK_MONOTONIC, &t);
    return (double)t.tv_sec + (double)t.tv_nsec * 1e-9;
}

int main()
{
    double start_time = get_time();
    
    核心代码内容
    
    double end_time = get_time();
    double mix_time = end_time - start_time;
    std::ofstream outfile("time.txt", std::ios::app);
    if(outfile.is_open())
    {
        outfile << mix_time << std::endl;
        outfile.close();
    }
    else{
        std::cout << "无法打开time.txt文件" << std::endl;
    }
    return 0;
}

将上述代码插入到核心代码部分运行的前后,求得的是程序核心运行时间。

下述是脚本内容:

#!/bin/bash

# 输出文件名
output_file="output.txt"
time_file="time.txt"

# 清空或创建输出文件
> "$output_file"

# 清空time.txt文件
> "$time_file"

# 运行次数
run_times=100

# 循环运行cpp文件并记录输出
total_sum=0
for ((i=1; i<=run_times; i++))
do
    result=$(./arclength-adapt)
    # 将输出写入到文件
    echo "$result" >> "$output_file"
done

# 读取time.txt文件中的时间,计算平均值
nums="$(sed -n '1,10p' time.txt)"
average="$(echo "$nums" | awk '{ sum += $1; n++ } END { if (n > 0) print sum / n; }')"
echo "Average time is: $average"
<think>嗯,用户问的是如何在Keil中调试查看STM32程序的运行时间。这个问题我之前接触过,但需要仔细回忆步骤,确保正确。首先,应该想到Keil的调试工具有相关功能,可能涉及到性能分析或者计时器。 用户可能是在优化代码性能,或者需要测量某段代码的执行时间,比如中断处理或算法效率。他们可能对Keil的界面不太熟悉,需要详细的操作步骤。另外,可能需要使用内置的计数器或者时间寄存器。 接下来,要考虑不同的方法。第一种是使用逻辑分析仪,但需要配置跟踪时钟设置周期计数器。第二种是使用System Tick Timer,SysTick,比较前后时间差。第三种是使用DWT(Data Watchpoint and Trace)的CYCCNT寄存器,这个能提供高精度的周期计数。 需要检查每种方法的步骤是否正确。例如,在逻辑分析仪中,是否正确添加SYS_CLK信号,并设置正确的时钟频率。对于SysTick,是否在代码中初始化并读取数值。DWT方法需要启用CYCCNT,这在CoreSight中可能需要配置。 另外,用户可能需要知道如何访问这些寄存器,是否需要特定的代码入。比如,在DWT中,直接读取寄存器地址。同时,要注意不同STM32型号的差异,比如时钟频率是否影响计算时间。 还要考虑单位转换,比如将周期数转换为微秒或毫秒,需要知道系统主频。例如,72MHz的系统,每个周期是1/72,000,000秒。用户可能需要示例代码来计算时间差。 可能遇到的问题包括跟踪时钟设置错误,寄存器未启用,或者代码的位置不正确。需要提醒用户检查这些点,比如确认Trace Enable是否打开,是否在调试前正确配置。 最后,总结各个方法的优缺点。逻辑分析仪适合可视化,但需要配置;SysTick简单但有时间限制;DWT精度高但需要启用。用户可以根据需求选择合适的方法。</think>在Keil MDK中查看STM32程序运行时间有以下几种常用方法,我为您整理出分步指南: 一、使用逻辑分析仪(Logic Analyzer) 1. 进入调试模式(点击虫子图标) 2. 打开【View】→【Analysis Windows】→【Trace】 3. 在Trace窗口右键选择【Setup...】 4. 设置Core Clock为实际时钟频率(如72MHz) 5. 在代码起始结束处设置断点 6. 运行到起始断点时: - 右键周期计数器(Cycle Counter)→【Reset】 7. 运行到结束断点时: - 读取周期计数器数值 - 计算时间:时间(秒) = 周期数 / 系统主频 二、使用System Tick Timer 1. 在代码中初始化SysTick: ```c SysTick->LOAD = 0xFFFFFF; // 设置24位最大值 SysTick->VAL = 0; // 清空当前值 SysTick->CTRL = 0x5; // 启用计数器(不启用中断) ``` 2. 测量代码段执行时间: ```c uint32_t start = SysTick->VAL; // 被测试代码 uint32_t end = SysTick->VAL; uint32_t cycles = (start > end) ? (start - end) : (0xFFFFFF - end + start); float time_ms = (float)cycles / (SystemCoreClock / 1000.0f); ``` 三、使用DWT CYCCNT寄存器(推荐方法) 1. 启用DWT单元: ```c CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; // 重置计数器 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // 启用计数器 ``` 2. 测量代码段: ```c uint32_t start = DWT->CYCCNT; // 被测试代码 uint32_t end = DWT->CYCCNT; uint32_t cycles = end - start; float time_us = (float)cycles / (SystemCoreClock / 1000000.0f); ``` 注意事项: 1. 所有方法都需要在调试前: - 开启【Trace Enable】(Project→Options→Debug→Settings→Trace) - 选择正确的Core Clock 2. DWT方法需要芯片支持(Cortex-M3/M4/M7内核) 3. 测量误差主要来自: - 断点响应时间(约3-5个周期) - 中断干扰(建议关闭全局中断) 4. 对于短时间测量(<1ms),建议多次循环测量取平均值 实际调试建议: 1. 使用DWT方法可获得最高精度(单周期分辨率) 2. 结合【View】→【Call Stack Window】查看函数调用耗时 3. 使用【View】→【Performance Analyzer】进行函数级性能分析 示例调试流程: 1. 在main()开始处设置断点 2. 在目标代码段后设置断点 3. 运行到第一个断点时: - 打开【Command】窗口输入`SETCH TRACE32 ON` - 输入`T32.CLK=72000000`(根据实际时钟设置) 4. 运行到第二个断点时: - 输入`?T32.CLK*T32.CYCLE`显示运行时间 通过上述方法,您可以精确测量从单指令周期(约13.8ns@72MHz)到完整程序执行时间的各种需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值