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);
}
}
任务运行截图