You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux嵌入式CPP环境下,求独立于系统时钟的代码执行耗时统计方法

解决方案:独立于系统时钟的代码耗时统计方法

一、使用独立硬件定时器(最可靠方案)

嵌入式平台几乎都配备了独立于CPU和系统时钟的硬件定时器外设,这类定时器通常由专用晶振或内部高精度RC振荡器驱动,不受NTP时间同步、CPU休眠/空闲状态的影响,完全匹配你的需求。

实现步骤

  1. 初始化硬件定时器:配置稳定的时钟源(选不受系统修改的类型)、预分频器和自动重装载值,若定时器计数值范围有限,需开启溢出中断记录溢出次数。
  2. 在function()执行前读取定时器当前计数值,记为start_count,同时记录当前溢出次数start_overflow。
  3. 在function()执行后读取定时器当前计数值end_count和溢出次数end_overflow。
  4. 根据定时器时钟频率计算耗时:通过总tick数(计数值差值+溢出次数×最大计数值)除以时钟频率,得到实际耗时。

示例代码(通用嵌入式平台适配版)

#include <cstdint>

// 硬件定时器相关全局变量(需根据平台寄存器调整)
volatile uint32_t overflow_times = 0;

// 定时器溢出中断服务函数(需配置平台中断向量表)
extern "C" void TIMER_IRQHandler(void) {
    overflow_times++;
    // 清除溢出中断标志位(平台寄存器对应位)
    TIMER->SR &= ~TIMER_SR_UIF;
}

void init_timer() {
    // 1. 使能定时器时钟(示例为STM32风格,需适配你的平台)
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    
    // 2. 配置预分频器,将72MHz时钟分频为1MHz(每1us计数1次)
    TIMER->PSC = 71;
    // 设置最大计数值,减少溢出频率
    TIMER->ARR = 0xFFFFFFFF;
    
    // 3. 使能溢出中断并开启NVIC中断
    TIMER->DIER |= TIMER_DIER_UIE;
    NVIC_EnableIRQ(TIMER_IRQn);
    
    // 4. 启动定时器
    TIMER->CR1 |= TIMER_CR1_CEN;
}

int main() {
    init_timer();
    
    // 记录起始计数与溢出次数
    uint32_t start_count = TIMER->CNT;
    uint32_t start_overflow = overflow_times;
    
    function();
    
    // 记录结束计数与溢出次数
    uint32_t end_count = TIMER->CNT;
    uint32_t end_overflow = overflow_times;
    
    // 计算总tick数
    uint64_t total_ticks = (uint64_t)(end_overflow - start_overflow) * 0xFFFFFFFF;
    total_ticks += (end_count - start_count);
    
    // 换算成时间(1tick=1us)
    double time_take_us = static_cast<double>(total_ticks);
    double time_take_s = time_take_us / 1e6;
    
    return 0;
}

二、备用方案:利用独立RTC计数

如果平台配有独立供电的RTC模块(比如纽扣电池驱动),即使系统未同步NTP,RTC的秒/亚秒计数器也会持续运行。可直接读取RTC的计数差值计算耗时,注意确认RTC的分辨率是否满足你的精度需求。

关键注意事项

  • 时钟源稳定性:优先选择独立外部晶振或内部高精度RC振荡器,避免依赖系统时钟分频的源。
  • 溢出处理:必须通过中断记录定时器溢出次数,否则会导致计数差值计算错误。
  • 平台适配:上述代码为通用示例,实际需根据你的嵌入式平台(STM32、NXP等)的寄存器手册修改初始化和中断配置逻辑。

内容的提问来源于stack exchange,提问作者Avinash Kaitheri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:30:52