国芯CCFC2012BC的FreeRTOS 增加任务运行时间统计配置

         在执行多任务的过程中,如果发现某一任务占用的时间过长,可以拆分这个任务来提高任务并行的效率。FreeRTOS可以通过函数vTaskGetRunTimeStats()来统计各个任务的运行时间占总运行时间的百分比,具体输出格式如下:

 在FreeRTOS.h中需要开启或配置如下的宏定义:

/*
 * 1:增加任务运行时统计
 配置位置:
    #define portGET_RUN_TIME_COUNTER_VALUE()  FreeRTOSRunTimeTicks
    
    #ifndef configGENERATE_RUN_TIME_STATS
	#define configGENERATE_RUN_TIME_STATS 1
    #endif
    
    #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
	#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimerForRunTimeStats()
    #endif
    
    #ifndef configUSE_STATS_FORMATTING_FUNCTIONS
	#define configUSE_STATS_FORMATTING_FUNCTIONS 1
    #endif
 */

     其中ConfigureTimerForRunTimeStats()为配置运行统计时间的定时器,时间精度要比freeRTOS的基定时器要快10-100倍,FreeRTOSRunTimeTicks为时间计数,具体配置如下:

task.c

volatile uint32_t FreeRTOSRunTimeTicks = 0;
/*
 * 增加任务统计功能增加的
 */
void vCPURunTickISR(void)
{
	PIT->CH[CPURUNTICK_PIT_CHANNEL].TFLG.R = 0x00000001;
	FreeRTOSRunTimeTicks++;
	
	return ;
}	
	
	
void ConfigureTimerForRunTimeStats(void)
{	
	 uint32_t interrupt_enable;
	 uint16_t priority;
	 uint32_t ld_val;

	 interrupt_enable = 1;
	 priority = PIT_CH1_INT_PRIORITY;
	 ld_val = RUNTOTAL_TICK_INTERVAL;
	 
	 FreeRTOSRunTimeTicks = 0;

	 pit_config(vCPURunTickISR, CPURUNTICK_PIT_CHANNEL,
	 interrupt_enable, priority, ld_val);
	 PIT_START_TIMER(CPURUNTICK_PIT_CHANNEL);
		
	 return ;
}

  在FreeRTOSConf.h 时间基准配置与优先级和定时器选择配置:

FreeRTOSConf.h
/*
 * tune this to the actual frequency used by the PIT in RUN0 mode
 * init_sys(), configures RUN0 with pll to 64MHZ and also as sysclk
 */
#define configCPU_CLOCK_HZ ((unsigned portLONG)64000000)
#define configCPU_RUNCLOCK_HZ  ((unsigned portLONG)3200000)



#define configTICK_RATE_HZ ((TickType_t)1000)

#define RUNTOTAL_TICK_INTERVAL ((configCPU_RUNCLOCK_HZ / configTICK_RATE_HZ) - 1UL)


/* MPC5604B specific: pit channel to use 0-15 */
#define TICK_PIT_CHANNEL 0
#define CPURUNTICK_PIT_CHANNEL 1


   在任务中调用vTaskGetRunTimeStats,后打印信息,发现在调用vTaskGetRunTimeStats是程序死了,最后定位是出错vPortFree( pxTaskStatusArray );,后面发现freeRTOS的内存管理方式采用的是heap_1.c ,此方法申请的内存无法回收,,改用heap_4.c的方法后,此功能配置完成。

   最后吐槽下我的上司,此功能配置在我不受影响的情况下不到半天解决了,但是之前他的催促下我硬是花了1天都没能解决,可能我大部分的时间都花在对抗他给我的焦虑上了哈哈。别催、越催越慢。

    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值