我是靠谱客的博主 微笑白羊,最近开发中收集的这篇文章主要介绍GCC移植perf_counterGCC移植perf_counter,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 );

最后

以上就是微笑白羊为你收集整理的GCC移植perf_counterGCC移植perf_counter的全部内容,希望文章能够帮你解决GCC移植perf_counterGCC移植perf_counter所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部