查看内存占用率与CPU使用率:
1,STM32cubemx中,在Config parameters->开启USE_IDLE_HOOK与USE_TICK_HOOK;
2,内存分配可以动静态,堆大小:15360byt,管理方案一般选heap_4;
3,添加CPU文件,并加入一些头文件,在FreeRTOSConfig.h文件中添加:
#define traceTASK_SWITCHED_IN() extern void StartIdleMonitor(void); \
StartIdleMonitor()
#define traceTASK_SWITCHED_OUT() extern void EndIdleMonitor(void); \
EndIdleMonitor()
cpu_utils.h引入头文件:
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
4,在任务中调用即可:
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint32_t tx_num=0;
for(;;)
{
osThreadSuspendAll ();
//¸该函数能得到CPU的占有率
printf("CPU:%d%%\r\n",osGetCPUUsage());
//¸该函数能得到RAM的占有率,configTOTAL_HEAP_SIZE的大小为15360
printf("RAM:%d%%\r\n",xPortGetMinimumEverFreeHeapSize()*100/configTOTAL_HEAP_SIZE);
osThreadResumeAll();
osDelayUntil(&tx_num,1000); //bug--->2秒打印一次,CPU占用率竟然100%
}
/* USER CODE END StartDefaultTask */
}
//===================================================================内存申请与释放
void * home;
home = pvPortMalloc(configTOTAL_HEAP_SIZE*5/100); //每次申请RAM百分之5的空间,导致RAM占用率上升
vPortFree(home) //释放内存
//=======================================================显示所以任务的情况
1,在上述配置下,include parameters -> 开启 eTaskGetState;
2,程序:
void StartDefaultTask_LED(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask_LED */
/* Infinite loop */
for(;;)
{
uint8_t diff[300]; // 300/4 = 75 < 256(该任务大小256)
printf("====================================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号 ");
osThreadList((uint8_t*)&diff);
printf("%s\r\n",diff);
osDelay(500);
}
/* USER CODE END StartDefaultTask_LED */
}
任务状态:
X 任务正在运行
B 任务阻塞
R 任务就绪
D 任务删除
S 任务挂起