Просмотр исходного кода

add sem/mutex/event/mailbox/queue support.|添加 信号量/互斥量/事件/邮箱/队列 支持。

guozhanxin 7 лет назад
Родитель
Сommit
301101afa4

+ 15 - 13
SystemView_Description/SYSVIEW_RTThread.txt → SystemView_Description/SYSVIEW_RT-Thread.txt

@@ -15,8 +15,9 @@ TaskState 0xFC 0=Ready, 8=Wait for event, 16=Wait for sema zero, 24=Waiting, 32=
 # API Functions
 #
 35        OS_CheckTimer             pGlobal=%p
-42        OS_Delay                  Delay=%u
-43        OS_DelayUntil             Time=%u
+41        sem_trytake               Try Take Sem=%s
+42        sem_take                  Taken Sem=%s
+43        sem_release               Release Sem=%s
 44        OS_SetPriority            Task=%t Pri=%u
 45        OS_WakeTask               Task=%t
 46        OS_CreateTask             Task=%t Pri=%u Stack=%p Size=%u
@@ -24,30 +25,31 @@ TaskState 0xFC 0=Ready, 8=Wait for event, 16=Wait for sema zero, 24=Waiting, 32=
 48        OS_Suspend                Task=%t
 49        OS_Resume                 Task=%t
 50        OS_CreateTaskEx           Task=%t Pri=%u Stack=%p Size=%u Context=%p
-51        OS_Yield
-52        OS_WaitEvent              EventMask=%b                                | Returns %b
-53        OS_WaitEventTimed         EventMask=%b Timeout=%u                     | Returns %b
+51        mutex_trytake             Try Take Lock=%s
+52        mutex_take                Taken Lock=%s
+53        mutex_release             Release Lock=%s
 54        OS_SignalEvent            Task=%t EventMask=%b
 55        OS_ClearEvents            Task=%t                                     | Returns %b
-62        OS_CreateMB               MB=%p MsgSize=%u Max=%u Addr=%p
-63        OS_ClearMB                MB=%p
+61        event_tryrecv             Try Recv Event=%s
+62        event_recv                Recved Event=%s
+63        event_send                Send Event=%s Event=%p
 64        OS_DeleteMB               MB=%p
 65        OS_PutMail                MB=%p Mail=%p
 66        OS_GetMail                MB=%p Dest=%p
 67        OS_PutMailCond            MB=%p Mail=%p                               | Returns %u
 68        OS_GetMailCond            MB=%p Dest=%p                               | Returns %u
 70        OS_GetMailTimed           MB=%p Dest=%p Timeout=%u                    | Returns %u
-71        OS_WaitMail               MB=%p
-72        OS_PutMail1               MB=%p Data=%u
-73        OS_GetMail1               MB=%p Dest=%p
+71        mailbox_tryrecv           Try Recv Mail from Box=%s
+72        mailbox_recv              Recved Mail from Box=%s
+73        mailbox_send              Send Mail to Box=%s
 74        OS_PutMailCond1           MB=%p Data=%u                               | Returns %u
 75        OS_GetMailCond1           MB=%p Data=%p                               | Returns %u
 78        OS_PutMailFront           MB=%p Mail=%p
 79        OS_PutMailFront1          MB=%p Data=%u
 80        OS_PutMailFrontCond       MB=%p Mail=%p                               | Returns %u
-81        OS_PutMailFrontCond1      MB=%p Data=%c                               | Returns %u
-82        OS_CreateRSema            Sema=%p
-83        OS_Use                    Sema=%I                                     | Returns %u
+81        msgq_tryrecv              Try Recv Msg from Queue=%s
+82        msgq_recv                 Recved Msg from Queue=%s
+83        msgq_send                 Send Msg to Queue=%s
 84        OS_Unuse                  Sema=%I
 85        OS_Request                Sema=%p                                     | Returns %u
 86        OS_GetSemaValue           Sema=%p                                     | Returns %u

+ 84 - 3
SystemView_Src/Config/SEGGER_SYSVIEW_RTThread.c

@@ -52,8 +52,8 @@ Revision: $Rev: 3745 $
 #include "SEGGER_SYSVIEW.h"
 #include "SEGGER_RTT.h"
 
-#ifndef RT_USING_HOOK
-#error "SystemView is only works when feature RT_USING_HOOK is enable."
+#ifndef PKG_USING_SYSTEMVIEW
+#error "SystemView is only works when feature PKG_USING_SYSTEMVIEW is enable."
 #endif
 static rt_thread_t tidle;
 
@@ -167,6 +167,84 @@ static void _cb_object_detach(struct rt_object* object)
     }
 }
 
+void SEGGER_SYSVIEW_RecordObjectName(unsigned EventID, struct rt_object *object) 
+{
+	U8  aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32];
+	U8* pPayload;
+
+	pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket);				  		// Prepare the packet for SystemView
+	pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, object->name, RT_NAME_MAX);	// Add object name
+
+	SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID);			  	// Send the packet
+}
+
+static void _cb_object_trytake(struct rt_object *object)
+{
+    switch (object->type & (~RT_Object_Class_Static))
+    {
+    case RT_Object_Class_Semaphore:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_SEM_TRYTAKE, object);
+        break;
+    case RT_Object_Class_Mutex:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MUTEX_TRYTAKE, object);
+        break;
+    case RT_Object_Class_Event:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_EVENT_TRYTAKE, object);
+        break;
+    case RT_Object_Class_MailBox:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MAILBOX_TRYTAKE, object);
+        break;
+    case RT_Object_Class_MessageQueue:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_QUEUE_TRYTAKE, object);
+        break;
+    }
+}
+
+
+static void _cb_object_take(struct rt_object *object)
+{
+    switch (object->type & (~RT_Object_Class_Static))
+    {
+    case RT_Object_Class_Semaphore:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_SEM_TAKEN, object);
+        break;
+    case RT_Object_Class_Mutex:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MUTEX_TAKEN, object);
+        break;
+    case RT_Object_Class_Event:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_EVENT_TAKEN, object);
+        break;
+    case RT_Object_Class_MailBox:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MAILBOX_TAKEN, object);
+        break;
+    case RT_Object_Class_MessageQueue:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_QUEUE_TAKEN, object);
+        break;
+    }
+}
+
+static void _cb_object_put(struct rt_object *object)
+{
+    switch (object->type & (~RT_Object_Class_Static))
+    {
+    case RT_Object_Class_Semaphore:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_SEM_RELEASE, object);
+        break;
+    case RT_Object_Class_Mutex:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MUTEX_RELEASE, object);
+        break;
+    case RT_Object_Class_Event:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_EVENT_RELEASE, object);
+        break;
+    case RT_Object_Class_MailBox:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_MAILBOX_RELEASE, object);
+        break;
+    case RT_Object_Class_MessageQueue:
+        SEGGER_SYSVIEW_RecordObjectName(RTT_TRACE_ID_QUEUE_RELEASE, object);
+        break;
+    }
+}
+
 // Services provided to SYSVIEW by RT-Thread
 const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
     _cbGetTime, _cbSendTaskList,
@@ -182,7 +260,10 @@ static int rt_trace_init(void)
     // register hooks
     rt_object_attach_sethook(_cb_object_attach);
     rt_object_detach_sethook(_cb_object_detach);
-
+    rt_object_trytake_sethook(_cb_object_trytake);
+    rt_object_take_sethook(_cb_object_take);
+    rt_object_put_sethook(_cb_object_put);
+    
     rt_thread_suspend_sethook(_cb_thread_suspend);
     rt_thread_resume_sethook(_cb_thread_resume);
 

+ 26 - 0
SystemView_Src/SEGGER/SEGGER_RTT.h

@@ -245,6 +245,32 @@ int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...);
 #define RTT_CTRL_BG_BRIGHT_CYAN       ""
 #define RTT_CTRL_BG_BRIGHT_WHITE      ""
 
+#define RTT_TRACE_ID_OFFSET           (32u)
+
+#define RTT_TRACE_ID_SEM_BASE         (40u)
+#define RTT_TRACE_ID_SEM_TRYTAKE      ( 1u + RTT_TRACE_ID_SEM_BASE)
+#define RTT_TRACE_ID_SEM_TAKEN        ( 2u + RTT_TRACE_ID_SEM_BASE)
+#define RTT_TRACE_ID_SEM_RELEASE      ( 3u + RTT_TRACE_ID_SEM_BASE)
+
+#define RTT_TRACE_ID_MUTEX_BASE       (50u)
+#define RTT_TRACE_ID_MUTEX_TRYTAKE    ( 1u + RTT_TRACE_ID_MUTEX_BASE)
+#define RTT_TRACE_ID_MUTEX_TAKEN      ( 2u + RTT_TRACE_ID_MUTEX_BASE)
+#define RTT_TRACE_ID_MUTEX_RELEASE    ( 3u + RTT_TRACE_ID_MUTEX_BASE)
+
+#define RTT_TRACE_ID_EVENT_BASE       (60u)
+#define RTT_TRACE_ID_EVENT_TRYTAKE    ( 1u + RTT_TRACE_ID_EVENT_BASE)
+#define RTT_TRACE_ID_EVENT_TAKEN      ( 2u + RTT_TRACE_ID_EVENT_BASE)
+#define RTT_TRACE_ID_EVENT_RELEASE    ( 3u + RTT_TRACE_ID_EVENT_BASE)
+
+#define RTT_TRACE_ID_MAILBOX_BASE     (70u)
+#define RTT_TRACE_ID_MAILBOX_TRYTAKE  ( 1u + RTT_TRACE_ID_MAILBOX_BASE)
+#define RTT_TRACE_ID_MAILBOX_TAKEN    ( 2u + RTT_TRACE_ID_MAILBOX_BASE)
+#define RTT_TRACE_ID_MAILBOX_RELEASE  ( 3u + RTT_TRACE_ID_MAILBOX_BASE)
+
+#define RTT_TRACE_ID_QUEUE_BASE       (80u)
+#define RTT_TRACE_ID_QUEUE_TRYTAKE    ( 1u + RTT_TRACE_ID_QUEUE_BASE)
+#define RTT_TRACE_ID_QUEUE_TAKEN      ( 2u + RTT_TRACE_ID_QUEUE_BASE)
+#define RTT_TRACE_ID_QUEUE_RELEASE    ( 3u + RTT_TRACE_ID_QUEUE_BASE)
 
 #endif