wenbo2005.online

学习记录 / FreeRTOS

CPU 与 RAM 使用情况

FreeRTOS2024-07-11

查看内存占用率与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            任务挂起