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