TI Utilities API
Log.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2022 Texas Instruments Incorporated - https://www.ti.com
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
280 /* Remove the include guard to allow this file to participate
281  * multiple times in the same compilation unit. This is a special
282  * build flow where multiple source files are included into the
283  * same compilation unit. When each source file is preprocessed,
284  * this header file will reset the preprocessor state such that
285  * the current file may re-define the Log macros as requested.
286  *
287  * #ifndef ti_utils_runtime_Log__include
288  * #define ti_utils_runtime_Log__include
289  */
290 
293 
294 /*
295  * ======== Log.h ========
296  * @brief Contains Log library APIs
297  */
298 #include <stdint.h>
299 
300 #include <ti/utils/runtime/ILogger.h>
301 
302 #if defined(__cplusplus)
303 extern "C" {
304 #endif
305 
306 /*
307  * ======== undef all working macros ========
308  * Remove working macros from preprocessor state
309  *
310  * When including multiple source files into one compilation unit,
311  * this removes the macros left over from a previous include of this
312  * file.
313  */
314 #if ti_utils_runtime_Log_USE_LTO || ti_utils_runtime_Log_USE_PPO
315 
316  #undef Log_MASK_INFO1
317  #undef Log_MASK_INFO2
318  #undef Log_MASK_INFO3
319  #undef Log_MASK_INFO4
320  #undef Log_MASK_INFO5
321  #undef Log_MASK_INFO6
322  #undef Log_MASK_WARN
323  #undef Log_MASK_ERROR
324  #undef Log_MASK
325  #undef _Log_event_B
326  #undef _Log_buf_B
327  #undef _Log_printf_B
328  #undef _Log_DECL_Write
329  #undef _Log_DECL_Write_A
330  #undef _Log_DECL_Write_B
331  #undef _Log_DECL_Handle
332  #undef _Log_DECL_Handle_A
333  #undef _Log_DECL_Handle_B
334  #undef _Log_DECL_Level
335  #undef _Log_DECL_Level_A
336  #undef _Log_DECL_Level_B
337  #undef _Log_DECL_buf
338  #undef _Log_DECL_buf_A
339  #undef _Log_DECL_buf_B
340  #undef _Log_DECL_Printf
341  #undef _Log_DECL_Printf_A
342  #undef _Log_DECL_Printf_B
343 
344  #undef _Log_ARGS
345  #undef _Log_ARGS_A
346  #undef _Log_ARGS_B
347  #undef _Log_ARGS0
348  #undef _Log_ARGS1
349  #undef _Log_ARGS2
350  #undef _Log_ARGS3
351  #undef _Log_ARGS4
352  #undef _Log_NUMARGS
353  #undef _Log_NUMARGS_A
354  #undef _Log_NUMARGS_B
355  #undef _Log_CONCAT2_A
356  #undef _Log_CONCAT2
357  #undef _Log__TOKEN2STRING_A
358  #undef _Log_TOKEN2STRING
359  #undef _Log_APPEND_META_TO_FORMAT
360  #undef _Log_FIRST_ARG
361  #undef _Log_PLACE_FORMAT_IN_SECTOR
362  #undef _Log_GUARD_MACRO
363 #endif
364 
365 /* these are always defined */
366 #undef ti_utils_runtime_Log_USE_LTO
367 #undef ti_utils_runtime_Log_USE_PPO
368 #undef Log_DECLARE_MODULE
369 #undef _Log_DECL_Module_Id_Name
370 #undef Log_EVENT_CONSTRUCT
371 #undef Log_event
372 #undef Log_buf
373 #undef Log_printf
374 
375 /*
376  * ======== ti_utils_runtime_Log_ENABLE_LTO ========
377  * Enable instrumentation using link-time optimization implementation
378  *
379  * Define this symbol to add instrumentation at compile time.
380  * It must be defined before including this header file.
381  */
382 #ifdef ti_utils_runtime_Log_ENABLE_LTO
383  #undef ti_utils_runtime_Log_ENABLE_LTO
384  #define ti_utils_runtime_Log_USE_LTO 1
385 #else
386  #define ti_utils_runtime_Log_USE_LTO 0
387 #endif
388 
389 /*
390  * ======== ti_utils_runtime_Log_ENABLE_PPO ========
391  * Enable instrumentation using preprocessor implementation
392  *
393  * Define this symbol to add instrumentation at compile time.
394  * It must be defined before including this header file.
395  */
396 #ifdef ti_utils_runtime_Log_ENABLE_PPO
397  #undef ti_utils_runtime_Log_ENABLE_PPO
398  #define ti_utils_runtime_Log_USE_PPO 1
399 #else
400  #define ti_utils_runtime_Log_USE_PPO 0
401 #endif
402 
403 /* cannot define both macros at the same time */
404 #if ti_utils_runtime_Log_USE_LTO && ti_utils_runtime_Log_USE_PPO
405  #error Cannot define both LTO and PPO at the same time.
406 #endif
407 
408 #if ti_utils_runtime_Log_USE_LTO || ti_utils_runtime_Log_USE_PPO
409 /*
410  * =============================
411  * ======== Log Enabled ========
412  * =============================
413  */
414 
417  #ifdef ti_utils_runtime_Log_ENABLE_ALL
418  #undef ti_utils_runtime_Log_ENABLE_ALL
419 
420  #define Log_MASK_INFO1 Log_INFO1
421  #define Log_MASK_INFO2 Log_INFO2
422  #define Log_MASK_INFO3 Log_INFO3
423  #define Log_MASK_INFO4 Log_INFO4
424  #define Log_MASK_INFO5 Log_INFO5
425  #define Log_MASK_INFO6 Log_INFO6
426  #define Log_MASK_WARN Log_WARN
427  #define Log_MASK_ERROR Log_ERROR
428 
429  #else
430 
431  #ifdef ti_utils_runtime_Log_ENABLE_INFO1
432  #undef ti_utils_runtime_Log_ENABLE_INFO1
433  #define Log_MASK_INFO1 Log_INFO1
434  #else
435  #define Log_MASK_INFO1 0
436  #endif
437 
438  #ifdef ti_utils_runtime_Log_ENABLE_INFO2
439  #undef ti_utils_runtime_Log_ENABLE_INFO2
440  #define Log_MASK_INFO2 Log_INFO2
441  #else
442  #define Log_MASK_INFO2 0
443  #endif
444 
445  #ifdef ti_utils_runtime_Log_ENABLE_INFO3
446  #undef ti_utils_runtime_Log_ENABLE_INFO3
447  #define Log_MASK_INFO3 Log_INFO3
448  #else
449  #define Log_MASK_INFO3 0
450  #endif
451 
452  #ifdef ti_utils_runtime_Log_ENABLE_INFO4
453  #undef ti_utils_runtime_Log_ENABLE_INFO4
454  #define Log_MASK_INFO4 Log_INFO4
455  #else
456  #define Log_MASK_INFO4 0
457  #endif
458 
459  #ifdef ti_utils_runtime_Log_ENABLE_INFO5
460  #undef ti_utils_runtime_Log_ENABLE_INFO5
461  #define Log_MASK_INFO5 Log_INFO5
462  #else
463  #define Log_MASK_INFO5 0
464  #endif
465 
466  #ifdef ti_utils_runtime_Log_ENABLE_INFO6
467  #undef ti_utils_runtime_Log_ENABLE_INFO6
468  #define Log_MASK_INFO6 Log_INFO6
469  #else
470  #define Log_MASK_INFO6 0
471  #endif
472 
473  #ifdef ti_utils_runtime_Log_ENABLE_WARN
474  #undef ti_utils_runtime_Log_ENABLE_WARN
475  #define Log_MASK_WARN Log_WARN
476  #else
477  #define Log_MASK_WARN 0
478  #endif
479 
480  #ifdef ti_utils_runtime_Log_ENABLE_ERROR
481  #undef ti_utils_runtime_Log_ENABLE_ERROR
482  #define Log_MASK_ERROR Log_ERROR
483  #else
484  #define Log_MASK_ERROR 0
485  #endif
486 
487  #endif /* ti_utils_runtime_Log_ENABLE_ALL */
488 
489  #define Log_MASK \
490  (Log_MASK_INFO1 | Log_MASK_INFO2 | Log_MASK_INFO3 | Log_MASK_INFO4 | Log_MASK_INFO5 | Log_MASK_INFO6 | \
491  Log_MASK_WARN | Log_MASK_ERROR)
492 
493  /* This macro protects against sideffects of the C preprocessor expansion
494  * of log statements. Each log API should be guarded by it.
495  * An article explaining this behavior can be found here:
496  * https://gcc.gnu.org/onlinedocs/cpp/Swallowing-the-Semicolon.html
497  */
498  #define _Log_GUARD_MACRO(x) \
499  do \
500  { \
501  x \
502  } while (0)
503 
504  /*
505  *
506  * ======== Log Private Macros ========
507  *
508  * The following macros are intended to be private to the log module and
509  * are not intended for use by the user. Private macros will start with _Log.
510  *
511  * In the case of multi level macros (macros that invoke other macros), a
512  * letter is appended at the end of the definition. With each level of nesting,
513  * the appended letter is incremented.
514  *
515  * For example: _Log_test --> _Log_test_A --> _Log_test_B
516  */
517  /* Extracts the first argument from __VA_ARGS__ */
518  #define _Log_FIRST_ARG(N, ...) N
519 
520  /* Routes a log call based on the number of arguments provided */
521  #define _Log_EVENT_ARGS(module, header, ...) \
522  _Log_EVENT_ARGS_A(module, header, _Log_NUMARGS(__VA_ARGS__), __VA_ARGS__)
523  #define _Log_EVENT_ARGS_A(module, header, num, ...) _Log_EVENT_ARGS_B(module, header, num, __VA_ARGS__)
524  #define _Log_EVENT_ARGS_B(module, header, num, ...) _Log_EVENT_ARGS##num(module, uintptr_t, header, __VA_ARGS__)
525 
526  /* Helper macros to fill out dummy parameters if they're unused */
527  #define _Log_EVENT_ARGS0(module, type, header, event) \
528  (uint32_t) header, (uintptr_t)module##_##event, (type)0, (type)0, (type)0, (type)0
529 
530  #define _Log_EVENT_ARGS1(module, type, header, event, a1) \
531  (uint32_t) header, (uintptr_t)module##_##event, (type)a1, (type)0, (type)0, (type)0
532 
533  #define _Log_EVENT_ARGS2(module, type, header, event, a1, a2) \
534  (uint32_t) header, (uintptr_t)module##_##event, (type)a1, (type)a2, (type)0, (type)0
535 
536  #define _Log_EVENT_ARGS3(module, type, header, event, a1, a2, a3) \
537  ((uint32_t)header, (uintptr_t)module##_##event, (type)a1, (type)a2, (type)a3, (type)0)
538 
539  #define _Log_EVENT_ARGS4(module, type, header, event, a1, a2, a3, a4) \
540  (uint32_t) header, (uintptr_t)module##_##event, (type)a1, (type)a2, (type)a3, (type)a4
541 
542  /* Helper macro to count the number of arguments in __VA_ARGS_ */
543  #define _Log_NUMARGS(...) _Log_NUMARGS_A(__VA_ARGS__, 4, 3, 2, 1, 0)
544  #define _Log_NUMARGS_A(...) _Log_NUMARGS_B(__VA_ARGS__)
545  #define _Log_NUMARGS_B(_first, _4, _3, _2, _1, N, ...) N
546 
547  /*
548  * ======== Meta string tokenization macros ========
549  */
550  /* Helper macro to concatenate two symbols */
551  #define _Log_CONCAT2_A(x, y) x##_##y
552  #define _Log_CONCAT2(x, y) _Log_CONCAT2_A(x, y)
553 
554  /* Helper macro to concatenate two symbols */
555  #define _Log__TOKEN2STRING_A(x) #x
556  #define _Log_TOKEN2STRING(x) _Log__TOKEN2STRING_A(x)
557 
558  /* Macro to place meta string in a memory section separated by record separator */
559  #define _Log_APPEND_META_TO_FORMAT(opcode, file, line, level, module, format, nargs) \
560  _Log_TOKEN2STRING(opcode) "\x1e" _Log_TOKEN2STRING(file) "\x1e" _Log_TOKEN2STRING(line) "\x1e" _Log_TOKEN2STRING( \
561  level) "\x1e" _Log_TOKEN2STRING(module) "\x1e" _Log_TOKEN2STRING(format) "\x1e" _Log_TOKEN2STRING(nargs)
562 
563  /* Place a string in trace format section named ".log_data"
564  * This section must exist in the linker file
565  */
566  #if defined(__IAR_SYSTEMS_ICC__)
567  #define _Log_PLACE_FORMAT_IN_SECTOR(name, opcode, level, module, format, nargs) \
568  #pragma location = ".log_data" __root static const char \
569  name[] = _Log_APPEND_META_TO_FORMAT(opcode, __FILE__, __LINE__, level, module, format, nargs);
570  #elif defined(__TI_COMPILER_VERSION__) || (defined(__clang__) && defined(__ti_version__)) || defined(__GNUC__)
571  #define _Log_PLACE_FORMAT_IN_SECTOR(name, opcode, level, module, format, nargs) \
572  static const char name[] \
573  __attribute__((used, section(".log_data"))) = _Log_APPEND_META_TO_FORMAT(opcode, \
574  __FILE__, \
575  __LINE__, \
576  level, \
577  module, \
578  format, \
579  nargs);
580  #else
581  #error Incompatible compiler: Logging is currently supported by the following \
582 compilers: TI ARM Compiler, TI CLANG Compiler, GCC, IAR. Please migrate to a \
583 a supported compiler.
584  #endif
585 
603  #define Log_DECLARE_MODULE(module) \
604  _Log_DECL_Write(module); \
605  _Log_DECL_Printf(module); \
606  _Log_DECL_buf(module); \
607  _Log_DECL_Handle(module); \
608  _Log_DECL_Level(module);
609 
611  #define _Log_DECL_Write(module) _Log_DECL_Write_A(module)
612  #define _Log_DECL_Write_A(module) _Log_DECL_Write_B(module)
613  #define _Log_DECL_Write_B(module) \
614  extern void module##_LogSite_event(ILogger_Handle logger, \
615  uint32_t header, \
616  uintptr_t event, \
617  uintptr_t arg0, \
618  uintptr_t arg1, \
619  uintptr_t arg2, \
620  uintptr_t arg3)
621 
622  #define _Log_DECL_Printf(module) _Log_DECL_Printf_A(module)
623  #define _Log_DECL_Printf_A(module) _Log_DECL_Printf_B(module)
624  #define _Log_DECL_Printf_B(module) \
625  extern void module##_LogSite_printf(ILogger_Handle handle, uint32_t header, uint32_t numArgs, ...)
626 
627  #define _Log_DECL_buf(module) _Log_DECL_buf_A(module)
628  #define _Log_DECL_buf_A(module) _Log_DECL_buf_B(module)
629  #define _Log_DECL_buf_B(module) \
630  extern void module##_LogSite_buf(ILogger_Handle handle, \
631  uint32_t header, \
632  const char *format, \
633  uint8_t *data, \
634  size_t size)
635 
636  #define _Log_DECL_Handle(module) _Log_DECL_Handle_A(module)
637  #define _Log_DECL_Handle_A(module) _Log_DECL_Handle_B(module)
638  #define _Log_DECL_Handle_B(module) extern const ILogger_Handle module##_LogSite_handle
639 
640  #define _Log_DECL_Level(module) _Log_DECL_Level_A(module)
641  #define _Log_DECL_Level_A(module) _Log_DECL_Level_B(module)
642  #define _Log_DECL_Level_B(module) extern const uint32_t module##_LogSite_level
643 
644  #if ti_utils_runtime_Log_USE_LTO
645 
646  #define _Log_event_B(module, level, ...) \
647  if ((level)&module##_LogSite_level) \
648  { \
649  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
650  LOG_OPCODE_EVENT, \
651  level, \
652  module, \
653  _Log_FIRST_ARG(__VA_ARGS__), \
654  _Log_NUMARGS(__VA_ARGS__)) \
655  module##_LogSite_event(module##_LogSite_handle, \
656  _Log_EVENT_ARGS(module, &_Log_CONCAT2(LogSymbol, __LINE__), __VA_ARGS__)); \
657  }
658 
659  #endif
660 
661  #if ti_utils_runtime_Log_USE_PPO
662 
663  #define _Log_event_B(module, level, ...) \
664  if ((level) & (Log_MASK)) \
665  { \
666  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
667  LOG_OPCODE_EVENT, \
668  level, \
669  module, \
670  _Log_FIRST_ARG(__VA_ARGS__), \
671  _Log_NUMARGS(__VA_ARGS__)) \
672  module##_LogSite_event(module##_LogSite_handle, \
673  _Log_EVENT_ARGS(module, &_Log_CONCAT2(LogSymbol, __LINE__), __VA_ARGS__)); \
674  }
675 
676  #endif
677 
678  #if ti_utils_runtime_Log_USE_LTO
679 
680  #define _Log_buf_B(module, level, format, data, size) \
681  if ((level)&module##_LogSite_level) \
682  { \
683  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
684  LOG_OPCODE_BUFFER, \
685  level, \
686  module, \
687  format, \
688  0) module##_LogSite_buf(module##_LogSite_handle, \
689  (uint32_t)&_Log_CONCAT2(LogSymbol, __LINE__), \
690  format, \
691  data, \
692  size); \
693  }
694 
695  #endif
696 
697  #if ti_utils_runtime_Log_USE_PPO
698 
699  #define _Log_buf_B(module, level, format, data, size) \
700  if ((level) & (Log_MASK)) \
701  { \
702  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
703  LOG_OPCODE_BUFFER, \
704  level, \
705  module, \
706  format, \
707  0) module##_LogSite_buf(module##_LogSite_handle, \
708  (uint32_t)&_Log_CONCAT2(LogSymbol, __LINE__), \
709  format, \
710  data, \
711  size); \
712  }
713 
714  #endif
715 
716  #if ti_utils_runtime_Log_USE_LTO
717 
718  #define _Log_printf_B(module, level, ...) \
719  if ((level)&module##_LogSite_level) \
720  { \
721  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
722  LOG_OPCODE_FORMATED_TEXT, \
723  level, \
724  module, \
725  _Log_FIRST_ARG(__VA_ARGS__), \
726  _Log_NUMARGS(__VA_ARGS__)) \
727  module##_LogSite_printf(module##_LogSite_handle, \
728  (uint32_t)&_Log_CONCAT2(LogSymbol, __LINE__), \
729  _Log_NUMARGS(__VA_ARGS__), \
730  __VA_ARGS__); \
731  }
732 
733  #endif
734 
735  #if ti_utils_runtime_Log_USE_PPO
736 
737  #define _Log_printf_B(module, level, ...) \
738  if ((level) & (Log_MASK)) \
739  { \
740  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, __LINE__), \
741  LOG_OPCODE_FORMATED_TEXT, \
742  level, \
743  module, \
744  _Log_FIRST_ARG(__VA_ARGS__), \
745  _Log_NUMARGS(__VA_ARGS__)) \
746  module##_LogSite_printf(module##_LogSite_handle, \
747  (uint32_t)&_Log_CONCAT2(LogSymbol, __LINE__), \
748  _Log_NUMARGS(__VA_ARGS__), \
749  __VA_ARGS__); \
750  }
751 
752  #endif
753 
777  #define Log_event(module, level, ...) _Log_GUARD_MACRO(_Log_event_B(module, level, __VA_ARGS__))
778 
794  #define Log_EVENT_CONSTRUCT(module, name, fmt) \
795  _Log_PLACE_FORMAT_IN_SECTOR(_Log_CONCAT2(LogSymbol, name), LOG_EVENT_CONSTRUCT, name, module, fmt, 0) \
796  const char *_Log_CONCAT2(module, name) = _Log_CONCAT2(LogSymbol, name);
797 
812  #define Log_buf(module, level, format, data, size) _Log_GUARD_MACRO(_Log_buf_B(module, level, format, data, size))
813 
832  #define Log_printf(module, level, ...) _Log_GUARD_MACRO(_Log_printf_B(module, level, __VA_ARGS__))
833 
834 #else /* ti_utils_runtime_Log_USE_LTO || ti_utils_runtime_Log_USE_PPO */
835 
836  /*
837  * =================================================
838  * ======== Log Disabled (default behavior) ========
839  * =================================================
840  */
841  #define _Log_DECL_Config()
842  #define _Log_DECL_Module_Id_Name(module)
843  #define Log_EVENT_CONSTRUCT(name, type, fmt)
844  #define Log_event(level, ...)
845 
846 #endif /* ti_utils_runtime_Log_USE_LTO || ti_utils_runtime_Log_USE_PPO */
847 
848 /*
849  * ======== Log_FIRST ========
850  * Mark the first passage through this file
851  *
852  * This macro is not needed in the typical use-case. However,
853  * when including multiple source files into one compilation
854  * unit, where each source file includes Log.h, this macro is
855  * needed to mark that the first pass has been completed. This
856  * will guard the type definitions on subsequent passes, to
857  * avoid the multiple definition errors raised by the compiler.
858  */
859 #ifndef Log_FIRST
860 
861  #define Log_FIRST
862 
864 /*
865  * ======== Log_Level ========
866  */
867 typedef enum Log_Level
868 {
873  Log_INFO5 = 16,
874  Log_INFO6 = 32,
875  Log_WARN = 64,
876  Log_ERROR = 128
877 } Log_Level;
878 
879 /*
880  * ======== LogMain ========
881  * Courtesy declarations on behalf of LogMain
882  */
884 extern const uint32_t ti_utils_runtime_LogMain_LogSite_level;
885 extern const ILogger_Handle ti_utils_runtime_LogMain_LogSite_handle;
886 extern void ti_utils_runtime_LogMain_LogSite_event(ILogger_Handle,
887  uint32_t header,
888  uintptr_t event,
889  uintptr_t,
890  uintptr_t,
891  uintptr_t,
892  uintptr_t);
893 extern void ti_utils_runtime_LogMain_LogSite_printf(ILogger_Handle handle, uint32_t header, uint32_t numArgs, ...);
894 extern void ti_utils_runtime_LogMain_LogSite_buf(ILogger_Handle handle,
895  uint32_t header,
896  const char *format,
897  uint8_t *data,
898  size_t size);
900 #endif /* Log_FIRST */
901 
903 #if defined(__cplusplus)
904 }
905 #endif
906 
907 /* Remove include guard.
908  *
909  * #endif ti_utils_runtime_Log__include
910  */
Definition: Log.h:870
Definition: Log.h:875
Definition: Log.h:872
Definition: Log.h:876
Log_Level
Definition: Log.h:867
Definition: Log.h:871
Definition: Log.h:874
Definition: Log.h:873
Definition: Log.h:869
© Copyright 1995-2022, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale