From e943d2598ce6145eecd56c008beccbfea2eacd11 Mon Sep 17 00:00:00 2001 From: "thomas.schmidt-esterle" Date: Tue, 9 Apr 2019 13:18:18 +0200 Subject: [PATCH] - Patch for Segger SysView on FreeRTOS 10.2.0 Kernelfiles --- RTOS/FreeRTOS/Source/include/FreeRTOS.h | 32 +++++++++++++ RTOS/FreeRTOS/Source/include/task.h | 20 ++++++++ .../Source/portable/GCC/ARM_CM7/r0p1/port.c | 6 +++ .../portable/GCC/ARM_CM7/r0p1/portmacro.h | 7 ++- RTOS/FreeRTOS/Source/tasks.c | 47 +++++++++++++++++-- 5 files changed, 108 insertions(+), 4 deletions(-) diff --git a/RTOS/FreeRTOS/Source/include/FreeRTOS.h b/RTOS/FreeRTOS/Source/include/FreeRTOS.h index 676534d..b2b3dc5 100644 --- a/RTOS/FreeRTOS/Source/include/FreeRTOS.h +++ b/RTOS/FreeRTOS/Source/include/FreeRTOS.h @@ -160,6 +160,10 @@ extern "C" { #define INCLUDE_uxTaskGetStackHighWaterMark2 0 #endif +#ifndef INCLUDE_pxTaskGetStackStart + #define INCLUDE_pxTaskGetStackStart 0 +#endif + #ifndef INCLUDE_eTaskGetState #define INCLUDE_eTaskGetState 0 #endif @@ -396,6 +400,22 @@ 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 @@ -640,6 +660,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 --git a/RTOS/FreeRTOS/Source/include/task.h b/RTOS/FreeRTOS/Source/include/task.h index 8c8653a..4c22958 100644 --- a/RTOS/FreeRTOS/Source/include/task.h +++ b/RTOS/FreeRTOS/Source/include/task.h @@ -1463,6 +1463,26 @@ UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTIO */ configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +/** + * task.h + *
uint8_t* pxTaskGetStackStart( TaskHandle_t xTask);
+ * + * 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 --git a/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c b/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c index b3bfe0a..e6dcae2 100644 --- a/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c +++ b/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c @@ -482,14 +482,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 --git a/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h b/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h index 27b9d35..4777a26 100644 --- a/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h +++ b/RTOS/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/portmacro.h @@ -89,7 +89,12 @@ 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() + +//Original FreeRTOS Sourcefil +//#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +//New Segger Sysview Line +#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 --git a/RTOS/FreeRTOS/Source/tasks.c b/RTOS/FreeRTOS/Source/tasks.c index ff65773..b41aef9 100644 --- a/RTOS/FreeRTOS/Source/tasks.c +++ b/RTOS/FreeRTOS/Source/tasks.c @@ -220,6 +220,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 ) /*-----------------------------------------------------------*/ /* @@ -1664,7 +1675,10 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) { mtCOVERAGE_TEST_MARKER(); } - prvAddTaskToReadyList( pxTCB ); + //Original Code From FreeRTOS 10.2.0 + //prvAddTaskToReadyList( pxTCB ); + //Segger StyleView Code + prvReaddTaskToReadyList( pxTCB ); } else { @@ -1726,6 +1740,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) mtCOVERAGE_TEST_MARKER(); } + traceMOVED_TASK_TO_SUSPENDED_LIST(pxTCB); vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); #if( configUSE_TASK_NOTIFICATIONS == 1 ) @@ -3820,6 +3835,20 @@ static void prvCheckTasksWaitingTermination( void ) #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 ) @@ -3989,7 +4018,10 @@ TCB_t *pxTCB; /* Inherit the priority before being moved into the new list. */ pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; - prvAddTaskToReadyList( pxMutexHolderTCB ); + //Original Code From FreeRTOS 10.2.0 + //prvAddTaskToReadyList( pxMutexHolderTCB ); + //Segger StyleView Code + prvReaddTaskToReadyList( pxMutexHolderTCB ); } else { @@ -4079,7 +4111,11 @@ 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 ); + //Original Code From FreeRTOS 10.2.0 + //prvAddTaskToReadyList( pxTCB ); + //Segger StyleView Code + prvReaddTaskToReadyList( pxTCB ); + /* Return true to indicate that a context switch is required. This is only actually required in the corner case whereby @@ -5111,6 +5147,7 @@ const TickType_t xConstTickCount = xTickCount; /* 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 @@ -5127,12 +5164,14 @@ const TickType_t xConstTickCount = xTickCount; { /* 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 @@ -5162,11 +5201,13 @@ const TickType_t xConstTickCount = xTickCount; 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 -- 2.20.1.windows.1