一、实验目标
创建三个动态任务,栈空间大小均为128字。startTask、Task1、Task2。startTask仅运行一次,负责task1、task2任务的创建,startTask任务的删除。Task1负责1S闪烁一次,指示系统运行状态。Task2负责获取任务运行时间,并用串口发送。
注:本实验基于正点原子FreeRTOS教程的学习总结。
二、实验准备
1.FreeRTOS的Keil动态任务创建与删除程序
2.STM3F407开发板
3.宏定义开启
将configGENERATE_RUN_TIME_STATS 、configUSE_TRACE_FACILITY、configUSE_STATS_FORMATTING_FUNCTIONS置一 。
/* 运行时间和任务状态统计相关定义 */
#define configGENERATE_RUN_TIME_STATS 1 /* 1: 使能任务运行时间统计功能, 默认: 0 */
#if configGENERATE_RUN_TIME_STATS
#include "./BSP/TIMER/btim.h"
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStats()
extern uint32_t FreeRTOSRunTimeTicks;
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks
#endif
#define configUSE_TRACE_FACILITY 1 /* 1: 使能可视化跟踪调试, 默认: 0 */
#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 */
4.所需API函数介绍
获取指定任务的运行时间、运行状态等信息,若使用此函数,需在F reeRTOSConfig.h 文件中同时设置配置项configGENERATE_RUN_TIME_STAT S 、configUSE_STATS_FORMATTING_FUNCTIONS 、configSUPPORT_DYNAMIC_ALLOCATION
为1。
输入为接收任务运行时间和运行状态信息的缓存指针。
void vTaskGetRunTimeStats(char * pcWriteBuffer);
5.btim文件定义时基
在.c文件中定义FreeRTOSRunTimeTicks,以及函数ConfigureTimeForRunTimeStats(),,并在中断中让变量自加。记得在btim.h文件中对函数进行定义。
uint32_t FreeRTOSRunTimeTicks; //FreeRTOS获取任务运行时间值
void ConfigureTimeForRunTimeStats(void)
{
btim_tim6_int_init(10-1, 84-1); //定时器时钟为84M,设置定时时间为10us
FreeRTOSRunTimeTicks = 0;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == BTIM_TIM6_INT)
{
FreeRTOSRunTimeTicks++;
}
}
三、代码编写
3.1修改Task1的任务函数内容
Task1实现LED1s闪烁。
void task1(void *pvParameters)
{
while(1)
{
LED1_TOGGLE();
vTaskDelay(100);
}
}
3.2修改Task2的任务函数内容
Task2实现任务运行时间统计与发送。
char task_buf[500];
void task2(void *pvParameters)
{
while(1)
{
vTaskDelay(2000);
vTaskGetRunTimeStats(task_buf);
printf("%s\r\n",task_buf);
}
}
四、实验现象
实验现象如下所示。可以看到列出所有系统的任务运行时间,以及占用的总时间比例。注意这里的运行时间时基于ConfigureTimeForRunTimeStats()函数所初始化的定时器时间的,真正的运行时间为获取数字*定时器时间。