mirror of
https://gitee.com/dlmu-cone/tronone-h7-scaffold
synced 2026-07-24 03:27:45 +08:00
代码规范 prts文档
This commit is contained in:
@@ -0,0 +1,308 @@
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM0/port.c new/lib/FreeRTOS/portable/GCC/ARM_CM0/port.c
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM0/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM0/port.c 2017-12-11 01:11:45.061429000 -0800
|
||||
@@ -333,13 +333,19 @@ void xPortSysTickHandler( void )
|
||||
uint32_t ulPreviousMask;
|
||||
|
||||
ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* Pend a context switch. */
|
||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
||||
}
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM0/portmacro.h new/lib/FreeRTOS/portable/GCC/ARM_CM0/portmacro.h
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM0/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM0/portmacro.h 2017-12-11 01:10:27.732228000 -0800
|
||||
@@ -82,7 +82,7 @@ extern void vPortYield( void );
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
#define portYIELD() vPortYield()
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired ) { traceISR_EXIT_TO_SCHEDULER(); portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c new/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c 2017-12-11 01:14:50.515630000 -0800
|
||||
@@ -431,14 +431,20 @@ void xPortSysTickHandler( void )
|
||||
save and then restore the interrupt mask value as its value is already
|
||||
known. */
|
||||
portDISABLE_INTERRUPTS();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* A context switch is required. Context switching is performed in
|
||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h new/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h 2017-12-11 01:13:36.868029000 -0800
|
||||
@@ -90,7 +90,7 @@ typedef unsigned long UBaseType_t;
|
||||
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired != pdFALSE ) { traceISR_EXIT_TO_SCHEDULER(); portYIELD() } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c new/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c 2017-12-11 01:16:01.771230000 -0800
|
||||
@@ -493,14 +493,20 @@ void xPortSysTickHandler( void )
|
||||
save and then restore the interrupt mask value as its value is already
|
||||
known. */
|
||||
portDISABLE_INTERRUPTS();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* A context switch is required. Context switching is performed in
|
||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
diff -rupN org/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h new/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h
|
||||
--- org/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h 2017-12-11 01:15:16.546830000 -0800
|
||||
@@ -90,7 +90,7 @@ typedef unsigned long UBaseType_t;
|
||||
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired != pdFALSE ) { traceISR_EXIT_TO_SCHEDULER(); portYIELD(); } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/lib/FreeRTOS/tasks.c new/lib/FreeRTOS/tasks.c
|
||||
--- org/lib/FreeRTOS/tasks.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/FreeRTOS/tasks.c 2017-12-11 01:08:48.591428000 -0800
|
||||
@@ -237,6 +237,17 @@ count overflows. */
|
||||
taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
|
||||
vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
|
||||
tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
+
|
||||
+/*
|
||||
+ * Place the task represented by pxTCB which has been in a ready list before
|
||||
+ * into the appropriate ready list for the task.
|
||||
+ * It is inserted at the end of the list.
|
||||
+ */
|
||||
+#define prvReaddTaskToReadyList( pxTCB ) \
|
||||
+ traceREADDED_TASK_TO_READY_STATE( pxTCB ); \
|
||||
+ taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
|
||||
+ vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
|
||||
+ tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
@@ -1598,7 +1609,7 @@ static void prvAddNewTaskToReadyList( TC
|
||||
{
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
- prvAddTaskToReadyList( pxTCB );
|
||||
+ prvReaddTaskToReadyList( pxTCB );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1659,7 +1670,7 @@ static void prvAddNewTaskToReadyList( TC
|
||||
{
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
-
|
||||
+ traceMOVED_TASK_TO_SUSPENDED_LIST(pxTCB);
|
||||
vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) );
|
||||
|
||||
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||
@@ -3671,6 +3682,20 @@ static void prvCheckTasksWaitingTerminat
|
||||
#endif /* INCLUDE_uxTaskGetStackHighWaterMark */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
+#if (INCLUDE_pxTaskGetStackStart == 1)
|
||||
+ uint8_t* pxTaskGetStackStart( TaskHandle_t xTask)
|
||||
+ {
|
||||
+ TCB_t *pxTCB;
|
||||
+ UBaseType_t uxReturn;
|
||||
+ (void)uxReturn;
|
||||
+
|
||||
+ pxTCB = prvGetTCBFromHandle( xTask );
|
||||
+ return ( uint8_t * ) pxTCB->pxStack;
|
||||
+ }
|
||||
+
|
||||
+#endif /* INCLUDE_pxTaskGetStackStart */
|
||||
+/*-----------------------------------------------------------*/
|
||||
+
|
||||
#if ( INCLUDE_vTaskDelete == 1 )
|
||||
|
||||
static void prvDeleteTCB( TCB_t *pxTCB )
|
||||
@@ -3840,7 +3865,7 @@ TCB_t *pxTCB;
|
||||
|
||||
/* Inherit the priority before being moved into the new list. */
|
||||
pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;
|
||||
- prvAddTaskToReadyList( pxMutexHolderTCB );
|
||||
+ prvReaddTaskToReadyList( pxMutexHolderTCB );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3930,7 +3955,7 @@ TCB_t *pxTCB;
|
||||
any other purpose if this task is running, and it must be
|
||||
running to give back the mutex. */
|
||||
listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
||||
- prvAddTaskToReadyList( pxTCB );
|
||||
+ prvReaddTaskToReadyList( pxTCB );
|
||||
|
||||
/* Return true to indicate that a context switch is required.
|
||||
This is only actually required in the corner case whereby
|
||||
@@ -4940,6 +4965,7 @@ const TickType_t xConstTickCount = xTick
|
||||
/* Add the task to the suspended task list instead of a delayed task
|
||||
list to ensure it is not woken by a timing event. It will block
|
||||
indefinitely. */
|
||||
+ traceMOVED_TASK_TO_SUSPENDED_LIST(pxCurrentTCB);
|
||||
vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
@@ -4956,12 +4982,14 @@ const TickType_t xConstTickCount = xTick
|
||||
{
|
||||
/* Wake time has overflowed. Place this item in the overflow
|
||||
list. */
|
||||
+ traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();
|
||||
vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The wake time has not overflowed, so the current block list
|
||||
is used. */
|
||||
+ traceMOVED_TASK_TO_DELAYED_LIST();
|
||||
vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
|
||||
/* If the task entering the blocked state was placed at the
|
||||
@@ -4991,11 +5019,13 @@ const TickType_t xConstTickCount = xTick
|
||||
if( xTimeToWake < xConstTickCount )
|
||||
{
|
||||
/* Wake time has overflowed. Place this item in the overflow list. */
|
||||
+ traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();
|
||||
vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The wake time has not overflowed, so the current block list is used. */
|
||||
+ traceMOVED_TASK_TO_DELAYED_LIST();
|
||||
vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
|
||||
/* If the task entering the blocked state was placed at the head of the
|
||||
diff -rupN org/lib/include/FreeRTOS.h new/lib/include/FreeRTOS.h
|
||||
--- org/lib/include/FreeRTOS.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/include/FreeRTOS.h 2017-12-11 00:54:49.522222000 -0800
|
||||
@@ -157,6 +157,10 @@ extern "C" {
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||
#endif
|
||||
|
||||
+#ifndef INCLUDE_pxTaskGetStackStart
|
||||
+ #define INCLUDE_pxTaskGetStackStart 0
|
||||
+#endif
|
||||
+
|
||||
#ifndef INCLUDE_eTaskGetState
|
||||
#define INCLUDE_eTaskGetState 0
|
||||
#endif
|
||||
@@ -393,6 +397,23 @@ extern "C" {
|
||||
#define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
#endif
|
||||
|
||||
+#ifndef traceREADDED_TASK_TO_READY_STATE
|
||||
+ #define traceREADDED_TASK_TO_READY_STATE( pxTCB ) traceMOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_DELAYED_LIST
|
||||
+ #define traceMOVED_TASK_TO_DELAYED_LIST()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST
|
||||
+ #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_SUSPENDED_LIST
|
||||
+ #define traceMOVED_TASK_TO_SUSPENDED_LIST( pxTCB )
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
#ifndef traceQUEUE_CREATE
|
||||
#define traceQUEUE_CREATE( pxNewQueue )
|
||||
#endif
|
||||
@@ -637,6 +658,18 @@ extern "C" {
|
||||
#define traceTASK_NOTIFY_GIVE_FROM_ISR()
|
||||
#endif
|
||||
|
||||
+#ifndef traceISR_EXIT_TO_SCHEDULER
|
||||
+ #define traceISR_EXIT_TO_SCHEDULER()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceISR_EXIT
|
||||
+ #define traceISR_EXIT()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceISR_ENTER
|
||||
+ #define traceISR_ENTER()
|
||||
+#endif
|
||||
+
|
||||
#ifndef traceSTREAM_BUFFER_CREATE_FAILED
|
||||
#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
|
||||
#endif
|
||||
diff -rupN org/lib/include/task.h new/lib/include/task.h
|
||||
--- org/lib/include/task.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/lib/include/task.h 2017-12-11 00:56:29.783423000 -0800
|
||||
@@ -1422,6 +1422,25 @@ TaskHandle_t xTaskGetHandle( const char
|
||||
*/
|
||||
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||
|
||||
+/**
|
||||
+ * task.h
|
||||
+ * <PRE>uint8_t* pxTaskGetStackStart( TaskHandle_t xTask);</PRE>
|
||||
+ *
|
||||
+ * INCLUDE_pxTaskGetStackStart must be set to 1 in FreeRTOSConfig.h for
|
||||
+ * this function to be available.
|
||||
+ *
|
||||
+ * Returns the start of the stack associated with xTask. That is,
|
||||
+ * the highest stack memory address on architectures where the stack grows down
|
||||
+ * from high memory, and the lowest memory address on architectures where the
|
||||
+ * stack grows up from low memory.
|
||||
+ *
|
||||
+ * @param xTask Handle of the task associated with the stack returned.
|
||||
+ * Set xTask to NULL to return the stack of the calling task.
|
||||
+ *
|
||||
+ * @return A pointer to the start of the stack.
|
||||
+ */
|
||||
+uint8_t* pxTaskGetStackStart( TaskHandle_t xTask) PRIVILEGED_FUNCTION;
|
||||
+
|
||||
/* When using trace macros it is sometimes necessary to include task.h before
|
||||
FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined,
|
||||
so the following two prototypes will cause a compilation error. This can be
|
||||
@@ -0,0 +1,308 @@
|
||||
diff -rupN org/Source/include/FreeRTOS.h new/Source/include/FreeRTOS.h
|
||||
--- org/Source/include/FreeRTOS.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/include/FreeRTOS.h 2017-12-11 00:54:49.522222000 -0800
|
||||
@@ -157,6 +157,10 @@ extern "C" {
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||
#endif
|
||||
|
||||
+#ifndef INCLUDE_pxTaskGetStackStart
|
||||
+ #define INCLUDE_pxTaskGetStackStart 0
|
||||
+#endif
|
||||
+
|
||||
#ifndef INCLUDE_eTaskGetState
|
||||
#define INCLUDE_eTaskGetState 0
|
||||
#endif
|
||||
@@ -393,6 +397,23 @@ extern "C" {
|
||||
#define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
#endif
|
||||
|
||||
+#ifndef traceREADDED_TASK_TO_READY_STATE
|
||||
+ #define traceREADDED_TASK_TO_READY_STATE( pxTCB ) traceMOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_DELAYED_LIST
|
||||
+ #define traceMOVED_TASK_TO_DELAYED_LIST()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST
|
||||
+ #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceMOVED_TASK_TO_SUSPENDED_LIST
|
||||
+ #define traceMOVED_TASK_TO_SUSPENDED_LIST( pxTCB )
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
#ifndef traceQUEUE_CREATE
|
||||
#define traceQUEUE_CREATE( pxNewQueue )
|
||||
#endif
|
||||
@@ -637,6 +658,18 @@ extern "C" {
|
||||
#define traceTASK_NOTIFY_GIVE_FROM_ISR()
|
||||
#endif
|
||||
|
||||
+#ifndef traceISR_EXIT_TO_SCHEDULER
|
||||
+ #define traceISR_EXIT_TO_SCHEDULER()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceISR_EXIT
|
||||
+ #define traceISR_EXIT()
|
||||
+#endif
|
||||
+
|
||||
+#ifndef traceISR_ENTER
|
||||
+ #define traceISR_ENTER()
|
||||
+#endif
|
||||
+
|
||||
#ifndef traceSTREAM_BUFFER_CREATE_FAILED
|
||||
#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
|
||||
#endif
|
||||
diff -rupN org/Source/include/task.h new/Source/include/task.h
|
||||
--- org/Source/include/task.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/include/task.h 2017-12-11 00:56:29.783423000 -0800
|
||||
@@ -1422,6 +1422,25 @@ TaskHandle_t xTaskGetHandle( const char
|
||||
*/
|
||||
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||
|
||||
+/**
|
||||
+ * task.h
|
||||
+ * <PRE>uint8_t* pxTaskGetStackStart( TaskHandle_t xTask);</PRE>
|
||||
+ *
|
||||
+ * INCLUDE_pxTaskGetStackStart must be set to 1 in FreeRTOSConfig.h for
|
||||
+ * this function to be available.
|
||||
+ *
|
||||
+ * Returns the start of the stack associated with xTask. That is,
|
||||
+ * the highest stack memory address on architectures where the stack grows down
|
||||
+ * from high memory, and the lowest memory address on architectures where the
|
||||
+ * stack grows up from low memory.
|
||||
+ *
|
||||
+ * @param xTask Handle of the task associated with the stack returned.
|
||||
+ * Set xTask to NULL to return the stack of the calling task.
|
||||
+ *
|
||||
+ * @return A pointer to the start of the stack.
|
||||
+ */
|
||||
+uint8_t* pxTaskGetStackStart( TaskHandle_t xTask) PRIVILEGED_FUNCTION;
|
||||
+
|
||||
/* When using trace macros it is sometimes necessary to include task.h before
|
||||
FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined,
|
||||
so the following two prototypes will cause a compilation error. This can be
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM0/port.c new/Source/portable/GCC/ARM_CM0/port.c
|
||||
--- org/Source/portable/GCC/ARM_CM0/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM0/port.c 2017-12-11 01:11:45.061429000 -0800
|
||||
@@ -333,13 +333,19 @@ void xPortSysTickHandler( void )
|
||||
uint32_t ulPreviousMask;
|
||||
|
||||
ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* Pend a context switch. */
|
||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
||||
}
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM0/portmacro.h new/Source/portable/GCC/ARM_CM0/portmacro.h
|
||||
--- org/Source/portable/GCC/ARM_CM0/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM0/portmacro.h 2017-12-11 01:10:27.732228000 -0800
|
||||
@@ -82,7 +82,7 @@ extern void vPortYield( void );
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
#define portYIELD() vPortYield()
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired ) { traceISR_EXIT_TO_SCHEDULER(); portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM3/port.c new/Source/portable/GCC/ARM_CM3/port.c
|
||||
--- org/Source/portable/GCC/ARM_CM3/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM3/port.c 2017-12-11 01:14:50.515630000 -0800
|
||||
@@ -431,14 +431,20 @@ void xPortSysTickHandler( void )
|
||||
save and then restore the interrupt mask value as its value is already
|
||||
known. */
|
||||
portDISABLE_INTERRUPTS();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* A context switch is required. Context switching is performed in
|
||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM3/portmacro.h new/Source/portable/GCC/ARM_CM3/portmacro.h
|
||||
--- org/Source/portable/GCC/ARM_CM3/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM3/portmacro.h 2017-12-11 01:13:36.868029000 -0800
|
||||
@@ -90,7 +90,7 @@ typedef unsigned long UBaseType_t;
|
||||
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired != pdFALSE ) { traceISR_EXIT_TO_SCHEDULER(); portYIELD() } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM4F/port.c new/Source/portable/GCC/ARM_CM4F/port.c
|
||||
--- org/Source/portable/GCC/ARM_CM4F/port.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM4F/port.c 2017-12-11 01:16:01.771230000 -0800
|
||||
@@ -493,14 +493,20 @@ void xPortSysTickHandler( void )
|
||||
save and then restore the interrupt mask value as its value is already
|
||||
known. */
|
||||
portDISABLE_INTERRUPTS();
|
||||
+ traceISR_ENTER();
|
||||
{
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
+ traceISR_EXIT_TO_SCHEDULER();
|
||||
/* A context switch is required. Context switching is performed in
|
||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ traceISR_EXIT();
|
||||
+ }
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
diff -rupN org/Source/portable/GCC/ARM_CM4F/portmacro.h new/Source/portable/GCC/ARM_CM4F/portmacro.h
|
||||
--- org/Source/portable/GCC/ARM_CM4F/portmacro.h 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/portable/GCC/ARM_CM4F/portmacro.h 2017-12-11 01:15:16.546830000 -0800
|
||||
@@ -90,7 +90,7 @@ typedef unsigned long UBaseType_t;
|
||||
|
||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||
-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
|
||||
+#define portEND_SWITCHING_ISR( xSwitchRequired ) { if( xSwitchRequired != pdFALSE ) { traceISR_EXIT_TO_SCHEDULER(); portYIELD(); } else { traceISR_EXIT(); } }
|
||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
diff -rupN org/Source/tasks.c new/Source/tasks.c
|
||||
--- org/Source/tasks.c 2017-11-28 13:48:34.000000000 -0800
|
||||
+++ new/Source/tasks.c 2017-12-11 01:08:48.591428000 -0800
|
||||
@@ -237,6 +237,17 @@ count overflows. */
|
||||
taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
|
||||
vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
|
||||
tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
+
|
||||
+/*
|
||||
+ * Place the task represented by pxTCB which has been in a ready list before
|
||||
+ * into the appropriate ready list for the task.
|
||||
+ * It is inserted at the end of the list.
|
||||
+ */
|
||||
+#define prvReaddTaskToReadyList( pxTCB ) \
|
||||
+ traceREADDED_TASK_TO_READY_STATE( pxTCB ); \
|
||||
+ taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
|
||||
+ vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
|
||||
+ tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
@@ -1598,7 +1609,7 @@ static void prvAddNewTaskToReadyList( TC
|
||||
{
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
- prvAddTaskToReadyList( pxTCB );
|
||||
+ prvReaddTaskToReadyList( pxTCB );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1659,7 +1670,7 @@ static void prvAddNewTaskToReadyList( TC
|
||||
{
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
-
|
||||
+ traceMOVED_TASK_TO_SUSPENDED_LIST(pxTCB);
|
||||
vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) );
|
||||
|
||||
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||
@@ -3671,6 +3682,20 @@ static void prvCheckTasksWaitingTerminat
|
||||
#endif /* INCLUDE_uxTaskGetStackHighWaterMark */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
+#if (INCLUDE_pxTaskGetStackStart == 1)
|
||||
+ uint8_t* pxTaskGetStackStart( TaskHandle_t xTask)
|
||||
+ {
|
||||
+ TCB_t *pxTCB;
|
||||
+ UBaseType_t uxReturn;
|
||||
+ (void)uxReturn;
|
||||
+
|
||||
+ pxTCB = prvGetTCBFromHandle( xTask );
|
||||
+ return ( uint8_t * ) pxTCB->pxStack;
|
||||
+ }
|
||||
+
|
||||
+#endif /* INCLUDE_pxTaskGetStackStart */
|
||||
+/*-----------------------------------------------------------*/
|
||||
+
|
||||
#if ( INCLUDE_vTaskDelete == 1 )
|
||||
|
||||
static void prvDeleteTCB( TCB_t *pxTCB )
|
||||
@@ -3840,7 +3865,7 @@ TCB_t *pxTCB;
|
||||
|
||||
/* Inherit the priority before being moved into the new list. */
|
||||
pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;
|
||||
- prvAddTaskToReadyList( pxMutexHolderTCB );
|
||||
+ prvReaddTaskToReadyList( pxMutexHolderTCB );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3930,7 +3955,7 @@ TCB_t *pxTCB;
|
||||
any other purpose if this task is running, and it must be
|
||||
running to give back the mutex. */
|
||||
listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
||||
- prvAddTaskToReadyList( pxTCB );
|
||||
+ prvReaddTaskToReadyList( pxTCB );
|
||||
|
||||
/* Return true to indicate that a context switch is required.
|
||||
This is only actually required in the corner case whereby
|
||||
@@ -4940,6 +4965,7 @@ const TickType_t xConstTickCount = xTick
|
||||
/* Add the task to the suspended task list instead of a delayed task
|
||||
list to ensure it is not woken by a timing event. It will block
|
||||
indefinitely. */
|
||||
+ traceMOVED_TASK_TO_SUSPENDED_LIST(pxCurrentTCB);
|
||||
vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
@@ -4956,12 +4982,14 @@ const TickType_t xConstTickCount = xTick
|
||||
{
|
||||
/* Wake time has overflowed. Place this item in the overflow
|
||||
list. */
|
||||
+ traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();
|
||||
vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The wake time has not overflowed, so the current block list
|
||||
is used. */
|
||||
+ traceMOVED_TASK_TO_DELAYED_LIST();
|
||||
vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
|
||||
/* If the task entering the blocked state was placed at the
|
||||
@@ -4991,11 +5019,13 @@ const TickType_t xConstTickCount = xTick
|
||||
if( xTimeToWake < xConstTickCount )
|
||||
{
|
||||
/* Wake time has overflowed. Place this item in the overflow list. */
|
||||
+ traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();
|
||||
vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The wake time has not overflowed, so the current block list is used. */
|
||||
+ traceMOVED_TASK_TO_DELAYED_LIST();
|
||||
vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
|
||||
|
||||
/* If the task entering the blocked state was placed at the head of the
|
||||
@@ -0,0 +1,104 @@
|
||||
/*********************************************************************
|
||||
* SEGGER Microcontroller GmbH *
|
||||
* The Embedded Experts *
|
||||
**********************************************************************
|
||||
* *
|
||||
* (c) 1995 - 2024 SEGGER Microcontroller GmbH *
|
||||
* *
|
||||
* www.segger.com Support: support@segger.com *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SEGGER SystemView * Real-time application analysis *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* SEGGER strongly recommends to not make any changes *
|
||||
* to or modify the source code of this software in order to stay *
|
||||
* compatible with the SystemView and RTT protocol, and J-Link. *
|
||||
* *
|
||||
* Redistribution and use in source and binary forms, with or *
|
||||
* without modification, are permitted provided that the following *
|
||||
* condition is met: *
|
||||
* *
|
||||
* o Redistributions of source code must retain the above copyright *
|
||||
* notice, this condition and the following disclaimer. *
|
||||
* *
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||
* DAMAGE. *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SystemView version: 3.56 *
|
||||
* *
|
||||
**********************************************************************
|
||||
-------------------------- END-OF-HEADER -----------------------------
|
||||
|
||||
File : SEGGER_SYSVIEW_Config_FreeRTOS.c
|
||||
Purpose : Sample setup configuration of SystemView with FreeRTOS.
|
||||
Revision: $Rev: 7745 $
|
||||
*/
|
||||
#include "FreeRTOS.h"
|
||||
#include "SEGGER_SYSVIEW.h"
|
||||
|
||||
extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI;
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Defines, configurable
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
// The application name to be displayed in SystemViewer
|
||||
#define SYSVIEW_APP_NAME "FreeRTOS Demo Application"
|
||||
|
||||
// The target device name
|
||||
#define SYSVIEW_DEVICE_NAME "Cortex-M4"
|
||||
|
||||
// Frequency of the timestamp. Must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h
|
||||
#define SYSVIEW_TIMESTAMP_FREQ (configCPU_CLOCK_HZ)
|
||||
|
||||
// System Frequency. SystemcoreClock is used in most CMSIS compatible projects.
|
||||
#define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ
|
||||
|
||||
// The lowest RAM address used for IDs (pointers)
|
||||
#define SYSVIEW_RAM_BASE (0x10000000)
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* _cbSendSystemDesc()
|
||||
*
|
||||
* Function description
|
||||
* Sends SystemView description strings.
|
||||
*/
|
||||
static void _cbSendSystemDesc(void) {
|
||||
SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",D="SYSVIEW_DEVICE_NAME",O=FreeRTOS");
|
||||
//SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick");
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Global functions
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
void SEGGER_SYSVIEW_Conf(void) {
|
||||
SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ,
|
||||
&SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);
|
||||
SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
|
||||
}
|
||||
|
||||
/*************************** End of file ****************************/
|
||||
252
User_Code/bsp/log/SystemView/FreeRTOS/SEGGER_SYSVIEW_FreeRTOS.c
Normal file
252
User_Code/bsp/log/SystemView/FreeRTOS/SEGGER_SYSVIEW_FreeRTOS.c
Normal file
@@ -0,0 +1,252 @@
|
||||
/*********************************************************************
|
||||
* SEGGER Microcontroller GmbH *
|
||||
* The Embedded Experts *
|
||||
**********************************************************************
|
||||
* *
|
||||
* (c) 1995 - 2024 SEGGER Microcontroller GmbH *
|
||||
* *
|
||||
* www.segger.com Support: support@segger.com *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SEGGER SystemView * Real-time application analysis *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* SEGGER strongly recommends to not make any changes *
|
||||
* to or modify the source code of this software in order to stay *
|
||||
* compatible with the SystemView and RTT protocol, and J-Link. *
|
||||
* *
|
||||
* Redistribution and use in source and binary forms, with or *
|
||||
* without modification, are permitted provided that the following *
|
||||
* condition is met: *
|
||||
* *
|
||||
* o Redistributions of source code must retain the above copyright *
|
||||
* notice, this condition and the following disclaimer. *
|
||||
* *
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||
* DAMAGE. *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SystemView version: 3.56 *
|
||||
* *
|
||||
**********************************************************************
|
||||
-------------------------- END-OF-HEADER -----------------------------
|
||||
|
||||
File : SEGGER_SYSVIEW_FreeRTOS.c
|
||||
Purpose : Interface between FreeRTOS and SystemView.
|
||||
Revision: $Rev: 7947 $
|
||||
*/
|
||||
#include "SEGGER_SYSVIEW_FreeRTOS.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "SEGGER_SYSVIEW.h"
|
||||
#include "string.h" // Required for memset
|
||||
|
||||
|
||||
|
||||
typedef struct SYSVIEW_FREERTOS_TASK_STATUS SYSVIEW_FREERTOS_TASK_STATUS;
|
||||
|
||||
struct SYSVIEW_FREERTOS_TASK_STATUS {
|
||||
U32 xHandle;
|
||||
const char* pcTaskName;
|
||||
unsigned uxCurrentPriority;
|
||||
U32 pxStack;
|
||||
unsigned uStackHighWaterMark;
|
||||
};
|
||||
|
||||
static SYSVIEW_FREERTOS_TASK_STATUS _aTasks[SYSVIEW_FREERTOS_MAX_NOF_TASKS];
|
||||
static unsigned _NumTasks;
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* _cbSendTaskList()
|
||||
*
|
||||
* Function description
|
||||
* This function is part of the link between FreeRTOS and SYSVIEW.
|
||||
* Called from SystemView when asked by the host, it uses SYSVIEW
|
||||
* functions to send the entire task list to the host.
|
||||
*/
|
||||
static void _cbSendTaskList(void) {
|
||||
unsigned n;
|
||||
|
||||
for (n = 0; n < _NumTasks; n++) {
|
||||
#if INCLUDE_uxTaskGetStackHighWaterMark // Report Task Stack High Watermark
|
||||
_aTasks[n].uStackHighWaterMark = uxTaskGetStackHighWaterMark((TaskHandle_t)_aTasks[n].xHandle);
|
||||
#endif
|
||||
SYSVIEW_SendTaskInfo((U32)_aTasks[n].xHandle, _aTasks[n].pcTaskName, (unsigned)_aTasks[n].uxCurrentPriority, (U32)_aTasks[n].pxStack, (unsigned)_aTasks[n].uStackHighWaterMark);
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* _cbGetTime()
|
||||
*
|
||||
* Function description
|
||||
* This function is part of the link between FreeRTOS and SYSVIEW.
|
||||
* Called from SystemView when asked by the host, returns the
|
||||
* current system time in micro seconds.
|
||||
*/
|
||||
static U64 _cbGetTime(void) {
|
||||
U64 Time;
|
||||
|
||||
Time = xTaskGetTickCountFromISR();
|
||||
Time *= portTICK_PERIOD_MS;
|
||||
Time *= 1000;
|
||||
return Time;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Global functions
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
/*********************************************************************
|
||||
*
|
||||
* SYSVIEW_AddTask()
|
||||
*
|
||||
* Function description
|
||||
* Add a task to the internal list and record its information.
|
||||
*/
|
||||
void SYSVIEW_AddTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) {
|
||||
|
||||
if (memcmp(pcTaskName, "IDLE", 5) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_NumTasks >= SYSVIEW_FREERTOS_MAX_NOF_TASKS) {
|
||||
SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not record task information. Maximum number of tasks reached.");
|
||||
return;
|
||||
}
|
||||
|
||||
_aTasks[_NumTasks].xHandle = xHandle;
|
||||
_aTasks[_NumTasks].pcTaskName = pcTaskName;
|
||||
_aTasks[_NumTasks].uxCurrentPriority = uxCurrentPriority;
|
||||
_aTasks[_NumTasks].pxStack = pxStack;
|
||||
_aTasks[_NumTasks].uStackHighWaterMark = uStackHighWaterMark;
|
||||
|
||||
_NumTasks++;
|
||||
|
||||
SYSVIEW_SendTaskInfo(xHandle, pcTaskName,uxCurrentPriority, pxStack, uStackHighWaterMark);
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* SYSVIEW_UpdateTask()
|
||||
*
|
||||
* Function description
|
||||
* Update a task in the internal list and record its information.
|
||||
*/
|
||||
void SYSVIEW_UpdateTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) {
|
||||
unsigned n;
|
||||
|
||||
if (memcmp(pcTaskName, "IDLE", 5) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (n = 0; n < _NumTasks; n++) {
|
||||
if (_aTasks[n].xHandle == xHandle) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (n < _NumTasks) {
|
||||
_aTasks[n].pcTaskName = pcTaskName;
|
||||
_aTasks[n].uxCurrentPriority = uxCurrentPriority;
|
||||
_aTasks[n].pxStack = pxStack;
|
||||
_aTasks[n].uStackHighWaterMark = uStackHighWaterMark;
|
||||
|
||||
SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);
|
||||
} else {
|
||||
SYSVIEW_AddTask(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* SYSVIEW_DeleteTask()
|
||||
*
|
||||
* Function description
|
||||
* Delete a task from the internal list.
|
||||
*/
|
||||
void SYSVIEW_DeleteTask(U32 xHandle) {
|
||||
unsigned n;
|
||||
|
||||
if (_NumTasks == 0) {
|
||||
return; // Early out
|
||||
}
|
||||
for (n = 0; n < _NumTasks; n++) {
|
||||
if (_aTasks[n].xHandle == xHandle) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (n == (_NumTasks - 1)) {
|
||||
//
|
||||
// Task is last item in list.
|
||||
// Simply zero the item and decrement number of tasks.
|
||||
//
|
||||
memset(&_aTasks[n], 0, sizeof(_aTasks[n]));
|
||||
_NumTasks--;
|
||||
} else if (n < _NumTasks) {
|
||||
//
|
||||
// Task is in the middle of the list.
|
||||
// Move last item to current position and decrement number of tasks.
|
||||
// Order of tasks does not really matter, so no need to move all following items.
|
||||
//
|
||||
_aTasks[n].xHandle = _aTasks[_NumTasks - 1].xHandle;
|
||||
_aTasks[n].pcTaskName = _aTasks[_NumTasks - 1].pcTaskName;
|
||||
_aTasks[n].uxCurrentPriority = _aTasks[_NumTasks - 1].uxCurrentPriority;
|
||||
_aTasks[n].pxStack = _aTasks[_NumTasks - 1].pxStack;
|
||||
_aTasks[n].uStackHighWaterMark = _aTasks[_NumTasks - 1].uStackHighWaterMark;
|
||||
memset(&_aTasks[_NumTasks - 1], 0, sizeof(_aTasks[_NumTasks - 1]));
|
||||
_NumTasks--;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* SYSVIEW_SendTaskInfo()
|
||||
*
|
||||
* Function description
|
||||
* Record task information.
|
||||
*/
|
||||
void SYSVIEW_SendTaskInfo(U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize) {
|
||||
SEGGER_SYSVIEW_TASKINFO TaskInfo;
|
||||
|
||||
memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code
|
||||
TaskInfo.TaskID = TaskID;
|
||||
TaskInfo.sName = sName;
|
||||
TaskInfo.Prio = Prio;
|
||||
TaskInfo.StackBase = StackBase;
|
||||
TaskInfo.StackSize = StackSize;
|
||||
SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Public API structures
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
// Callbacks provided to SYSTEMVIEW by FreeRTOS
|
||||
const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
|
||||
_cbGetTime,
|
||||
_cbSendTaskList,
|
||||
};
|
||||
|
||||
/*************************** End of file ****************************/
|
||||
331
User_Code/bsp/log/SystemView/FreeRTOS/SEGGER_SYSVIEW_FreeRTOS.h
Normal file
331
User_Code/bsp/log/SystemView/FreeRTOS/SEGGER_SYSVIEW_FreeRTOS.h
Normal file
@@ -0,0 +1,331 @@
|
||||
/*********************************************************************
|
||||
* SEGGER Microcontroller GmbH *
|
||||
* The Embedded Experts *
|
||||
**********************************************************************
|
||||
* *
|
||||
* (c) 1995 - 2024 SEGGER Microcontroller GmbH *
|
||||
* *
|
||||
* www.segger.com Support: support@segger.com *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SEGGER SystemView * Real-time application analysis *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* SEGGER strongly recommends to not make any changes *
|
||||
* to or modify the source code of this software in order to stay *
|
||||
* compatible with the SystemView and RTT protocol, and J-Link. *
|
||||
* *
|
||||
* Redistribution and use in source and binary forms, with or *
|
||||
* without modification, are permitted provided that the following *
|
||||
* condition is met: *
|
||||
* *
|
||||
* o Redistributions of source code must retain the above copyright *
|
||||
* notice, this condition and the following disclaimer. *
|
||||
* *
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||
* DAMAGE. *
|
||||
* *
|
||||
**********************************************************************
|
||||
* *
|
||||
* SystemView version: 3.56 *
|
||||
* *
|
||||
**********************************************************************
|
||||
-------------------------- END-OF-HEADER -----------------------------
|
||||
|
||||
File : SEGGER_SYSVIEW_FreeRTOS.h
|
||||
Purpose : Interface between FreeRTOS and SystemView.
|
||||
Tested with FreeRTOS V10.0.0
|
||||
Revision: $Rev: 7745 $
|
||||
|
||||
Notes:
|
||||
(1) Include this file at the end of FreeRTOSConfig.h
|
||||
*/
|
||||
|
||||
#ifndef SYSVIEW_FREERTOS_H
|
||||
#define SYSVIEW_FREERTOS_H
|
||||
|
||||
#include "SEGGER_SYSVIEW.h"
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Defines, configurable
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#ifndef portSTACK_GROWTH
|
||||
#define portSTACK_GROWTH ( -1 )
|
||||
#endif
|
||||
|
||||
#define SYSVIEW_FREERTOS_MAX_NOF_TASKS 8
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Defines, fixed
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#define apiID_OFFSET (32u)
|
||||
|
||||
#define apiID_VTASKALLOCATEMPUREGIONS (1u)
|
||||
#define apiID_VTASKDELETE (2u)
|
||||
#define apiID_VTASKDELAY (3u)
|
||||
#define apiID_VTASKDELAYUNTIL (4u)
|
||||
#define apiID_UXTASKPRIORITYGET (5u)
|
||||
#define apiID_UXTASKPRIORITYGETFROMISR (6u)
|
||||
#define apiID_ETASKGETSTATE (7u)
|
||||
#define apiID_VTASKPRIORITYSET (8u)
|
||||
#define apiID_VTASKSUSPEND (9u)
|
||||
#define apiID_VTASKRESUME (10u)
|
||||
#define apiID_XTASKRESUMEFROMISR (11u)
|
||||
#define apiID_VTASKSTARTSCHEDULER (12u)
|
||||
#define apiID_VTASKENDSCHEDULER (13u)
|
||||
#define apiID_VTASKSUSPENDALL (14u)
|
||||
#define apiID_XTASKRESUMEALL (15u)
|
||||
#define apiID_XTASKGETTICKCOUNT (16u)
|
||||
#define apiID_XTASKGETTICKCOUNTFROMISR (17u)
|
||||
#define apiID_UXTASKGETNUMBEROFTASKS (18u)
|
||||
#define apiID_PCTASKGETTASKNAME (19u)
|
||||
#define apiID_UXTASKGETSTACKHIGHWATERMARK (20u)
|
||||
#define apiID_VTASKSETAPPLICATIONTASKTAG (21u)
|
||||
#define apiID_XTASKGETAPPLICATIONTASKTAG (22u)
|
||||
#define apiID_VTASKSETTHREADLOCALSTORAGEPOINTER (23u)
|
||||
#define apiID_PVTASKGETTHREADLOCALSTORAGEPOINTER (24u)
|
||||
#define apiID_XTASKCALLAPPLICATIONTASKHOOK (25u)
|
||||
#define apiID_XTASKGETIDLETASKHANDLE (26u)
|
||||
#define apiID_UXTASKGETSYSTEMSTATE (27u)
|
||||
#define apiID_VTASKLIST (28u)
|
||||
#define apiID_VTASKGETRUNTIMESTATS (29u)
|
||||
#define apiID_XTASKGENERICNOTIFY (30u)
|
||||
#define apiID_XTASKGENERICNOTIFYFROMISR (31u)
|
||||
#define apiID_XTASKNOTIFYWAIT (32u)
|
||||
#define apiID_VTASKNOTIFYGIVEFROMISR (33u)
|
||||
#define apiID_ULTASKNOTIFYTAKE (34u)
|
||||
#define apiID_XTASKNOTIFYSTATECLEAR (35u)
|
||||
#define apiID_XTASKGETCURRENTTASKHANDLE (36u)
|
||||
#define apiID_VTASKSETTIMEOUTSTATE (37u)
|
||||
#define apiID_XTASKCHECKFORTIMEOUT (38u)
|
||||
#define apiID_VTASKMISSEDYIELD (39u)
|
||||
#define apiID_XTASKGETSCHEDULERSTATE (40u)
|
||||
#define apiID_VTASKPRIORITYINHERIT (41u)
|
||||
#define apiID_XTASKPRIORITYDISINHERIT (42u)
|
||||
#define apiID_XTASKGENERICCREATE (43u)
|
||||
#define apiID_UXTASKGETTASKNUMBER (44u)
|
||||
#define apiID_VTASKSETTASKNUMBER (45u)
|
||||
#define apiID_VTASKSTEPTICK (46u)
|
||||
#define apiID_ETASKCONFIRMSLEEPMODESTATUS (47u)
|
||||
#define apiID_XTIMERCREATE (48u)
|
||||
#define apiID_PVTIMERGETTIMERID (49u)
|
||||
#define apiID_VTIMERSETTIMERID (50u)
|
||||
#define apiID_XTIMERISTIMERACTIVE (51u)
|
||||
#define apiID_XTIMERGETTIMERDAEMONTASKHANDLE (52u)
|
||||
#define apiID_XTIMERPENDFUNCTIONCALLFROMISR (53u)
|
||||
#define apiID_XTIMERPENDFUNCTIONCALL (54u)
|
||||
#define apiID_PCTIMERGETTIMERNAME (55u)
|
||||
#define apiID_XTIMERCREATETIMERTASK (56u)
|
||||
#define apiID_XTIMERGENERICCOMMAND (57u)
|
||||
#define apiID_XQUEUEGENERICSEND (58u)
|
||||
#define apiID_XQUEUEPEEKFROMISR (59u)
|
||||
#define apiID_XQUEUEGENERICRECEIVE (60u)
|
||||
#define apiID_UXQUEUEMESSAGESWAITING (61u)
|
||||
#define apiID_UXQUEUESPACESAVAILABLE (62u)
|
||||
#define apiID_VQUEUEDELETE (63u)
|
||||
#define apiID_XQUEUEGENERICSENDFROMISR (64u)
|
||||
#define apiID_XQUEUEGIVEFROMISR (65u)
|
||||
#define apiID_XQUEUERECEIVEFROMISR (66u)
|
||||
#define apiID_XQUEUEISQUEUEEMPTYFROMISR (67u)
|
||||
#define apiID_XQUEUEISQUEUEFULLFROMISR (68u)
|
||||
#define apiID_UXQUEUEMESSAGESWAITINGFROMISR (69u)
|
||||
#define apiID_XQUEUEALTGENERICSEND (70u)
|
||||
#define apiID_XQUEUEALTGENERICRECEIVE (71u)
|
||||
#define apiID_XQUEUECRSENDFROMISR (72u)
|
||||
#define apiID_XQUEUECRRECEIVEFROMISR (73u)
|
||||
#define apiID_XQUEUECRSEND (74u)
|
||||
#define apiID_XQUEUECRRECEIVE (75u)
|
||||
#define apiID_XQUEUECREATEMUTEX (76u)
|
||||
#define apiID_XQUEUECREATECOUNTINGSEMAPHORE (77u)
|
||||
#define apiID_XQUEUEGETMUTEXHOLDER (78u)
|
||||
#define apiID_XQUEUETAKEMUTEXRECURSIVE (79u)
|
||||
#define apiID_XQUEUEGIVEMUTEXRECURSIVE (80u)
|
||||
#define apiID_VQUEUEADDTOREGISTRY (81u)
|
||||
#define apiID_VQUEUEUNREGISTERQUEUE (82u)
|
||||
#define apiID_XQUEUEGENERICCREATE (83u)
|
||||
#define apiID_XQUEUECREATESET (84u)
|
||||
#define apiID_XQUEUEADDTOSET (85u)
|
||||
#define apiID_XQUEUEREMOVEFROMSET (86u)
|
||||
#define apiID_XQUEUESELECTFROMSET (87u)
|
||||
#define apiID_XQUEUESELECTFROMSETFROMISR (88u)
|
||||
#define apiID_XQUEUEGENERICRESET (89u)
|
||||
#define apiID_VLISTINITIALISE (90u)
|
||||
#define apiID_VLISTINITIALISEITEM (91u)
|
||||
#define apiID_VLISTINSERT (92u)
|
||||
#define apiID_VLISTINSERTEND (93u)
|
||||
#define apiID_UXLISTREMOVE (94u)
|
||||
#define apiID_XEVENTGROUPCREATE (95u)
|
||||
#define apiID_XEVENTGROUPWAITBITS (96u)
|
||||
#define apiID_XEVENTGROUPCLEARBITS (97u)
|
||||
#define apiID_XEVENTGROUPCLEARBITSFROMISR (98u)
|
||||
#define apiID_XEVENTGROUPSETBITS (99u)
|
||||
#define apiID_XEVENTGROUPSETBITSFROMISR (100u)
|
||||
#define apiID_XEVENTGROUPSYNC (101u)
|
||||
#define apiID_XEVENTGROUPGETBITSFROMISR (102u)
|
||||
#define apiID_VEVENTGROUPDELETE (103u)
|
||||
#define apiID_UXEVENTGROUPGETNUMBER (104u)
|
||||
#define apiID_XSTREAMBUFFERCREATE (105u)
|
||||
#define apiID_VSTREAMBUFFERDELETE (106u)
|
||||
#define apiID_XSTREAMBUFFERRESET (107u)
|
||||
#define apiID_XSTREAMBUFFERSEND (108u)
|
||||
#define apiID_XSTREAMBUFFERSENDFROMISR (109u)
|
||||
#define apiID_XSTREAMBUFFERRECEIVE (110u)
|
||||
#define apiID_XSTREAMBUFFERRECEIVEFROMISR (111u)
|
||||
|
||||
#define traceTASK_NOTIFY_TAKE() SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_ULTASKNOTIFYTAKE, xClearCountOnExit, xTicksToWait)
|
||||
#define traceTASK_DELAY() SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VTASKDELAY, xTicksToDelay)
|
||||
#define traceTASK_DELAY_UNTIL(xTimeToWake) SEGGER_SYSVIEW_RecordVoid (apiID_OFFSET + apiID_VTASKDELAYUNTIL)
|
||||
#define traceTASK_NOTIFY_GIVE_FROM_ISR() SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_VTASKNOTIFYGIVEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceTASK_PRIORITY_INHERIT( pxTCB, uxPriority ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VTASKPRIORITYINHERIT, (U32)pxMutexHolder)
|
||||
#define traceTASK_RESUME( pxTCB ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VTASKRESUME, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB))
|
||||
#define traceINCREASE_TICK_COUNT( xTicksToJump ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VTASKSTEPTICK, xTicksToJump)
|
||||
#define traceTASK_SUSPEND( pxTCB ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VTASKSUSPEND, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB))
|
||||
#define traceTASK_PRIORITY_DISINHERIT( pxTCB, uxBasePriority ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_XTASKPRIORITYDISINHERIT, (U32)pxMutexHolder)
|
||||
#define traceTASK_RESUME_FROM_ISR( pxTCB ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_XTASKRESUMEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB))
|
||||
#define traceTASK_NOTIFY() SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XTASKGENERICNOTIFY, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), ulValue, eAction, (U32)pulPreviousNotificationValue)
|
||||
#define traceTASK_NOTIFY_FROM_ISR() SEGGER_SYSVIEW_RecordU32x5(apiID_OFFSET + apiID_XTASKGENERICNOTIFYFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), ulValue, eAction, (U32)pulPreviousNotificationValue, (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceTASK_NOTIFY_WAIT() SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XTASKNOTIFYWAIT, ulBitsToClearOnEntry, ulBitsToClearOnExit, (U32)pulNotificationValue, xTicksToWait)
|
||||
|
||||
#define traceQUEUE_CREATE( pxNewQueue ) SEGGER_SYSVIEW_RecordU32x3(apiID_OFFSET + apiID_XQUEUEGENERICCREATE, uxQueueLength, uxItemSize, ucQueueType)
|
||||
#define traceQUEUE_DELETE( pxQueue ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VQUEUEDELETE, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue))
|
||||
#define traceQUEUE_PEEK( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICRECEIVE, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)pvBuffer), xTicksToWait, 1)
|
||||
#define traceQUEUE_PEEK_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XQUEUEPEEKFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)pvBuffer))
|
||||
#define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XQUEUEPEEKFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)pvBuffer))
|
||||
#define traceQUEUE_RECEIVE( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICRECEIVE, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)0), xTicksToWait, 1)
|
||||
#define traceQUEUE_RECEIVE_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICRECEIVE, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)0), xTicksToWait, 1)
|
||||
#define traceQUEUE_SEMAPHORE_RECEIVE( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICRECEIVE, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)0), xTicksToWait, 0)
|
||||
#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x3(apiID_OFFSET + apiID_XQUEUERECEIVEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)pvBuffer), (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x3(apiID_OFFSET + apiID_XQUEUERECEIVEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), SEGGER_SYSVIEW_ShrinkId((U32)pvBuffer), (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_VQUEUEADDTOREGISTRY, SEGGER_SYSVIEW_ShrinkId((U32)xQueue), (U32)pcQueueName)
|
||||
#if ( configUSE_QUEUE_SETS != 1 )
|
||||
#define traceQUEUE_SEND( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pvItemToQueue, xTicksToWait, xCopyPosition)
|
||||
#else
|
||||
#define traceQUEUE_SEND( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0u, 0u, xCopyPosition)
|
||||
#endif
|
||||
#define traceQUEUE_SEND_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pvItemToQueue, xTicksToWait, xCopyPosition)
|
||||
#define traceQUEUE_SEND_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken)
|
||||
#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERCREATE, (U32)xIsMessageBuffer, (U32)pxStreamBuffer)
|
||||
#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERCREATE, (U32)xIsMessageBuffer, 0u)
|
||||
#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_VSTREAMBUFFERDELETE, (U32)xStreamBuffer)
|
||||
#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) SEGGER_SYSVIEW_RecordU32 (apiID_OFFSET + apiID_XSTREAMBUFFERRESET, (U32)xStreamBuffer)
|
||||
#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERSEND, (U32)xStreamBuffer, (U32)xBytesSent)
|
||||
#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERSEND, (U32)xStreamBuffer, 0u)
|
||||
#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERSENDFROMISR, (U32)xStreamBuffer, (U32)xBytesSent)
|
||||
#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERRECEIVE, (U32)xStreamBuffer, (U32)xReceivedLength)
|
||||
#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERRECEIVE, (U32)xStreamBuffer, 0u)
|
||||
#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET + apiID_XSTREAMBUFFERRECEIVEFROMISR, (U32)xStreamBuffer, (U32)xReceivedLength)
|
||||
|
||||
|
||||
#define traceTASK_DELETE( pxTCB ) { \
|
||||
SEGGER_SYSVIEW_RecordU32(apiID_OFFSET + apiID_VTASKDELETE, SEGGER_SYSVIEW_ShrinkId((U32)pxTCB)); \
|
||||
SYSVIEW_DeleteTask((U32)pxTCB); \
|
||||
}
|
||||
|
||||
|
||||
#if( portSTACK_GROWTH < 0 )
|
||||
#define traceTASK_CREATE(pxNewTCB) if (pxNewTCB != NULL) { \
|
||||
SEGGER_SYSVIEW_OnTaskCreate((U32)pxNewTCB); \
|
||||
SYSVIEW_AddTask((U32)pxNewTCB, \
|
||||
&(pxNewTCB->pcTaskName[0]), \
|
||||
pxNewTCB->uxPriority, \
|
||||
(U32)pxNewTCB->pxStack, \
|
||||
((U32)pxNewTCB->pxTopOfStack - (U32)pxNewTCB->pxStack) \
|
||||
); \
|
||||
}
|
||||
#else
|
||||
#define traceTASK_CREATE(pxNewTCB) if (pxNewTCB != NULL) { \
|
||||
SEGGER_SYSVIEW_OnTaskCreate((U32)pxNewTCB); \
|
||||
SYSVIEW_AddTask((U32)pxNewTCB, \
|
||||
&(pxNewTCB->pcTaskName[0]), \
|
||||
pxNewTCB->uxPriority, \
|
||||
(U32)pxNewTCB->pxStack, \
|
||||
(U32)(pxNewTCB->pxStack-pxNewTCB->pxTopOfStack) \
|
||||
); \
|
||||
}
|
||||
#endif
|
||||
#define traceTASK_PRIORITY_SET(pxTask, uxNewPriority) { \
|
||||
SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET+apiID_VTASKPRIORITYSET, \
|
||||
SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), \
|
||||
uxNewPriority \
|
||||
); \
|
||||
SYSVIEW_UpdateTask((U32)pxTask, \
|
||||
&(pxTask->pcTaskName[0]), \
|
||||
uxNewPriority, \
|
||||
(U32)pxTask->pxStack, \
|
||||
0 \
|
||||
); \
|
||||
}
|
||||
//
|
||||
// Define INCLUDE_xTaskGetIdleTaskHandle as 1 in FreeRTOSConfig.h to allow identification of Idle state.
|
||||
//
|
||||
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
|
||||
#define traceTASK_SWITCHED_IN() if(prvGetTCBFromHandle(NULL) == xIdleTaskHandle) { \
|
||||
SEGGER_SYSVIEW_OnIdle(); \
|
||||
} else { \
|
||||
SEGGER_SYSVIEW_OnTaskStartExec((U32)pxCurrentTCB); \
|
||||
}
|
||||
#else
|
||||
#define traceTASK_SWITCHED_IN() { \
|
||||
if (memcmp(pxCurrentTCB->pcTaskName, "IDLE", 5) != 0) { \
|
||||
SEGGER_SYSVIEW_OnTaskStartExec((U32)pxCurrentTCB); \
|
||||
} else { \
|
||||
SEGGER_SYSVIEW_OnIdle(); \
|
||||
} \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define traceMOVED_TASK_TO_READY_STATE(pxTCB) SEGGER_SYSVIEW_OnTaskStartReady((U32)pxTCB)
|
||||
#define traceREADDED_TASK_TO_READY_STATE(pxTCB)
|
||||
|
||||
#define traceMOVED_TASK_TO_DELAYED_LIST() SEGGER_SYSVIEW_OnTaskStopReady((U32)pxCurrentTCB, (1u << 2))
|
||||
#define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST() SEGGER_SYSVIEW_OnTaskStopReady((U32)pxCurrentTCB, (1u << 2))
|
||||
#define traceMOVED_TASK_TO_SUSPENDED_LIST(pxTCB) SEGGER_SYSVIEW_OnTaskStopReady((U32)pxTCB, ((3u << 3) | 3))
|
||||
|
||||
|
||||
#define traceISR_EXIT_TO_SCHEDULER() SEGGER_SYSVIEW_RecordExitISRToScheduler()
|
||||
#define traceISR_EXIT() SEGGER_SYSVIEW_RecordExitISR()
|
||||
#define traceISR_ENTER() SEGGER_SYSVIEW_RecordEnterISR()
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* API functions
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void SYSVIEW_AddTask (U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark);
|
||||
void SYSVIEW_UpdateTask (U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark);
|
||||
void SYSVIEW_DeleteTask (U32 xHandle);
|
||||
void SYSVIEW_SendTaskInfo (U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*************************** End of file ****************************/
|
||||
Reference in New Issue
Block a user