概述
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复