trace-systemview  3.1.0
trace-systemview
LLTRACE_sysview.c
Go to the documentation of this file.
1 /*
2  * C
3  *
4  * Copyright 2017-2022 MicroEJ Corp. All rights reserved.
5  * Use of this source code is governed by a BSD-style license that can be found with this software.
6  */
7 
16 /* Includes ------------------------------------------------------------------*/
17 
18 #include <LLTRACE_impl.h>
19 #include <SEGGER_SYSVIEW.h>
20 #include <string.h>
21 #include <stdbool.h>
22 #include <stdio.h>
24 
25 
26 /* Defines -------------------------------------------------------------------*/
27 
28 SEGGER_SYSVIEW_MODULE LLTRACE_modules[MICROEJ_TRACE_MAX_NB_MODULES];
29 char* LLTRACE_module_names[MICROEJ_TRACE_MAX_NB_MODULES][MICROEJ_TRACE_MAX_MODULE_DESCRIPTION_LENGTH];
30 
35 bool LLTRACE_started = false;
36 
37 /* Private functions ---------------------------------------------------------*/
38 
39 /* Public functions ----------------------------------------------------------*/
40 
41 
42 void LLTRACE_IMPL_start() {
43  if(MICROEJ_TRACE_WAIT_FOR_SYSVIEW_CONNECTION){
44  if(SEGGER_SYSVIEW_isConnected() == 0){
45  printf("Wait for SystemView Application Connection...\n");
46  while(SEGGER_SYSVIEW_isConnected() == 0){
47  // wait
48  }
49  printf("SystemView Application Connected.\n");
50  }
51  }
52  LLTRACE_started = true;
53 }
54 
55 void LLTRACE_IMPL_stop() {
56 if(!MICROEJ_TRACE_OVER_RTOS){
57  SEGGER_SYSVIEW_Stop();
58 }
59  LLTRACE_started = false;
60 }
61 
62 bool LLTRACE_IMPL_is_started() {
63  return LLTRACE_started;
64 }
65 
66 int32_t LLTRACE_IMPL_declare_event_group(const char* group_name, int32_t nb_events) {
67  int32_t module_offset = LLTRACE_next_free_module_offset;
68  if(module_offset < MICROEJ_TRACE_MAX_NB_MODULES){
69  SEGGER_SYSVIEW_MODULE* module = &LLTRACE_modules[module_offset];
70  char* module_description = (char*)&LLTRACE_module_names[module_offset];
71 
72  // Increment pointer for the next group declaration
74 
75  // Initialize the module description: "M="+group_name
76  strcpy(module_description, MICROEJ_TRACE_MODULE_DESCRIPTION_PREFIX);
77  strncpy(&module_description[sizeof(MICROEJ_TRACE_MODULE_DESCRIPTION_PREFIX)-1], group_name, MICROEJ_TRACE_MAX_MODULE_DESCRIPTION_LENGTH-sizeof(MICROEJ_TRACE_MODULE_DESCRIPTION_PREFIX-1));
78  module_description[MICROEJ_TRACE_MAX_MODULE_DESCRIPTION_LENGTH-1] = '\0';
79  module->sModule = module_description;
80 
81  module->NumEvents = nb_events;
82  module->EventOffset = 0; //set by SystemView
83  module->pfSendModuleDesc = NULL;
84  module->pNext = NULL; // set by SystemView
85 
86  SEGGER_SYSVIEW_RegisterModule(module);
87  return (int32_t)module;
88  }
89  else {
90  // No free module description
91  return -1;
92  }
93 }
94 
95 void LLTRACE_IMPL_record_event_void(int32_t group_id, int32_t event_id) {
96  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
97  SEGGER_SYSVIEW_RecordVoid(module->EventOffset + event_id);
98 }
99 
100 void LLTRACE_IMPL_record_event_u32(int32_t group_id, int32_t event_id, uint32_t value0) {
101  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
102  SEGGER_SYSVIEW_RecordU32(module->EventOffset + event_id, value0);
103 }
104 
105 void LLTRACE_IMPL_record_event_u32x2(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2) {
106  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
107  SEGGER_SYSVIEW_RecordU32x2(module->EventOffset + event_id, value1, value2);
108 }
109 
110 void LLTRACE_IMPL_record_event_u32x3(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3) {
111  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
112  SEGGER_SYSVIEW_RecordU32x3(module->EventOffset + event_id, value1, value2, value3);
113 }
114 
115 void LLTRACE_IMPL_record_event_u32x4(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4) {
116  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
117  SEGGER_SYSVIEW_RecordU32x4(module->EventOffset + event_id, value1, value2, value3, value4);
118 }
119 
120 void LLTRACE_IMPL_record_event_u32x5(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5) {
121  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
122  SEGGER_SYSVIEW_RecordU32x5(module->EventOffset + event_id, value1, value2, value3, value4, value5);
123 }
124 
125 void LLTRACE_IMPL_record_event_u32x6(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5, uint32_t value6) {
126  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
127  SEGGER_SYSVIEW_RecordU32x6(module->EventOffset + event_id, value1, value2, value3, value4, value5, value6);
128 }
129 
130 void LLTRACE_IMPL_record_event_u32x7(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5, uint32_t value6, uint32_t value7) {
131  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
132  SEGGER_SYSVIEW_RecordU32x7(module->EventOffset + event_id, value1, value2, value3, value4, value5, value6, value7);
133 }
134 
135 void LLTRACE_IMPL_record_event_u32x8(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5, uint32_t value6, uint32_t value7, uint32_t value8) {
136  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
137  SEGGER_SYSVIEW_RecordU32x8(module->EventOffset + event_id, value1, value2, value3, value4, value5, value6, value7, value8);
138 }
139 
140 void LLTRACE_IMPL_record_event_u32x9(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5, uint32_t value6, uint32_t value7, uint32_t value8, uint32_t value9) {
141  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
142  SEGGER_SYSVIEW_RecordU32x9(module->EventOffset + event_id, value1, value2, value3, value4, value5, value6, value7, value8, value9);
143 }
144 
145 void LLTRACE_IMPL_record_event_u32x10(int32_t group_id, int32_t event_id, uint32_t value1, uint32_t value2, uint32_t value3, uint32_t value4, uint32_t value5, uint32_t value6, uint32_t value7, uint32_t value8, uint32_t value9, uint32_t value10){
146  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
147  SEGGER_SYSVIEW_RecordU32x10(module->EventOffset + event_id, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10);
148 }
149 
150 void LLTRACE_IMPL_record_event_end(int32_t group_id, int32_t event_id){
151  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
152  SEGGER_SYSVIEW_RecordEndCall(module->EventOffset + event_id);
153 }
154 
155 void LLTRACE_IMPL_record_event_end_u32(int32_t group_id, int32_t event_id, uint32_t value1){
156  SEGGER_SYSVIEW_MODULE* module = (SEGGER_SYSVIEW_MODULE*) group_id;
157  SEGGER_SYSVIEW_RecordEndCallU32(module->EventOffset + event_id, value1);
158 }
159 
int32_t LLTRACE_next_free_module_offset
MicroEJ Trace library low level API.