1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

feat(freertos): add functions to better measure the CPU usage (#6619)

This commit is contained in:
Gabor Kiss-Vamosi 2024-08-21 11:46:51 +02:00 committed by GitHub
parent b78a4de898
commit f8e0932316
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 68 additions and 1 deletions

View File

@ -222,6 +222,14 @@ typedef struct lv_global_t {
lv_mutex_t lv_general_mutex;
#endif
#if LV_USE_OS == LV_OS_FREERTOS
uint32_t freertos_idle_time_sum;
uint32_t freertos_non_idle_time_sum;
uint32_t freertos_task_switch_timestamp;
bool freertos_idle_task_running;
#endif
void * user_data;
} lv_global_t;

View File

@ -13,7 +13,6 @@
* INCLUDES
*********************/
#include "lv_os.h"
#if LV_USE_OS == LV_OS_FREERTOS
#if (ESP_PLATFORM)
@ -22,7 +21,10 @@
#include "atomic.h"
#endif
#include "../tick/lv_tick.h"
#include "../misc/lv_log.h"
#include "../core/lv_global.h"
/*********************
* DEFINES
*********************/
@ -32,6 +34,8 @@
#define pcTASK_NAME "lvglDraw"
#endif
#define globals LV_GLOBAL_DEFAULT()
/**********************
* TYPEDEFS
**********************/
@ -348,6 +352,38 @@ lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * pxCond)
return LV_RESULT_OK;
}
void lv_freertos_task_switch_in(const char * name)
{
if(lv_strcmp(name, "IDLE")) globals->freertos_idle_task_running = false;
else globals->freertos_idle_task_running = true;
globals->freertos_task_switch_timestamp = lv_tick_get();
}
void lv_freertos_task_switch_out(void)
{
uint32_t elaps = lv_tick_elaps(globals->freertos_task_switch_timestamp);
if(globals->freertos_idle_task_running) globals->freertos_idle_time_sum += elaps;
else globals->freertos_non_idle_time_sum += elaps;
}
uint32_t lv_os_get_idle_percent(void)
{
if(globals->freertos_non_idle_time_sum + globals->freertos_idle_time_sum == 0) {
LV_LOG_WARN("Not enough time elapsed to provide idle percentage");
return 0;
}
uint32_t pct = (globals->freertos_idle_time_sum * 100) / (globals->freertos_idle_time_sum +
globals->freertos_non_idle_time_sum);
globals->freertos_non_idle_time_sum = 0;
globals->freertos_idle_time_sum = 0;
return pct;
}
/**********************
* STATIC FUNCTIONS
**********************/

View File

@ -77,6 +77,29 @@ typedef struct {
* GLOBAL PROTOTYPES
**********************/
/**
* Set it for `traceTASK_SWITCHED_IN()` as
* `lv_freertos_task_switch_in(pxCurrentTCB->pcTaskName)`
* to save the start time stamp of a task
* @param name the name of the which is switched in
*/
void lv_freertos_task_switch_in(const char * name);
/**
* Set it for `traceTASK_SWITCHED_OUT()` as
* `lv_freertos_task_switch_out()`
* to save finish time stamp of a task
*/
void lv_freertos_task_switch_out(void);
/**
* Set it for `LV_SYSMON_GET_IDLE` to show the CPU usage
* as reported based the usage of FreeRTOS's idle task
* If it's important when a GPU is used.
* @return the idle percentage since the last call
*/
uint32_t lv_os_get_idle_percent(void);
/**********************
* MACROS
**********************/