This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit 124c1328a61c8cabc4f73e934d8113461c34aa45
Author: chao.an <anc...@xiaomi.com>
AuthorDate: Sat Apr 2 16:55:21 2022 +0800

    sched/note: add support of trace section mark
    
    The implementation of this feature is based on android systrace:
    
    https://source.android.com/devices/tech/debug/ftrace
    
    Application developers are more concerned about the performance of
    the specified application section,
    added two APIs to implement performance measurement:
    
    void sched_note_begin(FAR const char *str);
    void sched_note_end(FAR const char *str);
    or
    SCHED_NOTE_BEGIN();  /* defined to sched_note_begin(__FUNCTION__) */
    SCHED_NOTE_END();    /* defined to sched_note_end(__FUNCTION__) */
    
    Signed-off-by: chao.an <anc...@xiaomi.com>
---
 system/trace/trace.c      | 19 +++++++++++++++---
 system/trace/trace.h      | 18 +++++++++++++++--
 system/trace/trace_dump.c | 49 +++++++++++++++++++++++++++++++++++++----------
 3 files changed, 71 insertions(+), 15 deletions(-)

diff --git a/system/trace/trace.c b/system/trace/trace.c
index 4e94d58..d7e38f6 100644
--- a/system/trace/trace.c
+++ b/system/trace/trace.c
@@ -142,10 +142,22 @@ static int trace_cmd_start(int index, int argc, FAR char 
**argv,
 static int trace_cmd_dump(int index, int argc, FAR char **argv,
                           int notectlfd)
 {
+  trace_dump_t type = TRACE_TYPE_LTTNG_KERNEL;
   FAR FILE *out = stdout;
-  int ret;
   bool changed = false;
   bool cont = false;
+  int ret;
+
+  /* Usage: trace dump [-a] "Custom Format : Android SysTrace" */
+
+  if (index < argc)
+    {
+      if (strcmp(argv[index], "-a") == 0)
+        {
+          index++;
+          type = TRACE_TYPE_ANDROID;
+        }
+    }
 
   /* Usage: trace dump [-c][<filename>] */
 
@@ -189,7 +201,7 @@ static int trace_cmd_dump(int index, int argc, FAR char 
**argv,
 
   /* Dump the trace data */
 
-  ret = trace_dump(out);
+  ret = trace_dump(type, out);
 
   if (changed)
     {
@@ -788,8 +800,9 @@ static void show_usage(void)
                                 " Get the trace while running <command>\n"
 #endif
 #ifdef CONFIG_DRIVER_NOTERAM
-          "  dump [-c][<filename>]           :"
+          "  dump [-a][-c][<filename>]           :"
                                 " Output the trace result\n"
+                                " [-a] <Android SysTrace>\n"
 #endif
           "  mode [{+|-}{o|w|s|a|i|d}...]        :"
                                 " Set task trace options\n"
diff --git a/system/trace/trace.h b/system/trace/trace.h
index 241a38b..63cff3e 100644
--- a/system/trace/trace.h
+++ b/system/trace/trace.h
@@ -38,6 +38,20 @@ extern "C"
 #endif
 
 /****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef enum
+{
+  TRACE_TYPE_LTTNG_KERNEL = 0,  /* Common Trace Format : Linux Kernel Trace */
+  TRACE_TYPE_GENERIC_CTF  = 1,  /* Common Trace Format : Generic CTF Trace */
+  TRACE_TYPE_LTTNG_UST    = 2,  /* Common Trace Format : LTTng UST Trace */
+  TRACE_TYPE_CUSTOM_TEXT  = 3,  /* Custom Text :         TmfGeneric */
+  TRACE_TYPE_CUSTOM_XML   = 4,  /* Custom XML :          Custom XML Log */
+  TRACE_TYPE_ANDROID      = 5,  /* Custom Format :       Android ATrace */
+} trace_dump_t;
+
+/****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
 
@@ -51,7 +65,7 @@ extern "C"
  *
  ****************************************************************************/
 
-int trace_dump(FAR FILE *out);
+int trace_dump(trace_dump_t type, FAR FILE *out);
 
 /****************************************************************************
  * Name: trace_dump_clear
@@ -85,7 +99,7 @@ void trace_dump_set_overwrite(bool mode);
 
 #else /* CONFIG_DRIVER_NOTERAM */
 
-#define trace_dump(out)
+#define trace_dump(type,out)
 #define trace_dump_clear()
 #define trace_dump_get_overwrite()      0
 #define trace_dump_set_overwrite(mode)  (void)(mode)
diff --git a/system/trace/trace_dump.c b/system/trace/trace_dump.c
index 004849d..7fbc46b 100644
--- a/system/trace/trace_dump.c
+++ b/system/trace/trace_dump.c
@@ -381,8 +381,7 @@ static void trace_dump_sched_switch(FAR FILE *out,
  * Name: trace_dump_one
  ****************************************************************************/
 
-static int trace_dump_one(FAR FILE *out,
-                          FAR uint8_t *p,
+static int trace_dump_one(trace_dump_t type, FAR FILE *out, FAR uint8_t *p,
                           FAR struct trace_dump_context_s *ctx)
 {
   FAR struct note_common_s *note = (FAR struct note_common_s *)p;
@@ -520,8 +519,16 @@ static int trace_dump_one(FAR FILE *out,
             }
 
           trace_dump_header(out, note, ctx);
-          fprintf(out, "sys_%s(",
-                  g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED]);
+          if (type == TRACE_TYPE_ANDROID)
+            {
+              fprintf(out, "tracing_mark_write: B|%d|sys_%s(",
+                      pid, g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED]);
+            }
+          else
+            {
+              fprintf(out, "sys_%s(",
+                      g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED]);
+            }
 
           for (i = j = 0; i < nsc->nsc_argc; i++)
             {
@@ -578,9 +585,20 @@ static int trace_dump_one(FAR FILE *out,
 
           trace_dump_header(out, note, ctx);
           trace_dump_unflatten(&result, nsc->nsc_result, sizeof(result));
-          fprintf(out, "sys_%s -> 0x%" PRIxPTR "\n",
-                  g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED],
-                  result);
+
+          if (type == TRACE_TYPE_ANDROID)
+            {
+              fprintf(out, "tracing_mark_write: E|%d|"
+                      "sys_%s -> 0x%" PRIxPTR "\n", pid,
+                      g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED],
+                      result);
+            }
+          else
+            {
+              fprintf(out, "sys_%s -> 0x%" PRIxPTR "\n",
+                      g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED],
+                      result);
+            }
         }
         break;
 #endif
@@ -632,7 +650,18 @@ static int trace_dump_one(FAR FILE *out,
           nst = (FAR struct note_string_s *)p;
           trace_dump_header(out, note, ctx);
           trace_dump_unflatten(&ip, nst->nst_ip, sizeof(ip));
-          fprintf(out, "0x%" PRIdPTR ": %s\n", ip, nst->nst_data);
+
+          if (type == TRACE_TYPE_ANDROID &&
+              strlen(nst->nst_data) > 2 &&
+              (memcmp(nst->nst_data, "B|", 2) == 0 ||
+               memcmp(nst->nst_data, "E|", 2) == 0))
+            {
+              fprintf(out, "tracing_mark_write: %s\n", nst->nst_data);
+            }
+          else
+            {
+              fprintf(out, "0x%" PRIdPTR ": %s\n", ip, nst->nst_data);
+            }
         }
         break;
 
@@ -684,7 +713,7 @@ static int trace_dump_one(FAR FILE *out,
  *
  ****************************************************************************/
 
-int trace_dump(FAR FILE *out)
+int trace_dump(trace_dump_t type, FAR FILE *out)
 {
   struct trace_dump_context_s ctx;
   uint8_t tracedata[UCHAR_MAX];
@@ -718,7 +747,7 @@ int trace_dump(FAR FILE *out)
       p = tracedata;
       do
         {
-          size = trace_dump_one(out, p, &ctx);
+          size = trace_dump_one(type, out, p, &ctx);
           p += size;
           ret -= size;
         }

Reply via email to