I DID FREERTOS CHANGES for memory tracer

piero74 wrote on Friday, February 22, 2008:

Hi all. Hi Richard.

I did some little changes in task.c and queue.c, for adding the possibility for user to call an hook function when a task or queue is created, passing some parameters, to trace memory usage information and to save pointer for each task tcb for custom monitoring of stack grow. It could be possible do similar changes in function TaskDelete and QueueDelete. My actual version of freertos is 470

Below there are my changes (all changes have comment "piero" before). Any comments will be appreciate
Bye,
Piero

******************************
FOR TASK.C:
******************************

Changes since V4.3.1:

    + Added xTaskGetSchedulerState() function.
    + Added prvIsTaskSuspended() to take into account the Occurrence of
      vTaskResume() or vTaskResumeFromISR() being called passing in the
      handle of a task that appears in the Suspended list only because it
      is blocked on an event without a timeout being specified.
    + Updated xTaskCheckForTimeout() to take into account that tasks blocked
      using the Suspended list should never time out.

// ----------------------------------------------------------------------------…

--------------------------------
//        piero
Changes:
  + Added hook funtion in TaskCrete for user memory usage check
// ------------------------------------------------------------------------------------------------------------
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "FreeRTOS.h"
#include "task.h"

/*
* Macro to define the amount of stack available to the idle task.
*/
#define tskIDLE_STACK_SIZE    configMINIMAL_STACK_SIZE

// ------------------------------------------------------------------------------------------------------------
//        piero
// Additionale default definition
#ifndef configUSE_TASKCREATE_HOOK
  #define configUSE_TASKCREATE_HOOK 0
#endif
// ------------------------------------------------------------------------------------------------------------


        #if portSTACK_GROWTH < 0
        {
            pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 );
        }
        #else
        {
            pxTopOfStack = pxNewTCB->pxStack;   
        }
        #endif

// ------------------------------------------------------------------------------------------------------------
//        piero
    #if (configUSE_TASKCREATE_HOOK == 1)
        {
            extern void vApplicationTaskCreateHook( tskTCB * pxCurrentTCB, unsigned portSHORT usCurrentStackDepth );

            /* Call the user defined function from within the create task function. 
            This allows the application designer to add memory usage check.
            NOTE: vApplicationTaskCreateHook(…) MUST NOT, UNDER ANY CIRCUMSTANCES,
            CALL A FUNCTION THAT MIGHT BLOCK. */   
            vApplicationTaskCreateHook( pxNewTCB, usStackDepth );
        }
    #endif
// ------------------------------------------------------------------------------------------------------------

        /* Initialize the TCB stack to look as if the task was already running,
        but had been interrupted by the scheduler.  The return address is set
        to the start of the task function. Once the stack has been initialised
        the    top of stack variable is updated. */
        pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pvTaskCode, pvParameters );

******************************
FOR QUEUE.C:
******************************

/*
// ------------------------------------------------------------------------------------------------------------
//        piero
Changes:
  + Added hook funtion in QueueCreate for user memory usage check
// ------------------------------------------------------------------------------------------------------------
*/

#include <stdlib.h>
#include <string.h>
#include "FreeRTOS.h"
#include "task.h"
#include "croutine.h"

// ------------------------------------------------------------------------------------------------------------
//        piero
// Additionale default definition
#ifndef configUSE_QUEUECREATE_HOOK
  #define configUSE_QUEUECREATE_HOOK 0
#endif
// ------------------------------------------------------------------------------------------------------------

/*-----------------------------------------------------------
* PUBLIC LIST API documented in list.h
*----------------------------------------------------------*/

                /* Likewise ensure the event queues start with the correct state. */
                vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );
                vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );

// ------------------------------------------------------------------------------------------------------------
//        piero
        #if (configUSE_QUEUECREATE_HOOK == 1)
            {
                extern void vApplicationQueueCreateHook( xQUEUE *pxCurrentQueue, unsigned portBASE_TYPE uxCurrentQueueLength, unsigned portBASE_TYPE uxCurrentItemSize );

                /* Call the user defined function from within the create queue function. 
                This allows the application designer to add memory usage check.
                NOTE: vApplicationQueueCreateHook(…) MUST NOT, UNDER ANY CIRCUMSTANCES,
                CALL A FUNCTION THAT MIGHT BLOCK. */   
                vApplicationQueueCreateHook( pxNewQueue, uxQueueLength, portBASE_TYPE uxItemSize );;
            }
        #endif
// ------------------------------------------------------------------------------------------------------------

                return  pxNewQueue;

piero74 wrote on Wednesday, February 27, 2008:

I need feedback about this idea…

No answers???

Bye,
Piero

rtel wrote on Saturday, March 01, 2008:

I think the changes are very useful.  The next version of FreeRTOS.org will include a new set of trace macros, which will allows all scheduler events to be traced.

Regards.