act_log_inner.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #ifndef __ACT_LOG_INNER_H
  2. #define __ACT_LOG_INNER_H
  3. #include <os_common_api.h>
  4. #include <logging/act_log.h>
  5. #include <sys/ring_buffer.h>
  6. #include <linker/linker-defs.h>
  7. #include "act_log_flash_buffer.h"
  8. #define ACTLOG_THREAD_STACK_SIZE (2048)
  9. typedef enum
  10. {
  11. ACTLOG_MSG_LOG = 1,
  12. ACTLOG_MSG_HEXDUMP,
  13. ACTLOG_MSG_NANO_LOG,
  14. ACTLOG_MAX_MSG_TYPE,
  15. } actlog_message_type_e;
  16. typedef struct {
  17. /** FIFO uses first word itself, reserve space */
  18. //intptr_t _unused;
  19. uint8_t id;
  20. uint8_t level:4;
  21. uint8_t type:4;
  22. uint16_t line_number;
  23. uint32_t timestamp;
  24. #ifdef CONFIG_ACTLOG_SHOW_FUNCTION
  25. const char *func_name;
  26. #endif
  27. uint32_t arg_num;
  28. }__packed log_message_head_t;
  29. typedef struct
  30. {
  31. uint8_t id;
  32. uint8_t level :4;
  33. uint8_t type :4;
  34. uint16_t line_number;
  35. uint32_t timestamp;
  36. #ifdef CONFIG_ACTLOG_SHOW_FUNCTION
  37. const char *func_name;
  38. #endif
  39. uint32_t str_len;
  40. char fmt_data[CONFIG_ACTLOG_FMT_DATA_SIZE + 1];
  41. } normal_log_message_t;
  42. typedef struct
  43. {
  44. uint8_t id;
  45. uint8_t level :4;
  46. uint8_t type :4;
  47. uint16_t line_number;
  48. uint32_t timestamp;
  49. #ifdef CONFIG_ACTLOG_SHOW_FUNCTION
  50. const char *func_name;
  51. #endif
  52. char data[CONFIG_ACTLOG_FMT_DATA_SIZE];
  53. uint16_t data_len;
  54. uint8_t data_width;
  55. uint8_t line_width;
  56. uint32_t disp_addr;
  57. } hexdump_log_message_t;
  58. typedef struct
  59. {
  60. uint8_t id;
  61. uint8_t level :4;
  62. uint8_t type :4;
  63. uint16_t line_number;
  64. uint32_t timestamp;
  65. #ifdef CONFIG_ACTLOG_SHOW_FUNCTION
  66. const char *func_name;
  67. #endif
  68. uint32_t arg_num;
  69. const char *fmt;
  70. uint32_t arg_value[MAX_NANO_ARG_NUM];
  71. } nano_log_message_t;
  72. typedef union
  73. {
  74. normal_log_message_t normal;
  75. hexdump_log_message_t hex;
  76. nano_log_message_t nano;
  77. } log_message_t;
  78. typedef struct
  79. {
  80. uint8_t id;
  81. uint8_t enable;
  82. uint8_t max_line_num;
  83. uint8_t line_num;
  84. uint16_t base_time;
  85. uint16_t limit_time;
  86. } act_log_num_filter_t;
  87. typedef struct
  88. {
  89. uint8_t init_flag :1;
  90. uint8_t task_ready :1;
  91. uint8_t timestamp_enable :1;
  92. uint8_t level :3;
  93. uint8_t panic :1;
  94. uint8_t module_cnt;
  95. uint8_t output_mode;
  96. uint32_t thread_id;
  97. uint32_t drop_cnt;
  98. uint32_t irq_cnt;
  99. uint32_t err_cnt;
  100. struct ring_buf rbuf;
  101. uint8_t cache_buffer[4096];
  102. os_sem log_sem;
  103. uint8_t *module_level;
  104. act_log_num_filter_t filter;
  105. } actlog_ctrl_t;
  106. extern actlog_ctrl_t actlog_ctrl;
  107. static inline uint32_t act_log_compress_const_data(uint32_t data_addr)
  108. {
  109. if (data_addr >= (uint32_t) __rom_region_start && data_addr <= (uint32_t) __rom_region_end) {
  110. return (data_addr - (uint32_t) __rom_region_start);
  111. } else {
  112. return 0;
  113. }
  114. }
  115. static inline uint32_t act_log_decompress_const_data(uint32_t data_addr)
  116. {
  117. if (data_addr != 0) {
  118. return (data_addr + (uint32_t) __rom_region_start);
  119. } else {
  120. return 0;
  121. }
  122. }
  123. static inline const char *actlog_source_name_get(uint8_t src_id)
  124. {
  125. return src_id < log_sources_count() ? log_name_get(src_id) : NULL;
  126. }
  127. static inline int actlog_module_num_get(void)
  128. {
  129. return log_sources_count();
  130. }
  131. static inline uint8_t actlog_compiled_level_get(uint8_t src_id)
  132. {
  133. return log_compiled_level_get(src_id);
  134. }
  135. static inline void actlog_dynamic_level_set(actlog_ctrl_t * ctrl, uint8_t src_id, uint8_t level)
  136. {
  137. uint8_t level_map = ctrl->module_level[src_id >> 1];
  138. if (src_id & 0x1) {
  139. level_map = (level_map & 0xf) | (level << 4);
  140. } else {
  141. level_map = (level_map & 0xf0) | level;
  142. }
  143. ctrl->module_level[src_id >> 1] = level_map;
  144. }
  145. static inline int actlog_dynamic_level_get(actlog_ctrl_t * ctrl, uint8_t src_id)
  146. {
  147. uint8_t level_map = ctrl->module_level[src_id >> 1];
  148. if (src_id & 0x1) {
  149. return (level_map >> 4);
  150. } else {
  151. return (level_map & 0xf);
  152. }
  153. }
  154. // memory api
  155. void *log_memory_alloc(uint32_t size);
  156. void log_memory_free(void *ptr);
  157. void log_memory_dump_info(uint32_t index);
  158. //output function
  159. int act_log_output_flow_init(void);
  160. int act_log_output_flow_write(log_message_t *log_msg, uint8_t *data, uint32_t len);
  161. int act_log_output_binary_init(void);
  162. int act_log_output_binary_write(log_message_t *log_msg, uint8_t *data, uint32_t len);
  163. int act_log_output_binary_get_used_size(int file_id);
  164. int act_log_output_binary_traverse(int file_id, int (*traverse_cb)(uint8_t *data, uint32_t max_len), uint8_t *buf,
  165. uint32_t len);
  166. int act_log_output_binary_flush(void);
  167. int act_log_output_binary_clear(int file_id);
  168. int act_log_output_textfile_init(void);
  169. int act_log_output_textfile_write(log_message_t *log_msg, uint8_t *data, uint32_t len);
  170. int act_log_output_textfile_get_used_size(int file_id);
  171. int act_log_output_textfile_traverse(int file_id, int (*traverse_cb)(uint8_t *data, uint32_t max_len), uint8_t *buf,
  172. uint32_t len);
  173. int act_log_output_textfile_flush(void);
  174. int act_log_output_textfile_clear(int file_id);
  175. //output backend
  176. int act_log_backend_init(void);
  177. int act_log_backend_register(uint8_t mode, actlog_backend_callback_t callback, void *user_data);
  178. int act_log_backend_unregister(uint8_t mode);
  179. int act_log_backend_output(log_message_t *log_msg, uint8_t *data, uint32_t len);
  180. int act_log_backend_get_used_size(int file_id);
  181. int act_log_backend_flush(void);
  182. int act_log_backend_traverse(int file_id, int (*traverse_cb)(uint8_t *data, uint32_t max_len), uint8_t *buf,
  183. uint32_t len);
  184. int act_log_backend_clear(int file_id);
  185. //actlog
  186. uint32_t process_log_linebuf(log_message_t *log_msg, char *log_buffer, uint32_t buffer_size);
  187. int act_log_is_const_ptr(const char *fmt);
  188. void log_test(void);
  189. #if IS_ENABLED(CONFIG_SIM_FLASH_ACTS)
  190. void check_save_log_to_flash(void);
  191. #endif
  192. int actlog_set_level_filter(const char *module_name, uint32_t dynamic_level);
  193. int actlog_set_module_num_filter(const char *module_name, uint8_t enable, uint8_t max_log_num, uint16_t limit_time);
  194. void actlog_dump_runtime_info(void);
  195. void actlog_print_buffer(const uint8_t *addr, int width, int count, int linelen, unsigned long disp_addr);
  196. size_t actlog_strnlen(const char *s, size_t maxlen);
  197. #endif