1 #include "k_api.h"
2 #include "SEGGER_SYSVIEW.h"
3 #include "SEGGER_RTT.h"
4 #include <stdio.h>
5
6 #ifdef AOS_COMP_TRACE
7
SendTaskInfo(ktask_t * task)8 void SendTaskInfo(ktask_t *task)
9 {
10 SEGGER_SYSVIEW_TASKINFO TaskInfo;
11
12 memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code
13 TaskInfo.TaskID = (U32)task;
14 TaskInfo.sName = task->task_name;
15 TaskInfo.Prio = task->prio;
16 TaskInfo.StackBase = (U32)task->task_stack_base;
17 TaskInfo.StackSize = task->stack_size;
18 SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo);
19 }
20
SEGGER_SYSVIEW_RecordObject(unsigned EventID,blk_obj_t * object)21 void SEGGER_SYSVIEW_RecordObject(unsigned EventID, blk_obj_t *object)
22 {
23 U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32];
24 U8 *pPayload;
25
26 pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView
27 pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, object->name, SEGGER_SYSVIEW_MAX_STRING_LEN); // Add object name
28
29 SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID); // Send the packet
30 }
31
SEGGER_SYSVIEW_RecordObject_Name(unsigned EventID,const name_t * name)32 void SEGGER_SYSVIEW_RecordObject_Name(unsigned EventID, const name_t *name)
33 {
34 U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32];
35 U8 *pPayload;
36
37 pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView
38 pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, name, 128); // Add object name
39
40 SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID); // Send the packet
41 }
42
trace_task_start_ready(ktask_t * task)43 void trace_task_start_ready(ktask_t *task)
44 {
45 SEGGER_SYSVIEW_OnTaskStartReady((unsigned)task);
46 }
47
trace_task_stop_ready(ktask_t * task)48 void trace_task_stop_ready(ktask_t *task)
49 {
50 SEGGER_SYSVIEW_OnTaskStopReady((unsigned)task, 0);
51 }
52
trace_task_resume(ktask_t * task,ktask_t * task_resumed)53 void trace_task_resume(ktask_t *task, ktask_t *task_resumed)
54 {
55 // SEGGER_SYSVIEW_OnTaskStartReady((unsigned)task_resumed);
56 }
57
trace_task_suspend(ktask_t * task,ktask_t * task_suspended)58 void trace_task_suspend(ktask_t *task, ktask_t *task_suspended)
59 {
60 // SEGGER_SYSVIEW_OnTaskStopExec();
61 }
62
trace_task_create(ktask_t * task)63 void trace_task_create(ktask_t *task)
64 {
65 SEGGER_SYSVIEW_OnTaskCreate((unsigned)task);
66 SendTaskInfo(task);
67
68 SEGGER_SYSVIEW_OnTaskStartReady((unsigned)task);
69 }
70
trace_task_wait_abort(ktask_t * task,ktask_t * task_abort)71 void trace_task_wait_abort(ktask_t *task, ktask_t *task_abort)
72 {
73 SEGGER_SYSVIEW_OnTaskTerminate((unsigned)task_abort);
74 }
75
trace_task_switch(ktask_t * from,ktask_t * to)76 void trace_task_switch(ktask_t *from, ktask_t *to)
77 {
78 SEGGER_SYSVIEW_OnTaskStopReady((unsigned)from, 0);
79
80 SEGGER_SYSVIEW_OnTaskStartExec((unsigned)to);
81 }
82
trace_intrpt_task_switch(ktask_t * from,ktask_t * to)83 void trace_intrpt_task_switch(ktask_t *from, ktask_t *to)
84 {
85 SEGGER_SYSVIEW_RecordExitISRToScheduler();
86 trace_task_switch(from, to);
87 }
88
trace_intrpt_exit(void)89 void trace_intrpt_exit(void)
90 {
91 SEGGER_SYSVIEW_RecordExitISR();
92 }
93
trace_intrpt_enter(void)94 void trace_intrpt_enter(void)
95 {
96 SEGGER_SYSVIEW_RecordEnterISR();
97 }
98
trace_init(void)99 void trace_init(void)
100 {
101 SEGGER_SYSVIEW_Conf();
102 printf("_SEGGER_RTT:%p\n", &_SEGGER_RTT);
103 #ifdef TRACE_BY_UART
104 uart_port_init();
105 #endif
106 }
107
trace_sem_create(ktask_t * task,ksem_t * sem)108 void trace_sem_create(ktask_t *task, ksem_t *sem)
109 {
110 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_CREATE, &sem->blk_obj);
111 }
112
trace_sem_overflow(ktask_t * task,ksem_t * sem)113 void trace_sem_overflow(ktask_t *task, ksem_t *sem)
114 {
115 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_OVERFLOW, &sem->blk_obj);
116 }
117
trace_sem_cnt_increase(ktask_t * task,ksem_t * sem)118 void trace_sem_cnt_increase(ktask_t *task, ksem_t *sem)
119 {
120 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_CNT_INCREASE, &sem->blk_obj);
121 }
122
trace_sem_get_success(ktask_t * task,ksem_t * sem)123 void trace_sem_get_success(ktask_t *task, ksem_t *sem)
124 {
125 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_GET_SUCCESS, &sem->blk_obj);
126 }
127
trace_sem_get_blk(ktask_t * task,ksem_t * sem)128 void trace_sem_get_blk(ktask_t *task, ksem_t *sem)
129 {
130 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_GET_BLK, &sem->blk_obj);
131 }
132
trace_sem_task_wake(ktask_t * task,ktask_t * task_waked_up,ksem_t * sem,uint8_t opt_wake_all)133 void trace_sem_task_wake(ktask_t *task, ktask_t *task_waked_up, ksem_t *sem, uint8_t opt_wake_all)
134 {
135 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_TASK_WAKE, &sem->blk_obj);
136 }
137
trace_sem_del(ktask_t * task,ksem_t * sem)138 void trace_sem_del(ktask_t *task, ksem_t *sem)
139 {
140 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_SEM_DEL, &sem->blk_obj);
141 }
142
trace_sem_give(ksem_t * sem,uint8_t opt_wake_all)143 void trace_sem_give(ksem_t *sem, uint8_t opt_wake_all)
144 {
145 SEGGER_SYSVIEW_Record_StringU32(SYSVIEW_TRACE_ID_SEM_GIVE, sem->blk_obj.name, opt_wake_all);
146 }
147
trace_mutex_create(ktask_t * task,kmutex_t * mutex,const name_t * name)148 void trace_mutex_create(ktask_t *task, kmutex_t *mutex, const name_t *name)
149 {
150 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_CREATE, &mutex->blk_obj);
151 }
152
trace_mutex_release(ktask_t * task,ktask_t * task_release,uint8_t new_pri)153 void trace_mutex_release(ktask_t *task, ktask_t *task_release, uint8_t new_pri)
154 {
155 // SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_RELEASE, );
156 }
157
trace_mutex_get(ktask_t * task,kmutex_t * mutex,tick_t wait_option)158 void trace_mutex_get(ktask_t *task, kmutex_t *mutex, tick_t wait_option)
159 {
160 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_GET, &mutex->blk_obj);
161 }
162
trace_task_pri_inv(ktask_t * task,ktask_t * mtxtsk)163 void trace_task_pri_inv(ktask_t *task, ktask_t *mtxtsk)
164 {
165 // SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_TASK_PRI_INV, );
166 }
167
trace_mutex_get_blk(ktask_t * task,kmutex_t * mutex,tick_t wait_option)168 void trace_mutex_get_blk(ktask_t *task, kmutex_t *mutex, tick_t wait_option)
169 {
170 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_GET_BLK, &mutex->blk_obj);
171 }
172
trace_mutex_release_success(ktask_t * task,kmutex_t * mutex)173 void trace_mutex_release_success(ktask_t *task, kmutex_t *mutex)
174 {
175 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_RELEASE_SUCCESS, &mutex->blk_obj);
176 }
177
trace_mutex_task_wake(ktask_t * task,ktask_t * task_waked_up,kmutex_t * mutex)178 void trace_mutex_task_wake(ktask_t *task, ktask_t *task_waked_up, kmutex_t *mutex)
179 {
180 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_TASK_WAKE, &mutex->blk_obj);
181 }
182
trace_mutex_del(ktask_t * task,kmutex_t * mutex)183 void trace_mutex_del(ktask_t *task, kmutex_t *mutex)
184 {
185 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_MUTEX_DEL, &mutex->blk_obj);
186 }
187
trace_event_create(ktask_t * task,kevent_t * event,const name_t * name,uint32_t flags_init)188 void trace_event_create(ktask_t *task, kevent_t *event, const name_t *name, uint32_t flags_init)
189 {
190 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_EVENT_CREATE, &event->blk_obj);
191 }
192
trace_event_get(ktask_t * task,kevent_t * event)193 void trace_event_get(ktask_t *task, kevent_t *event)
194 {
195 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_EVENT_GET, &event->blk_obj);
196 }
197
trace_event_get_blk(ktask_t * task,kevent_t * event,tick_t wait_option)198 void trace_event_get_blk(ktask_t *task, kevent_t *event, tick_t wait_option)
199 {
200 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_EVENT_GET_BLK, &event->blk_obj);
201 }
202
trace_event_task_wake(ktask_t * task,ktask_t * task_waked_up,kevent_t * event)203 void trace_event_task_wake(ktask_t *task, ktask_t *task_waked_up, kevent_t *event)
204 {
205 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_EVENT_TASK_WAKE, &event->blk_obj);
206 }
207
trace_event_del(ktask_t * task,kevent_t * event)208 void trace_event_del(ktask_t *task, kevent_t *event)
209 {
210 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_EVENT_DEL, &event->blk_obj);
211 }
212
trace_buf_queue_create(ktask_t * task,kbuf_queue_t * buf_queue)213 void trace_buf_queue_create(ktask_t *task, kbuf_queue_t *buf_queue)
214 {
215 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_BUF_QUEUE_CREATE, &buf_queue->blk_obj);
216 }
217
trace_buf_queue_max(ktask_t * task,kbuf_queue_t * buf_queue,void * msg,size_t msg_size)218 void trace_buf_queue_max(ktask_t *task, kbuf_queue_t *buf_queue, void *msg, size_t msg_size)
219 {
220 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_BUF_QUEUE_MAX, &buf_queue->blk_obj);
221 }
222
trace_buf_queue_post(ktask_t * task,kbuf_queue_t * buf_queue,void * msg,size_t msg_size)223 void trace_buf_queue_post(ktask_t *task, kbuf_queue_t *buf_queue, void *msg, size_t msg_size)
224 {
225 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_BUF_QUEUE_POST, &buf_queue->blk_obj);
226 }
227
trace_buf_queue_task_wake(ktask_t * task,ktask_t * task_waked_up,kbuf_queue_t * buf_queue)228 void trace_buf_queue_task_wake(ktask_t *task, ktask_t *task_waked_up, kbuf_queue_t *buf_queue)
229 {
230 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_BUF_QUEUE_TASK_WAKE, &buf_queue->blk_obj);
231 }
232
trace_buf_queue_get_blk(ktask_t * task,kbuf_queue_t * buf_queue,tick_t wait_option)233 void trace_buf_queue_get_blk(ktask_t *task, kbuf_queue_t *buf_queue, tick_t wait_option)
234 {
235 SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_BUF_QUEUE_GET_BLK, &buf_queue->blk_obj);
236 }
237
trace_workqueue_init(ktask_t * task,kwork_t * work)238 void trace_workqueue_init(ktask_t *task, kwork_t *work)
239 {
240 // SEGGER_SYSVIEW_RecordObject(SYSVIEW_TRACE_ID_WORKQUEUE_INIT, );
241 }
242
trace_workqueue_create(ktask_t * task,kworkqueue_t * workqueue)243 void trace_workqueue_create(ktask_t *task, kworkqueue_t *workqueue)
244 {
245 SEGGER_SYSVIEW_RecordObject_Name(SYSVIEW_TRACE_ID_WORKQUEUE_CREATE, workqueue->name);
246 }
247
trace_workqueue_del(ktask_t * task,kworkqueue_t * workqueue)248 void trace_workqueue_del(ktask_t *task, kworkqueue_t *workqueue)
249 {
250 SEGGER_SYSVIEW_RecordObject_Name(SYSVIEW_TRACE_ID_WORKQUEUE_DEL, workqueue->name);
251 }
252
253 #endif