实战经验 | TouchGFX 中 MCU 负载的计算过程介绍

cathy的头像
cathy 发布于:周三, 05/29/2024 - 11:22 ,关键词:

一、引言

从 TouchGFX Desinger 下载的 TBS(TouchGFX Board Setup)大都带有 MCU 的 负载计算功能,那么如何在自己的板子上增加 MCU 负载计算功能呢?本文档参考从 TouchGFX Designer 上下载的 STM32F746 的 TBS,讲解 MCU 负载计算的实现过程。 

二、下载参考代码

打开 TouchGFX Desinger 软件,下载 STM32F746G_DISCO TBS,下载好之后导入 一个带 MCU load 的 UI demo,然后点击生成代码。下边我们来讲解它是如何实现 MCU 负载计算过程。 

1716952640448740.png

▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS 

1716952650267661.png

▲ 图2. 导入带 MCU load 的 UI demo 

2.1. 修改.extSettings 文件 

如图 3 所示,添加以下代码,这样用 STM32CubeMX 生成代码时,就会自动把 CortexMMCUInstrumentation.cpp 添加到对应的 IDE 中。当然前提是要把 CortexMMCUInstrumentation.cpp 和 CortexMMCUInstrumentation.hpp 复制到 TouchGFX/target 文件夹下。

1716952680880489.png

▲ 图3. 添加文件到 IDE 

2.2. 开启 USE_IDLE_HOOK 

点击 FreeRTOS,设置 USE_IDLE_HOOK 为 ENABLE。

1716952696937322.png

▲ 图4. 使能 USE_IDLE_HOOD 

2.3. 修改 freertos.c 

声明 vApplicationIdleHook,并添加它的实现代码。同时添加 IdleTaskHook 的声 明。

freertos.c 添加代码

/* USER CODE BEGIN FunctionPrototypes */ 
extern portBASE_TYPE IdleTaskHook(void* p); 
/* USER CODE END FunctionPrototypes */

/* Hook prototypes */ 
void vApplicationIdleHook(void);

/* USER CODE BEGIN 2 */ 
void vApplicationIdleHook( void )
{
   /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle task. It is essential that code added to this hook function never attempts to block in any way (for example, call xQueueReceive() with a block time specified, or call vTaskDelay()). If the application makes use of the vTaskDelete() API function (as this demo application does) then it is also important that vApplicationIdleHook() is permitted to return to its calling function, because it is the responsibility of the idle task to clean up memory allocated by the kernel to any task that has since been deleted. */
   vTaskSetApplicationTaskTag(NULL, IdleTaskHook); 
}

2.4. 修改 TouchGFXHAL.cpp 

在 TouchGFXHAL.cpp 添加以下代码 

CortexMMCUInstrumentation instrumentation;
void TouchGFXHAL::initialize() 

   instrumentation.init(); 
   setMCUInstrumentation(&instrumentation); 
   enableMCULoadCalculation(true); 

extern "C" 

   portBASE_TYPE IdleTaskHook(void* p)
   { 
       if ((int)p) //idle task sched out  
       { 
           touchgfx::HAL::getInstance()->setMCUActive(true);   
       } 
       else //idle task sched in   
       { 
           touchgfx::HAL::getInstance()->setMCUActive(false);   
       } 
       return pdTRUE;   
   } 
}

2.5. Model.cpp 中的代码 

参考下载的代码,调用以下函数,即是 MCU 负载值的获取。

uint8_t mcuLoadPct = touchgfx::HAL::getInstance()->getMCULoadPct();

三、小结

以上就是添加 MCU 负载计算的过程,更多详细信息大家可参考下载 TBS 中的代码注释。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 11