stm32h743_player/User/tasks/task_debug.c
2024-03-03 22:46:44 +08:00

118 lines
4.3 KiB
C

#include "task_debug.h"
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "elog.h"
#include "heap.h"
#include "bsp_oled_sh1106.h"
static const char *TAG = "task_debug";
static uint8_t task_debug_oled_enabled = 0;
static tlsf_pool_statistics *dtcm_heap_statistics;
static tlsf_pool_statistics *ahb_heap_statistics;
static tlsf_pool_statistics *axi_heap_statistics;
#define TASK_DEBUG_INTERVAL_MS 100
#define TASK_DEBUG_LED_TOGGLE_INTERVAL_MS (500) //每500ms闪烁一次LED
#define TASK_DEBUG_OLED_REFRESH_INTERVAL_MS (200) //每200ms更新一次OLED显示
#define TASK_DEBUG_HEAP_USAGE_PRINT_INTERVAL_MS (1000*60) //每分钟打印一次堆状态信息
#define TASK_DEBUG_RUNTIME_STATS_PRINT_INTERVAL_MS (1000*60) //每分钟打印一次任务统计信息
static uint32_t task_debug_heap_usage_update_interval_ms = TASK_DEBUG_HEAP_USAGE_PRINT_INTERVAL_MS; //更新堆状态信息的时间间隔
static uint32_t task_debug_runtime_stats_update_interval_ms = TASK_DEBUG_RUNTIME_STATS_PRINT_INTERVAL_MS; //更新任务统计信息的时间间隔
void task_debug_led_toggle_routine(uint64_t millisecs_elapsed)
{
if ((millisecs_elapsed % TASK_DEBUG_LED_TOGGLE_INTERVAL_MS == 0)) {
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
}
void task_debug_heap_usage_update_routine(uint64_t millisecs_elapsed)
{
if ((millisecs_elapsed % task_debug_heap_usage_update_interval_ms == 0)) {
dtcm_heap_statistics = get_dtcm_heap_statistics();
ahb_heap_statistics = get_ahb_heap_statistics();
axi_heap_statistics = get_axi_heap_statistics();
}
}
void task_debug_runtime_stat_print_routine(uint64_t millisecs_elapsed)
{
if ((millisecs_elapsed % TASK_DEBUG_RUNTIME_STATS_PRINT_INTERVAL_MS == 0) && millisecs_elapsed != 0) {
char runtime_stats[512];
vTaskGetRunTimeStats(runtime_stats);
elog_debug(TAG, "runtime stats:\n%s\b", runtime_stats);
}
}
void task_debug_heap_usage_print_routine(uint64_t millisecs_elapsed)
{
if ((millisecs_elapsed % TASK_DEBUG_HEAP_USAGE_PRINT_INTERVAL_MS == 0) && millisecs_elapsed != 0) {
elog_debug(TAG, "heap usage: xxx");
}
}
void task_debug_oled_init(void)
{
HAL_StatusTypeDef oled_status = bsp_oled_init(&hi2c1);
if (oled_status != HAL_OK) {
elog_warn(TAG, "oled initialization failed, oled print is disabled");
return;
}
bsp_oled_6x8(0, 0, "DTCM AXI AHB");
task_debug_oled_enabled = 1;
task_debug_heap_usage_update_interval_ms = TASK_DEBUG_OLED_REFRESH_INTERVAL_MS;
task_debug_runtime_stats_update_interval_ms = TASK_DEBUG_OLED_REFRESH_INTERVAL_MS; //提高状态信息的刷新速度
}
void task_debug_oled_refresh_routine(uint64_t millisecs_elapsed)
{
if ((millisecs_elapsed % TASK_DEBUG_OLED_REFRESH_INTERVAL_MS == 0) && task_debug_oled_enabled == 1) {
uint32_t free_dtcm_heap = dtcm_heap_statistics->free_size;
uint32_t free_axi_heap = axi_heap_statistics->free_size;
uint32_t free_ahb_heap = ahb_heap_statistics->free_size;
char str[40];
sprintf(str, "%2d.%dk %3d.%dk %3d.%dk", (int)(free_dtcm_heap / 1024), (int)((free_dtcm_heap % 1024) / 102),
(int)(free_axi_heap / 1024), (int)((free_axi_heap % 1024) / 102),
(int)(free_ahb_heap / 1024), (int)((free_ahb_heap % 1024) / 102));
bsp_oled_6x8(1, 0, str);
bsp_oled_update();
}
}
void task_debug_entry(void *param)
{
uint64_t millisecs_elapsed = 0;
TickType_t xLastWakeTime = xTaskGetTickCount();
const TickType_t xPeriod = pdMS_TO_TICKS(TASK_DEBUG_INTERVAL_MS);
task_debug_oled_init();
while (1) {
task_debug_led_toggle_routine(millisecs_elapsed); //闪烁LED 用于指示低优先级任务正在运行
task_debug_heap_usage_update_routine(millisecs_elapsed); //更新堆状态信息
//更新任务统计信息
task_debug_runtime_stat_print_routine(millisecs_elapsed); //定时打印任务统计信息
task_debug_heap_usage_print_routine(millisecs_elapsed); //定时打印堆占用信息
task_debug_oled_refresh_routine(millisecs_elapsed); //定时刷新OLED显示
millisecs_elapsed += TASK_DEBUG_INTERVAL_MS;
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
void task_debug_create(void *param)
{
xTaskCreate(task_debug_entry, "task_debug", 4096 / sizeof(StackType_t), param, 15, NULL);
}