This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VH-Q1:apprtosTaskDelete () 错误报告

Guru**** 2897200 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1646411/tda4vh-q1-apprtostaskdelete-bug-report

器件型号: TDA4VH-Q1

j784s4 PSDK 11.2 刚刚遇到了一个问题(可能在其他版本和使用 PDK 的 SoC 上也是如此)。

问题:在任务干净终止后,r5+SAFERTOS 通过 appRtosTaskDelete() 挂起。

在长时间的调试会话后、发现根本原因是:

  • 在 appRthosTaskCreate() 中、tsk 会通过 appPerfStatsRegisterTask() 在 perfstats 中自动注册、
  • 但这在 appRthosTaskDelete() 中不会撤消,导致 perfstats 内出现一个悬空的任务指针,
  • 稍后这会导致崩溃。

下面是为 appRtaskDelete() 添加反向操作的修补程序、该修补程序使问题不再重现。

Date: Fri, 15 May 2026 18:48:07 +0200
Subject: [PATCH] app_utils: perfstat: survive after task termination

Since appRtosTaskCreate() autoimatically adds the created task to
perfstat, appRtosTaskDelete() shall remove it. Otherwise, a
dangling task pointer is left in perfstat, causing crashes.
---
 .../utils/perf_stats/include/app_perf_stats.h |  9 +++++
 .../utils/perf_stats/src/app_perf_stats_api.c |  6 +++
 .../perf_stats/src/app_perf_stats_api_x86.c   |  5 +++
 .../perf_stats/src/app_perf_stats_freertos.c  | 37 +++++++++++++++++++
 app_utils/utils/rtos/src/app_rtos_pdk.c       |  2 +
 5 files changed, 59 insertions(+)

diff --git a/app_utils/utils/perf_stats/include/app_perf_stats.h b/app_utils/utils/perf_stats/include/app_perf_stats.h
index 8ac585da1..a74a0604e 100755
--- a/app_utils/utils/perf_stats/include/app_perf_stats.h
+++ b/app_utils/utils/perf_stats/include/app_perf_stats.h
@@ -505,6 +505,15 @@ int32_t appPerfStatsPrintAll();
  */
 int32_t appPerfStatsRegisterTask(void *task_handle, const char *name);
 
+/**
+ * \brief Unregister a task from task load calculation
+ *
+ *        Must be called for terminated task
+ *
+ * \return 0 on success
+ */
+int32_t appPerfStatsUnregisterTask(void *task_handle);
+
 /**
  * \brief De-Initialize perf statistics collector module
  *
diff --git a/app_utils/utils/perf_stats/src/app_perf_stats_api.c b/app_utils/utils/perf_stats/src/app_perf_stats_api.c
index e1138f61f..fed4d0d02 100644
--- a/app_utils/utils/perf_stats/src/app_perf_stats_api.c
+++ b/app_utils/utils/perf_stats/src/app_perf_stats_api.c
@@ -685,6 +685,12 @@ int32_t appPerfStatsRegisterTask(void *task_handle, const char *name)
     /* NOT supported for LINUX */
     return -1;
 }
+
+int32_t appPerfStatsUnregisterTask(void *task_handle)
+{
+    /* NOT supported for LINUX */
+    return -1;
+}
 #endif
 
 void appPerfPointSetName(app_perf_point_t *prm, const char *name)
diff --git a/app_utils/utils/perf_stats/src/app_perf_stats_api_x86.c b/app_utils/utils/perf_stats/src/app_perf_stats_api_x86.c
index 523f21058..e1fd20316 100644
--- a/app_utils/utils/perf_stats/src/app_perf_stats_api_x86.c
+++ b/app_utils/utils/perf_stats/src/app_perf_stats_api_x86.c
@@ -125,6 +125,11 @@ int32_t appPerfStatsRegisterTask(void *task_handle, const char *name)
     return 0;
 }
 
+int32_t appPerfStatsUnregisterTask(void *task_handle)
+{
+    return 0;
+}
+
 void appPerfPointSetName(app_perf_point_t *prm, const char *name)
 {
 }
diff --git a/app_utils/utils/perf_stats/src/app_perf_stats_freertos.c b/app_utils/utils/perf_stats/src/app_perf_stats_freertos.c
index 374f322f9..d0b7825ff 100644
--- a/app_utils/utils/perf_stats/src/app_perf_stats_freertos.c
+++ b/app_utils/utils/perf_stats/src/app_perf_stats_freertos.c
@@ -723,6 +723,43 @@ int32_t appPerfStatsRegisterTask(void *task_handle, const char *name)
     return status;
 }
 
+int32_t appPerfStatsUnregisterTask(void *task_handle)
+{
+    app_perf_stats_obj_t *obj = &g_app_perf_stats_obj;
+    int32_t status = -1;
+    uint32_t idx;
+
+    if (1U == g_perf_stats_load_update_enable)
+    {
+        appPerfStatsLock(obj);
+
+        for (idx = 0; idx < obj->num_tasks; idx++)
+        {
+            if (obj->task_handle[idx] == task_handle)
+            {
+                status = 0;
+                break;
+            }
+        }
+
+        if (status == 0)
+        {
+            for (idx++; idx < obj->num_tasks; idx++)
+            {
+                obj->task_handle[idx - 1] = obj->task_handle[idx];
+                memcpy(obj->task_name[idx - 1], obj->task_name[idx], APP_PERF_STATS_TASK_NAME_MAX);
+                obj->taskLoad[idx - 1] = obj->taskLoad[idx];
+            }
+
+            obj->num_tasks--;
+        }
+
+        appPerfStatsUnLock(obj);
+    }
+
+    return status;
+}
+
 void appPerfStatsHwaResetLoadCalc(app_perf_hwa_id_t id)
 {
     app_perf_stats_obj_t *obj = &g_app_perf_stats_obj;
diff --git a/app_utils/utils/rtos/src/app_rtos_pdk.c b/app_utils/utils/rtos/src/app_rtos_pdk.c
index 994b78285..592d3fe42 100755
--- a/app_utils/utils/rtos/src/app_rtos_pdk.c
+++ b/app_utils/utils/rtos/src/app_rtos_pdk.c
@@ -271,6 +271,8 @@ app_rtos_status_t appRtosTaskDelete(app_rtos_task_handle_t *handle)
 
     if ((NULL != handle) && (*handle != NULL))
     {
+        (void)appPerfStatsUnregisterTask(*handle);
+
 /* LDRA_JUSTIFY_START
 <metric start> branch <metric end>
 <justification start> APP_UTILS_BRANCH_COVERAGE_RTOS_PDK_UBR002
-- 
2.47.3

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nikitha、

    [报价 userid=“496680“ url=“~/support/processors-group/processors/f/processors-forum/1646411/tda4vh-q1-apprtostaskdelete-bug-report
    • 在 appRthosTaskCreate() 中、tsk 会通过 appPerfStatsRegisterTask() 在 perfstats 中自动注册、
    • 但这在 appRthosTaskDelete() 中不会撤消,导致 perfstats 内出现一个悬空的任务指针,
    • 稍后这会导致崩溃。
    [/报价]

    是的、您回答正确。 这似乎是一个错误。 我将提出一个 JIRA 来解决这个问题。 感谢您指出这一点。

    此致、
    Gokul