GCC移植perf_counter

该博客介绍了如何在GCC环境下移植perf_counter,并在FreeRTOS系统中使用。通过在SysTick_Handler中插入perf_counter调用来实现计数,同时提供初始化和校准步骤以确保精度。文章还详细说明了如何通过示波器校准来减少误差,以及如何使用get_system_ticks测量周期数。
摘要由CSDN通过智能技术生成

GCC移植perf_counter


从github上获取最新源代码(当前V1.9.9)

git clone https://github.com/GorgonMeducer/perf_counter.git

拷贝需要的源代码

perf_counter.c

perf_counter.h

perf_os_patch_freertos.c

进行perf_counter移植:

一、在SysTick_Handler中插入perf_counter的调用即可

//! systick 中断处理函数
void SysTick_Handler(void)
{
    //! perf_counter的调用,用来更新计数
    user_code_insert_to_systick_handler();
}

关于freertos中SysTick_Handler的实现

extern void xPortSysTickHandler(void);
//! systick 中断函数的实现
__attribute__((used))   //!< 防止编译器优化掉systick_handler
void SysTick_Handler(void)
{
    //! perf_counter的调用,用来更新计数
    user_code_insert_to_systick_handler();
    
    //! freertos 的systick调用
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    {
#endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
    }
#endif  /* INCLUDE_xTaskGetSchedulerState */  
}

perf_counter 初始化

    //! 确保测量的周期数和系统时钟一致
	SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
	//! 初始化perf_counter; true表示用户实现了SysTick的配置
	//! 如果使用rtos,则需要设置为true,如果没有使用rtos,并且
	//! 也没有手动配置systick,则传false,perf_counter会进行初始化配置
    init_cycle_counter(true);

perf_counter 校准

如果使用rtos,则rtos在启动调度后(确保已配置systick),再更新一下perf_counter,则延时误差在优化等级-o1/-o2的情况下可达到1us以内,如果是-o0优化,则在2us左右

//! 在用户修改了系统频率之后(修改SystemCoreClock值之后)用来更行perf_counter内参数的
update_perf_counter();

自带校准测量函数的使用

__cycleof__(){
  delay_us(100);  
};

误差在1us以内,是可接受范围,如果想要把这个误差完全消除,则需要使用示波器的负脉宽测量出具体的精确误差,以及打印出来的值进行调整g_nOffset的值,可以完全消除;

注意:示波器的光标是像素级别的,是不精确的,想要精确的值,需要使用负脉宽进行捕获

使用get_system_ticks测量

 //! 测试perf_counter, 需要先进行校准
 int64_t lBeforeTick = get_system_ticks();
 int64_t lAfterTick = get_system_ticks();
 int32_t nOffsetVal = lAfterTick - lBeforeTick;
 
 //! 测量出来的值减去偏差值才是正确的周期数
 lBeforeTick = get_system_ticks();
 delay_us(100);
 lAfterTick = get_system_ticks();
 printf("100 us tick=%d", lAfterTick - lBeforeTick - nOffsetVal );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值