FreeRtos学习笔记-----------------任务状态等参数的查询

API函数展示

在这里插入图片描述

实验

实验内容:统计各个任务的运行时间和CPU使用时间占比等信息
所用API函数:

void vTaskGetRunTimeStats( char * pcWriteBuffer ) PRIVILEGED_FUNCTION;     
/* pcWriteBuffer表示存储数据的内存 */

首先,在FreeRtosConfig.h中 更改如下两个宏

#define configGENERATE_RUN_TIME_STATS	1
#define configUSE_STATS_FORMATTING_FUNTIONS  1 //这个宏我没有找到
#define configUSE_STATS_FORMATTING_FUNCTIONS  1

然后创建两个宏
因为freertos.h中说

#ifndef portGET_RUN_TIME_COUNTER_VALUE
        #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE
            #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.
        #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */
    #endif /* portGET_RUN_TIME_COUNTER_VALUE */

所有我们要定义两个宏

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()  CONFIGTIMERFORRUNTIMESTATS()
#define portGET_RUN_TIME_COUNTER_VALUE       FreeRtosRuntimeticks

然后写与定时器有关的内容
首先定义一个全局变量

//freertos时间统计
volatile unsigned long long FreeRtosRuntimeticks;

然后声明

//freertos时间统计
extern volatile unsigned long long FreeRtosRuntimeticks;

配置定时器5

void CONFIGTIMERFORRUNTIMESTATS()
{
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	FreeRtosRuntimeticks = 0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);                      
	 //使能TIM5时钟
	
    TIM_TimeBaseInitStructure.TIM_Period = 49; 	                            
    //自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=179;                             
	 //定时器分频

    //周期 = 主频180Mhz  /180/50 = 50us 
    //频率 = 20kHz
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;           
	 //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);                      
	 //初始化TIM5
	
	TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);                                
	 //允许定时器5更新中断
	TIM_Cmd(TIM5,ENABLE); 
	 //使能定时器5
	 
	NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;                          
	//定时器5中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;            
	//抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;                   
	//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

配置TIM5中断服务函数

void TIM5_IRQHandler(void)  //中断服务函数
{
	if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //溢出中断
	{
		FreeRtosRuntimeticks++;  
    }
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}

然后创建读取信息的任务

#define TASK_RUNTIME_DEPTH    128    //堆栈
#define TASK_RUNTIME_PRIO      2 //优先级
TaskHandle_t TASK_RUNTIME_Handle;
char InformationBuffer[1000]; 
//创建一段存储数据的内存
void Task_RUNTIME( void * pvParameters);

xTaskCreate( (TaskFunction_t) Task_RUNTIME,
                (const char *)  "Task_RUNTIME", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                (uint16_t) TASK_RUNTIME_DEPTH,
                (void *) NULL,
                (UBaseType_t) TASK_RUNTIME_PRIO,
                (TaskHandle_t *) &TASK_RUNTIME_Handle );

	
//任务函数                		
void Task_RUNTIME( void * pvParameters)
{
	
	while(1)
	{ 
	     vTaskDelay(3000);
		 vTaskGetRunTimeStats(InformationBuffer);
		 GPIO_ResetBits(GPIOG, GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8);//GPIOF9,F10设置高,灯灭
		 vTaskDelay(500);
		 GPIO_SetBits(GPIOG, GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);//GPIOF9,F10设置高,灯灭
		 vTaskDelay(500);
		 printf("%s \r\n",InformationBuffer);
	}

}

任务运行截图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值