From 06b3b624755b04913b78b3b367b183c02abc9348 Mon Sep 17 00:00:00 2001 From: _VIFEXTech Date: Mon, 5 Jun 2023 22:53:57 +0800 Subject: [PATCH] feat(profiler): add built-in profiler (#4255) Signed-off-by: FASTSHIFT Co-authored-by: W-Mai <1341398182@qq.com> --- Kconfig | 6 +- docs/misc/perfetto_ui.png | Bin 0 -> 132696 bytes docs/overview/index.rst | 1 + docs/overview/profiler.rst | 202 +++++++++++++++++++++++++++++++++ docs/porting/index.rst | 1 - docs/porting/profiler.rst | 42 ------- lv_conf_template.h | 13 ++- lvgl.h | 1 + scripts/trace_filter.py | 41 +++++++ src/core/lv_obj.c | 7 ++ src/lv_conf_internal.h | 29 ++++- src/misc/lv_profiler_builtin.c | 168 +++++++++++++++++++++++++++ src/misc/lv_profiler_builtin.h | 89 +++++++++++++++ 13 files changed, 550 insertions(+), 50 deletions(-) create mode 100755 docs/misc/perfetto_ui.png create mode 100644 docs/overview/profiler.rst delete mode 100644 docs/porting/profiler.rst create mode 100755 scripts/trace_filter.py create mode 100644 src/misc/lv_profiler_builtin.c create mode 100644 src/misc/lv_profiler_builtin.h diff --git a/Kconfig b/Kconfig index d020cd4c5..292ae7537 100644 --- a/Kconfig +++ b/Kconfig @@ -1011,10 +1011,14 @@ menu "LVGL configuration" config LV_USE_PROFILER bool "Runtime performance profiler." + config LV_USE_PROFILER_BUILTIN + bool "Enable the built-in profiler" + depends on LV_USE_PROFILER + default y config LV_PROFILER_INCLUDE string "Header to include for the profiler" depends on LV_USE_PROFILER - default "profiler.h" + default "lvgl/src/misc/lv_profiler_builtin.h" config LV_USE_GRIDNAV bool "Enable grid navigation" diff --git a/docs/misc/perfetto_ui.png b/docs/misc/perfetto_ui.png new file mode 100755 index 0000000000000000000000000000000000000000..751eb22555b6ca4736c84a34c34ca855c99548ac GIT binary patch literal 132696 zcmbTe2Ut@}_b#rYph!`W9>9ViAkrap1r_NC2q;KzN)5e7qzO_4q#8g}1O#oXTCQq6yZ@GOCd{M<8{Oluchs$`z)t! z^Ep1hd{*el`6EIa*RIh$y3V5i{Oq+;r=DMeJ(1MrX^fB)&Y*I*5feLIZBhDbOiib} zww8axd!x7wzia(@v-EwDGclpa?|XpBKBmnd7cU!eO7-};e|<$Z?C+e!-yvh#s*8;c z&qZ8f-rwJK|MwHOoE}GYz`y99R(;N0*`e|8Uo)M+=ue6?xTGLdkDq3ANlp28<$O%{ z^3F$G^7{W;EMXLJ%0A(PC)2+Kd~*G~e`o2x8=q>=Q;YT>ZNU)oKAOK}NwO*{?NP4% zASxPhYUR4{Kh-?(KQDRX;E^Y-Q6au&mKMj)O=*15uW6NU7X*(s8q1wHcU=)lKln!< zF_FLPcr)*|eMjMH_5?Y7`1qR@IH6wk$(!cCpYH#!r}_4)NUvgShIt}|kL(&%xUi}6 z(H!V$D#o>p|M$bUF1v&ToQrrOup((Ra#M4(2)07sz1%?asgX={5?;@|PhTpswKP~c zL2e_I?{gU^?$V&gd<5k!O=#}iFEVl}p5|3Mo+LFWBtWU8vMKAgqR%7CHfADEozH3Y ziR{SN$(kDHb&4T>ddbp*eHgQ5@tL&>rBCHQNjijQna*GHkS7GY1T8k$^wp*6H{4Dk z;hZWopLG(X)GGo-ASH#v=a)Z6O6xwkj`_cJ^^G?@%fK(DlAGHqCROMF(aNTP7iKt1 z39~6uoO7A<8o4F2YYnE@D99!t*@MX}UJDbEGU>tS741v%%voL}`(IoMPJLhTLhk1E z%TDHlo1()0W0ec4TP$WXd|*IYWlWiW4?Z7jWj*SYYHLcLq>*YAjY&SK!O(01mHuM_ zHDU}^d3~`5>kl>Tt

_y!2 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 z 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

nmM^zU0sn!wIwqIsfSD5__fVc*$5F8h z?26FH1jR}V8~@tSvyv=|=h)DU){_&0BrTk;6&w4(-At-aNw3&OrhqY2-V)vI?L%ds z4Nmorx=dxg84(s*4S-+SIc|QbKii&qf!Jg-aJOMPEviMzysO=ZAA3{qSJ7RCGqrUx3Osw6IlnX=oKx5oRm|8hiKr|Vw zY_$nC0T)X|im0Qr+qnR*>B>?KP5hmjw*ES-w`O_RSIRdrDoW|H^iJp7Q)Nm3d^tTswwz|}$*T6nM-noic7 z1HPFgW#Qc^)4VVJv99`eZGL&sQw57~_mRCACvVvCBxy(EytVk+a930;PRsR3fY(d6 zr2GjCYP|!Vt>V|$Ee{Ya*KdwS$%*K_Y6r#LfdA_901@vFTjB4aG!*(SWPYX{E&oa^f2+?%Kd*Yxqqla!`3ct`GR2KT-y4hQu2oy{)Zp8+zI>N zs^%YS>Rj#X$mRT_DE_Za&Z-~2`(JDP9}DmwC}02ndqf70P^%Wrg*>_y3p3Ns$=ouY z`CTB!5njFb55BmhXz!Nu&lfYx6VZ*6LvK&ne1Pe__M3rR`YVN2-l&C=m z@QUP?84FDnV?$=oRfUV{n>Qp}8HDQH(w(p9`EOBal)H!O9Q)qKwLi7pgZdajQ*6{q zL3BQkjx9Cu`<&3Ck3SJ=4pfie8gyt_sGND@ntP9*c_Eq0zhQCj>h-F*AJt7iQlgW& zFx*V*9yTs>NO2$QsRAeI^?jw&9+Vx28=o)9j^Cg!UOC`1>XR_vl^(E3Mp*cwTk?cQ z#FbOFUoN4h;$i@-nymes0?q&X{_#*m@1a`8#4WmCeiW$0OSkjqk{8YE*=2JaolqrR zE#c};Qa=hlP_e6J-K1&$YnH;7ev=ax2EF9mYX$y1q`FP6a^cz>{nd4hwtBgLWNJX< z3TUJa;AJ19#R7kf1)lC7S41$?D{!X3841$Mn z?ft>LTm&lZs?eM{3Odm(TpygTSq5nlnlQ)zEN*lI26%a@N#&E9wkf<;!MNrw7J=LK0ljS|kIz5l@;hiFE zR>%A)pDjE(S~PF!zScrpa8rl(py}0lGq;ktBpbII@X`Gp&w02q{AL!EZHc9%p$<25 zP}%WYG~#ISFd1&k?0p|Cd+rf3J(uK@vfU@Ql)JZxjDb3tvXZYXEl{cx*?cIUN%o;m@ zRQ!c1Q>?7J$B)KcyW@E^gl116pUL5%iSW2xJ#=^3lI%lPSR9r_jK%LB6PwHi3~jOQ z#%?<72w@A!cX`Y~O+{-@}6onP6L{#0Xo|)5dab3*B@q0z<`Hs*<4W z&Am{0d357Dyh{1uh)C;CR}7EL(K3{p`nT>qS6lwbV6?RB)gd4VfZOiS!{BgrTZTq! zSjMhhXFaf`^xTQ_3`2$mt%7A9M|TZ~-YD{*F!w@-`Ix`o#%&>&Ej{4%mu{U)1E~YZ zo%S((3h}wg=*w^}>_&Oji>BM1w)x!f+oOwO6!$xo57_%O9^oM>(G`R`d*xIa7isCo zGAZeSqS|jSKmO9N=eSpZ=93ezM_VQF+fVw<$Qt(0E8-Rte`9sgW&Ok+6Njt@v)T!4 z+r|{vDZk+)SMr*o#H>);dl26j@O$LLwI|;-P`xcvAM?B7rUL=r{}Vu)8fu+c`soFw VMV>tP)3W&SqVi>>9K~yQ{~yiKS|9)b literal 0 HcmV?d00001 diff --git a/docs/overview/index.rst b/docs/overview/index.rst index 7058405d7..eef9b7af4 100644 --- a/docs/overview/index.rst +++ b/docs/overview/index.rst @@ -24,5 +24,6 @@ Overview anim timer draw + profiler renderers/index new_widget diff --git a/docs/overview/profiler.rst b/docs/overview/profiler.rst new file mode 100644 index 000000000..4f043d923 --- /dev/null +++ b/docs/overview/profiler.rst @@ -0,0 +1,202 @@ +.. _profiler: + +======== +Profiler +======== + +As the complexity of the application increases, performance issues such as low FPS and frequent cache misses +causing lag may arise. LVGL has internally set up some hooks for performance measurement to help developers +analyze and locate performance issues. + +Introduction +************ + +LVGL has a built-in trace system to track and record the timestamps of important events that occur during runtime, +such as rendering events and user input events. These event timestamps serve as important metrics for performance analysis. + +The trace system has a configurable record buffer that stores the names of event functions and their timestamps. +When the buffer is full, the trace system prints the log information through the provided user interface. + +The output trace logs are formatted according to Android's `systrace `_ +format and can be visualized using `Perfetto `_. + +Usage +***** + +Configure profiler +^^^^^^^^^^^^^^^^^^ + +To enable the profiler, set :c:macro:`LV_USE_PROFILER` in ``lv_conf.h`` and configure the following options: + +1. Enable the built-in profiler functionality by setting :c:macro:`LV_USE_PROFILER_BUILTIN`. + +2. Buffer configuration: Set the value of :c:macro:`LV_PROFILER_BUILTIN_BUF_SIZE` to configure the buffer size. A larger buffer can store more trace event information, reducing interference with rendering. However, it also results in higher memory consumption. + +3. Timestamp configuration: LVGL uses the :cpp:func:`lv_tick_get` function with a precision of 1ms by default to obtain timestamps when events occur. Therefore, it cannot accurately measure intervals below 1ms. If your system environment can provide higher precision (e.g., 1us), you can configure the profiler as follows: + +- Recommended configuration in **UNIX** environments: + + .. code:: c + + #include + + static uint32_t my_get_tick_us_cb(void) + { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + } + + void my_profiler_init(void) + { + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + config.tick_per_sec = 1000000; /* One second is equal to 1000000 microseconds */ + config.tick_get_cb = my_get_tick_us_cb; + lv_profiler_builtin_init(&config); + } + +- Recommended configuration in **Arduino** environments: + + .. code:: c + + void my_profiler_init(void) + { + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + config.tick_per_sec = 1000000; /* One second is equal to 1000000 microseconds */ + config.tick_get_cb = micros; /* Use the microsecond time stamp provided by Arduino */ + lv_profiler_builtin_init(&config); + } + +4. Log output configuration: LVGL uses the :cpp:func:`LV_LOG` interface by default to output trace information. If you want to use another interface to output log information (e.g., file stream), you can redirect the log output using the following code: + + .. code:: c + + static void my_log_print_cb(const char * buf) + { + printf("%s", buf); + } + + void my_profiler_init(void) + { + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + ... /* other configurations */ + config.flush_cb = my_log_print_cb; + lv_profiler_builtin_init(&config); + } + +Run the test scenario +^^^^^^^^^^^^^^^^^^^^^ + +Run the UI scenario that you want to measure, such as scrolling a scrollable page up and down or entering/exiting an application. + +Process the logs +^^^^^^^^^^^^^^^^ + +Save the output log as `my_trace.txt`, use `trace_filter.py` for filtering and preprocessing: + + .. code:: bash + + ./lvgl/scripts/trace_filter.py my_trace.txt + + or + + .. code:: bash + + python3 ./lvgl/scripts/trace_filter.py my_trace.txt + +You will obtain a processed text file named `trace.systrace`, which roughly contains the following content: + + .. code:: text + + # tracer: nop + # + LVGL-1 [0] 2892.002993: tracing_mark_write: B|1|lv_timer_handler + LVGL-1 [0] 2892.002993: tracing_mark_write: B|1|_lv_disp_refr_timer + LVGL-1 [0] 2892.003459: tracing_mark_write: B|1|refr_invalid_areas + LVGL-1 [0] 2892.003461: tracing_mark_write: B|1|lv_draw_rect + LVGL-1 [0] 2892.003550: tracing_mark_write: E|1|lv_draw_rect + LVGL-1 [0] 2892.003552: tracing_mark_write: B|1|lv_draw_rect + LVGL-1 [0] 2892.003556: tracing_mark_write: E|1|lv_draw_rect + LVGL-1 [0] 2892.003560: tracing_mark_write: B|1|lv_draw_rect + LVGL-1 [0] 2892.003573: tracing_mark_write: E|1|lv_draw_rect + ... + +Import the processed `trace.systrace` file into `Perfetto `_ and wait for it to be parsed. + +Performance analysis +^^^^^^^^^^^^^^^^^^^^ + +If the log parsing is successful, you will see the following screen: + +.. image:: /misc/perfetto_ui.png + +In the Perfetto UI, use the :kbd:`A` or :kbd:`D` keys to pan the timeline horizontally +and the :kbd:`W` or :kbd:`S` keys to zoom in or out on the timeline. +Use the mouse to move the focus and click on functions on the timeline to observe their execution time. + +Add Measurement Point +********************* + +Users can add their own measured functions: + +.. code:: c + + void my_function(void) + { + LV_PROFILER_BEGIN; + do_something(); + LV_PROFILER_END; + } + +Custom profiler implementation +****************************** + +If you wish to use a profiler method provided by your operating system, you can modify the following configurations in ``lv_conf.h``: + +- :c:macro:`LV_PROFILER_INCLUDE`: Provides a header file for the profiler function. +- :c:macro:`LV_PROFILER_BEGIN`: Profiler start point function. +- :c:macro:`LV_PROFILER_END`: Profiler end point function. + +Taking `NuttX `_ RTOS as an example: + +.. code:: c + + #define LV_PROFILER_INCLUDE "nuttx/sched_note.h" + #define LV_PROFILER_BEGIN sched_note_begin(NOTE_TAG_ALWAYS) + #define LV_PROFILER_END sched_note_end(NOTE_TAG_ALWAYS) + +FAQ +*** + +Perfetto log parsing fails +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Please check the completeness of the logs. If the logs are incomplete, it may be due to the following reasons: + +1. Serial port reception errors caused by a high baud rate. You need to reduce the baud rate. +2. Data corruption caused by other thread logs inserted during the printing of trace logs. You need to disable the log output of other threads or refer to the configuration above to use a separate log output interface. +3. Cross-thread calling of :c:macro:`LV_PROFILER_BEGIN/END`.The built-in LVGL profiler is designed for single-threaded use, so calling it from multiple threads can lead to thread safety issues. If you need to use it in a multi-threaded environment, you can use profiler interfaces provided by your operating system that ensure thread safety. + +Function execution time displayed as 0s in Perfetto +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If the function execution time is lower than the precision of the timestamps, this situation can occur. You can refer to the configuration instructions above to use a higher precision timestamp. + +Significant stuttering occurs during profiling +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When the buffer used to store trace events becomes full, the profiler will output all the data in the buffer, which can cause UI blocking and stuttering during the output. You can optimize this by taking the following measures: + +1. Increase the value of :c:macro:`LV_PROFILER_BUILTIN_BUF_SIZE`. A larger buffer can reduce the frequency of log printing, but it also consumes more memory. +2. Optimize the execution time of log printing functions, such as increasing the serial port baud rate or improving file writing speed. + +Trace logs are not being output +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If the trace logs are not automatically printed when the buffer is not full, you can try the following methods to force the log output: + +1. Reduce the value of :c:macro:`LV_PROFILER_BUILTIN_BUF_SIZE` to fill the buffer more quickly and trigger automatic printing. +2. Manually call or use a timer to call the :cpp:func:`lv_profiler_builtin_flush` function to force the log output. diff --git a/docs/porting/index.rst b/docs/porting/index.rst index e5ee69aaf..24db95fdb 100644 --- a/docs/porting/index.rst +++ b/docs/porting/index.rst @@ -16,5 +16,4 @@ Porting sleep os log - profiler draw diff --git a/docs/porting/profiler.rst b/docs/porting/profiler.rst deleted file mode 100644 index a02dedfae..000000000 --- a/docs/porting/profiler.rst +++ /dev/null @@ -1,42 +0,0 @@ -.. _profiler: - -======== -Profiler -======== - -As the complexity of the application increases, performance issues -such as low FPS and frequent cache misses causing lag may arise. -LVGL has internally set up some hooks for performance measurement -to help developers analyze and locate performance issues. - -Porting -******* - -To enable profiler, set :c:macro:`LV_USE_PROFILER` in ``lv_conf.h`` and configure the following options: - -- :c:macro:`LV_PROFILER_INCLUDE`: Provides a header file for the profiler function. -- :c:macro:`LV_PROFILER_BEGIN`: Profiler start point function. -- :c:macro:`LV_PROFILER_END`: Profiler end point function. - -Example -******* - -The following is an example of output performance measurements using LVGL logging systems: - -Configure ``lv_conf.h``: - -.. code:: c - - #define LV_USE_PROFILER 1 - #define LV_PROFILER_INCLUDE "lvgl/src/hal/lv_hal_tick.h" - #define LV_PROFILER_BEGIN uint32_t profiler_start = lv_tick_get() - #define LV_PROFILER_END LV_LOG_USER("cost %dms", (int)lv_tick_elaps(profiler_start)) - - -Users can add the measured functions themselves: - -.. code:: c - - LV_PROFILER_BEGIN; - my_func(); - LV_PROFILER_END; diff --git a/lv_conf_template.h b/lv_conf_template.h index 8675cc84c..b90ae30fe 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -703,14 +703,21 @@ /*1: Enable the runtime performance profiler*/ #define LV_USE_PROFILER 0 #if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + /*Header to include for the profiler*/ - #define LV_PROFILER_INCLUDE + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" /*Profiler start point function*/ - #define LV_PROFILER_BEGIN + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN /*Profiler end point function*/ - #define LV_PROFILER_END + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END #endif /*1: Enable Monkey test*/ diff --git a/lvgl.h b/lvgl.h index 248da58df..750ab4163 100644 --- a/lvgl.h +++ b/lvgl.h @@ -28,6 +28,7 @@ extern "C" { #include "src/misc/lv_async.h" #include "src/misc/lv_anim_timeline.h" #include "src/misc/lv_printf.h" +#include "src/misc/lv_profiler_builtin.h" #include "src/hal/lv_hal.h" diff --git a/scripts/trace_filter.py b/scripts/trace_filter.py new file mode 100755 index 000000000..5fbf51db4 --- /dev/null +++ b/scripts/trace_filter.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +import argparse +import re + +MARK_LIST = ['tracing_mark_write'] + + +def get_arg(): + parser = argparse.ArgumentParser(description='Filter a log file to a trace file.') + parser.add_argument('log_file', metavar='log_file', type=str, + help='The input log file to process.') + parser.add_argument('trace_file', metavar='trace_file', type=str, nargs='?', default='trace.systrace', + help='The output trace file. If not provided, defaults to \'trace.systrace\'.') + + args = parser.parse_args() + + print('log_file: ' + args.log_file) + print('trace_file: ' + args.trace_file) + + return args + + +if __name__ == '__main__': + args = get_arg() + + with open(args.log_file, 'r') as f: + content = f.read() + + # compile regex pattern + pattern = re.compile(r'(^.+-[0-9]+\s\[[0-9]]\s[0-9]+\.[0-9]+:\s(' + + "|".join(MARK_LIST) + + r'):\s[B|E]\|[0-9]+\|.+$)', re.M) + + matches = pattern.findall(content) + + # write to args.trace_file + with open(args.trace_file, 'w') as f: + f.write('# tracer: nop\n#\n') + for match in matches: + f.write(match[0] + '\n') diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 4f3ff3b79..ed482bc7a 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -124,6 +124,13 @@ void lv_init(void) #if LV_USE_BUILTIN_MALLOC lv_mem_init_builtin(); #endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_profiler_builtin_config_t profiler_config; + lv_profiler_builtin_config_init(&profiler_config); + lv_profiler_builtin_init(&profiler_config); +#endif + _lv_timer_core_init(); _lv_fs_init(); diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 9d8ac873e..fcec449ae 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -2355,12 +2355,35 @@ #endif #endif #if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #ifndef LV_USE_PROFILER_BUILTIN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_PROFILER_BUILTIN + #define LV_USE_PROFILER_BUILTIN CONFIG_LV_USE_PROFILER_BUILTIN + #else + #define LV_USE_PROFILER_BUILTIN 0 + #endif + #else + #define LV_USE_PROFILER_BUILTIN 1 + #endif + #endif + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #ifndef LV_PROFILER_BUILTIN_BUF_SIZE + #ifdef CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #define LV_PROFILER_BUILTIN_BUF_SIZE CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #else + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + #endif + #endif + /*Header to include for the profiler*/ #ifndef LV_PROFILER_INCLUDE #ifdef CONFIG_LV_PROFILER_INCLUDE #define LV_PROFILER_INCLUDE CONFIG_LV_PROFILER_INCLUDE #else - #define LV_PROFILER_INCLUDE + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" #endif #endif @@ -2369,7 +2392,7 @@ #ifdef CONFIG_LV_PROFILER_BEGIN #define LV_PROFILER_BEGIN CONFIG_LV_PROFILER_BEGIN #else - #define LV_PROFILER_BEGIN + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN #endif #endif @@ -2378,7 +2401,7 @@ #ifdef CONFIG_LV_PROFILER_END #define LV_PROFILER_END CONFIG_LV_PROFILER_END #else - #define LV_PROFILER_END + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END #endif #endif #endif diff --git a/src/misc/lv_profiler_builtin.c b/src/misc/lv_profiler_builtin.c new file mode 100644 index 000000000..904df16d9 --- /dev/null +++ b/src/misc/lv_profiler_builtin.c @@ -0,0 +1,168 @@ +/** + * @file lv_profiler_builtin.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin.h" +#include "../lvgl.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#define LV_PROFILER_STR_MAX_LEN 128 +#define LV_PROFILER_TICK_PER_SEC_MAX 1000000 + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief Structure representing a built-in profiler item in LVGL + */ +typedef struct { + char tag; /**< The tag of the profiler item */ + uint32_t tick; /**< The tick value of the profiler item */ + const char * func; /**< A pointer to the function associated with the profiler item */ +} lv_profiler_builtin_item_t; + +/** + * @brief Structure representing a context for the LVGL built-in profiler + */ +typedef struct { + lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */ + uint32_t item_num; /**< Number of profiler items in the array */ + uint32_t cur_index; /**< Index of the current profiler item */ + lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */ +} lv_profiler_builtin_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void default_flush_cb(const char * buf); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_profiler_builtin_ctx_t profiler_ctx = { 0 }; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + lv_memzero(config, sizeof(lv_profiler_builtin_config_t)); + config->buf_size = LV_PROFILER_BUILTIN_BUF_SIZE; + config->tick_per_sec = 1000; + config->tick_get_cb = lv_tick_get; + config->flush_cb = default_flush_cb; +} + +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + LV_ASSERT_NULL(config->tick_get_cb); + + uint32_t num = config->buf_size / sizeof(lv_profiler_builtin_item_t); + if(num == 0) { + LV_LOG_WARN("buf_size must > %d", (int)sizeof(lv_profiler_builtin_item_t)); + return; + } + + if(config->tick_per_sec == 0 || config->tick_per_sec > LV_PROFILER_TICK_PER_SEC_MAX) { + LV_LOG_WARN("tick_per_sec range must be between 1~%d", LV_PROFILER_TICK_PER_SEC_MAX); + return; + } + + /*Free the old item_arr memory*/ + if(profiler_ctx.item_arr != NULL) { + lv_profiler_builtin_uninit(); + } + + lv_memzero(&profiler_ctx, sizeof(profiler_ctx)); + profiler_ctx.item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t)); + LV_ASSERT_MALLOC(profiler_ctx.item_arr); + + if(profiler_ctx.item_arr == NULL) { + LV_LOG_ERROR("malloc failed for item_arr"); + return; + } + + profiler_ctx.item_num = num; + profiler_ctx.config = *config; + + LV_LOG_INFO("init OK, item_num = %d", (int)num); +} + +void lv_profiler_builtin_uninit(void) +{ + LV_ASSERT_NULL(profiler_ctx.item_arr); + lv_free(profiler_ctx.item_arr); + lv_memzero(&profiler_ctx, sizeof(profiler_ctx)); +} + +void lv_profiler_builtin_flush(void) +{ + LV_ASSERT_NULL(profiler_ctx.item_arr); + if(!profiler_ctx.config.flush_cb) { + LV_LOG_WARN("flush_cb is not registered"); + return; + } + + uint32_t cur = 0; + char buf[LV_PROFILER_STR_MAX_LEN]; + uint32_t tick_per_sec = profiler_ctx.config.tick_per_sec; + while(cur < profiler_ctx.cur_index) { + lv_profiler_builtin_item_t * item = &profiler_ctx.item_arr[cur++]; + uint32_t sec = item->tick / tick_per_sec; + uint32_t usec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec); + lv_snprintf(buf, sizeof(buf), + "LVGL-1 [0] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n", + sec, + usec, + item->tag, + item->func); + profiler_ctx.config.flush_cb(buf); + } +} + +void lv_profiler_builtin_write(const char * func, char tag) +{ + LV_ASSERT_NULL(profiler_ctx.item_arr); + LV_ASSERT_NULL(func); + if(profiler_ctx.cur_index >= profiler_ctx.item_num) { + lv_profiler_builtin_flush(); + profiler_ctx.cur_index = 0; + } + + lv_profiler_builtin_item_t * item = &profiler_ctx.item_arr[profiler_ctx.cur_index]; + item->func = func; + item->tag = tag; + item->tick = profiler_ctx.config.tick_get_cb(); + profiler_ctx.cur_index++; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void default_flush_cb(const char * buf) +{ + LV_LOG("%s", buf); +} + +#endif /*LV_USE_PROFILER_BUILTIN*/ diff --git a/src/misc/lv_profiler_builtin.h b/src/misc/lv_profiler_builtin.h new file mode 100644 index 000000000..cb7432525 --- /dev/null +++ b/src/misc/lv_profiler_builtin.h @@ -0,0 +1,89 @@ +/** + * @file lv_profiler_builtin.h.h + * + */ + +#ifndef LV_PROFILER_BUILTIN_H +#define LV_PROFILER_BUILTIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_PROFILER_BUILTIN_BEGIN lv_profiler_builtin_write(__func__, 'B') +#define LV_PROFILER_BUILTIN_END lv_profiler_builtin_write(__func__, 'E') + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief LVGL profiler built-in configuration structure + */ +typedef struct { + size_t buf_size; /**< The size of the buffer used for profiling data */ + uint32_t tick_per_sec; /**< The number of ticks per second */ + uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ + void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ +} lv_profiler_builtin_config_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the configuration of the built-in profiler + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config); + +/** + * @brief Initialize the built-in profiler with the given configuration + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config); + +/** + * @brief Uninitialize the built-in profiler + */ +void lv_profiler_builtin_uninit(void); + +/** + * @brief Flush the profiling data to the console + */ +void lv_profiler_builtin_flush(void); + +/** + * @brief Write the profiling data for a function with the given tag + * @param func Name of the function being profiled + * @param tag Tag to associate with the profiling data for the function + */ +void lv_profiler_builtin_write(const char * func, char tag); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_PROFILER_BUILTIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_BUILTIN_H*/