mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
- Rework the StaticAllocation.c common demo file to reflect the changes to the static allocation object create functions from the previous check-in.
- Correct various typos in comments. - Add xTimerGetPeriod() function (feature request).
This commit is contained in:
parent
9dda62372c
commit
26d3770fad
|
@ -187,7 +187,7 @@
|
||||||
#undef trcKERNEL_HOOKS_TASK_RESUME
|
#undef trcKERNEL_HOOKS_TASK_RESUME
|
||||||
#define trcKERNEL_HOOKS_TASK_RESUME(SERVICE, pxTCB) \
|
#define trcKERNEL_HOOKS_TASK_RESUME(SERVICE, pxTCB) \
|
||||||
vTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB));
|
vTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB));
|
||||||
|
|
||||||
#undef trcKERNEL_HOOKS_TIMER_EVENT
|
#undef trcKERNEL_HOOKS_TIMER_EVENT
|
||||||
#define trcKERNEL_HOOKS_TIMER_EVENT(SERVICE, pxTimer) \
|
#define trcKERNEL_HOOKS_TIMER_EVENT(SERVICE, pxTimer) \
|
||||||
vTraceStoreKernelCall(SERVICE, TRACE_CLASS_TIMER, TRACE_GET_TIMER_NUMBER(pxTimer));
|
vTraceStoreKernelCall(SERVICE, TRACE_CLASS_TIMER, TRACE_GET_TIMER_NUMBER(pxTimer));
|
||||||
|
|
|
@ -5,30 +5,30 @@
|
||||||
* trcKernelPort.c
|
* trcKernelPort.c
|
||||||
*
|
*
|
||||||
* Kernel-specific functionality for FreeRTOS, used by the recorder library.
|
* Kernel-specific functionality for FreeRTOS, used by the recorder library.
|
||||||
*
|
*
|
||||||
* Terms of Use
|
* Terms of Use
|
||||||
* This software is copyright Percepio AB. The recorder library is free for
|
* This software is copyright Percepio AB. The recorder library is free for
|
||||||
* use together with Percepio products. You may distribute the recorder library
|
* use together with Percepio products. You may distribute the recorder library
|
||||||
* in its original form, including modifications in trcHardwarePort.c/.h
|
* in its original form, including modifications in trcHardwarePort.c/.h
|
||||||
* given that these modification are clearly marked as your own modifications
|
* given that these modification are clearly marked as your own modifications
|
||||||
* and documented in the initial comment section of these source files.
|
* and documented in the initial comment section of these source files.
|
||||||
* This software is the intellectual property of Percepio AB and may not be
|
* This software is the intellectual property of Percepio AB and may not be
|
||||||
* sold or in other ways commercially redistributed without explicit written
|
* sold or in other ways commercially redistributed without explicit written
|
||||||
* permission by Percepio AB.
|
* permission by Percepio AB.
|
||||||
*
|
*
|
||||||
* Disclaimer
|
* Disclaimer
|
||||||
* The trace tool and recorder library is being delivered to you AS IS and
|
* The trace tool and recorder library is being delivered to you AS IS and
|
||||||
* Percepio AB makes no warranty as to its use or performance. Percepio AB does
|
* Percepio AB makes no warranty as to its use or performance. Percepio AB does
|
||||||
* not and cannot warrant the performance or results you may obtain by using the
|
* not and cannot warrant the performance or results you may obtain by using the
|
||||||
* software or documentation. Percepio AB make no warranties, express or
|
* software or documentation. Percepio AB make no warranties, express or
|
||||||
* implied, as to noninfringement of third party rights, merchantability, or
|
* implied, as to noninfringement of third party rights, merchantability, or
|
||||||
* fitness for any particular purpose. In no event will Percepio AB, its
|
* fitness for any particular purpose. In no event will Percepio AB, its
|
||||||
* technology partners, or distributors be liable to you for any consequential,
|
* technology partners, or distributors be liable to you for any consequential,
|
||||||
* incidental or special damages, including any lost profits or lost savings,
|
* incidental or special damages, including any lost profits or lost savings,
|
||||||
* even if a representative of Percepio AB has been advised of the possibility
|
* even if a representative of Percepio AB has been advised of the possibility
|
||||||
* of such damages, or for any claim by any third party. Some jurisdictions do
|
* of such damages, or for any claim by any third party. Some jurisdictions do
|
||||||
* not allow the exclusion or limitation of incidental, consequential or special
|
* not allow the exclusion or limitation of incidental, consequential or special
|
||||||
* damages, or the exclusion of implied warranties or limitations on how long an
|
* damages, or the exclusion of implied warranties or limitations on how long an
|
||||||
* implied warranty may last, so the above limitations may not apply to you.
|
* implied warranty may last, so the above limitations may not apply to you.
|
||||||
*
|
*
|
||||||
* Tabs are used for indent in this file (1 tab = 4 spaces)
|
* Tabs are used for indent in this file (1 tab = 4 spaces)
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
/* For classes implemented as FreeRTOS Queues:
|
/* For classes implemented as FreeRTOS Queues:
|
||||||
This translates queue.type to the corresponding trace object class. */
|
This translates queue.type to the corresponding trace object class. */
|
||||||
traceObjectClass TraceObjectClassTable[5] = {
|
traceObjectClass TraceObjectClassTable[5] = {
|
||||||
TRACE_CLASS_QUEUE,
|
TRACE_CLASS_QUEUE,
|
||||||
|
@ -119,14 +119,14 @@ void vTraceInitObjectPropertyTable()
|
||||||
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = NTask;
|
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = NTask;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = NISR;
|
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = NISR;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = NTimer;
|
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = NTimer;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = NEventGroup;
|
RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = NEventGroup;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = NameLenQueue;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = NameLenQueue;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = NameLenSemaphore;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = NameLenSemaphore;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = NameLenMutex;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = NameLenMutex;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = NameLenTask;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = NameLenTask;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = NameLenISR;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = NameLenISR;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = NameLenTimer;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = NameLenTimer;
|
||||||
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = NameLenEventGroup;
|
RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = NameLenEventGroup;
|
||||||
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;
|
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;
|
||||||
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;
|
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;
|
||||||
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;
|
RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;
|
||||||
|
@ -163,7 +163,7 @@ void vTraceInitObjectHandleStack()
|
||||||
objectHandleStacks.highestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer - 1;
|
objectHandleStacks.highestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer - 1;
|
||||||
objectHandleStacks.highestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer + NEventGroup - 1;
|
objectHandleStacks.highestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer + NEventGroup - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the "Not enough handles" error message for this object class */
|
/* Returns the "Not enough handles" error message for this object class */
|
||||||
const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
|
const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
|
||||||
{
|
{
|
||||||
|
@ -182,7 +182,7 @@ const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
|
||||||
case TRACE_CLASS_TIMER:
|
case TRACE_CLASS_TIMER:
|
||||||
return "Not enough TIMER handles - increase NTimer in trcConfig.h";
|
return "Not enough TIMER handles - increase NTimer in trcConfig.h";
|
||||||
case TRACE_CLASS_EVENTGROUP:
|
case TRACE_CLASS_EVENTGROUP:
|
||||||
return "Not enough EVENTGROUP handles - increase NEventGroup in trcConfig.h";
|
return "Not enough EVENTGROUP handles - increase NEventGroup in trcConfig.h";
|
||||||
default:
|
default:
|
||||||
return "pszTraceGetErrorHandles: Invalid objectclass!";
|
return "pszTraceGetErrorHandles: Invalid objectclass!";
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType h
|
||||||
{
|
{
|
||||||
TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvTraceIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);
|
TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvTraceIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);
|
||||||
TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiTraceIsObjectExcluded: Invalid value for handle", 1);
|
TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiTraceIsObjectExcluded: Invalid value for handle", 1);
|
||||||
|
|
||||||
switch(objectclass)
|
switch(objectclass)
|
||||||
{
|
{
|
||||||
case TRACE_CLASS_TASK:
|
case TRACE_CLASS_TASK:
|
||||||
|
@ -205,13 +205,13 @@ uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType h
|
||||||
case TRACE_CLASS_QUEUE:
|
case TRACE_CLASS_QUEUE:
|
||||||
return TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);
|
return TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);
|
||||||
case TRACE_CLASS_TIMER:
|
case TRACE_CLASS_TIMER:
|
||||||
return TRACE_GET_TIMER_FLAG_ISEXCLUDED(handle);
|
return TRACE_GET_TIMER_FLAG_ISEXCLUDED(handle);
|
||||||
case TRACE_CLASS_EVENTGROUP:
|
case TRACE_CLASS_EVENTGROUP:
|
||||||
return TRACE_GET_EVENTGROUP_FLAG_ISEXCLUDED(handle);
|
return TRACE_GET_EVENTGROUP_FLAG_ISEXCLUDED(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");
|
vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");
|
||||||
|
|
||||||
/* Must never reach */
|
/* Must never reach */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -407,28 +407,53 @@ const uint32_t ulMaxDivisor = 0xff, ulDivisorShift = 0x08;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Idle task as its
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
the stack and so not exists after this function exits. */
|
||||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
static StaticTask_t xIdleTaskTCB;
|
||||||
*ppxIdleTaskTCBBuffer = NULL;
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
*ppxIdleTaskStackBuffer = NULL;
|
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
|
state will be stored. */
|
||||||
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
the stack and so not exists after this function exits. */
|
||||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
static StaticTask_t xTimerTaskTCB;
|
||||||
called. */
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||||
*ppxTimerTaskTCBBuffer = NULL;
|
|
||||||
*ppxTimerTaskStackBuffer = NULL;
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
task's state will be stored. */
|
||||||
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -222,28 +222,52 @@ void vApplicationTickHook( void )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Idle task as its
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
the stack and so not exists after this function exits. */
|
||||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
static StaticTask_t xIdleTaskTCB;
|
||||||
*ppxIdleTaskTCBBuffer = NULL;
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
*ppxIdleTaskStackBuffer = NULL;
|
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
|
state will be stored. */
|
||||||
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
the stack and so not exists after this function exits. */
|
||||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
static StaticTask_t xTimerTaskTCB;
|
||||||
called. */
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||||
*ppxTimerTaskTCBBuffer = NULL;
|
|
||||||
*ppxTimerTaskStackBuffer = NULL;
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
task's state will be stored. */
|
||||||
}
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -229,27 +229,51 @@ void vApplicationTickHook( void )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Idle task as its
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
the stack and so not exists after this function exits. */
|
||||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
static StaticTask_t xIdleTaskTCB;
|
||||||
*ppxIdleTaskTCBBuffer = NULL;
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
*ppxIdleTaskStackBuffer = NULL;
|
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
|
state will be stored. */
|
||||||
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
the stack and so not exists after this function exits. */
|
||||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
static StaticTask_t xTimerTaskTCB;
|
||||||
called. */
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||||
*ppxTimerTaskTCBBuffer = NULL;
|
|
||||||
*ppxTimerTaskStackBuffer = NULL;
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
task's state will be stored. */
|
||||||
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
|
@ -234,30 +234,54 @@ void vApplicationTickHook( void )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Idle task as its
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
the stack and so not exists after this function exits. */
|
||||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
static StaticTask_t xIdleTaskTCB;
|
||||||
*ppxIdleTaskTCBBuffer = NULL;
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
*ppxIdleTaskStackBuffer = NULL;
|
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
|
state will be stored. */
|
||||||
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
the stack and so not exists after this function exits. */
|
||||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
static StaticTask_t xTimerTaskTCB;
|
||||||
called. */
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||||
*ppxTimerTaskTCBBuffer = NULL;
|
|
||||||
*ppxTimerTaskStackBuffer = NULL;
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
task's state will be stored. */
|
||||||
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -241,35 +241,52 @@ volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* The buffers used by the idle task must be static so they are persistent, and
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
so exist after this function returns. */
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
|
the stack and so not exists after this function exits. */
|
||||||
static StaticTask_t xIdleTaskTCB;
|
static StaticTask_t xIdleTaskTCB;
|
||||||
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
|
|
||||||
/* configSUPORT_STATIC_ALLOCATION is set to 1 and
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
configSUPPORT_DYNAMIC_ALLOCATION is 0, so the application must supply the
|
state will be stored. */
|
||||||
buffers that will be used to hold the Idle task data structure and stack. */
|
|
||||||
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* The buffers used by the Timer/Daemon task must be static so they are
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
persistent, and so exist after this function returns. */
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
|
the stack and so not exists after this function exits. */
|
||||||
static StaticTask_t xTimerTaskTCB;
|
static StaticTask_t xTimerTaskTCB;
|
||||||
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||||
|
|
||||||
/* configSUPPORT_STATIC_ALLOCATION is set to 1,
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
configSUPPORT_DYNAMIC_ALLOCATION is set to 1, and configUSE_TIMERS is set
|
task's state will be stored. */
|
||||||
to 1, so the application must supply the buffers that will be used to hold
|
|
||||||
the Timer task data structure and stack. */
|
|
||||||
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -329,7 +329,7 @@ volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0;
|
||||||
( void ) ulLine;
|
( void ) ulLine;
|
||||||
( void ) pcFileName;
|
( void ) pcFileName;
|
||||||
|
|
||||||
printf( "ASSERT! Line %d, file %s\r\n", ulLine, pcFileName );
|
printf( "ASSERT! Line %d, file %s, GetLastError() %d\r\n", ulLine, pcFileName, GetLastError() );
|
||||||
|
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
|
@ -410,38 +410,51 @@ const HeapRegion_t xHeapRegions[] =
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||||
|
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||||
|
used by the Idle task. */
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||||
{
|
{
|
||||||
/* The buffers used by the idle task must be static so they are persistent, and
|
/* If the buffers to be provided to the Idle task are declared inside this
|
||||||
so exist after this function returns. */
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
|
the stack and so not exists after this function exits. */
|
||||||
static StaticTask_t xIdleTaskTCB;
|
static StaticTask_t xIdleTaskTCB;
|
||||||
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||||
|
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||||
opportunity to supply the buffers that will be used by the Idle task as its
|
state will be stored. */
|
||||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
|
||||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
|
||||||
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Idle task's stack. */
|
||||||
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||||
{
|
{
|
||||||
/* The buffers used by the Timer/Daemon task must be static so they are
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
persistent, and so exist after this function returns. The stack buffer is
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
not declared here, but globally, as it is checked by a test in a different
|
the stack and so not exists after this function exits. */
|
||||||
file. */
|
|
||||||
static StaticTask_t xTimerTaskTCB;
|
static StaticTask_t xTimerTaskTCB;
|
||||||
|
|
||||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
task's state will be stored. */
|
||||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
|
||||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
|
||||||
called. */
|
|
||||||
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
|
||||||
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
|
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||||
|
*pusTimerTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1616,7 +1616,7 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The registry is provided as a means for kernel aware debuggers to
|
* The queue registry is provided as a means for kernel aware debuggers to
|
||||||
* locate queues, semaphores and mutexes. Call pcQueueGetQueueName() to look
|
* locate queues, semaphores and mutexes. Call pcQueueGetQueueName() to look
|
||||||
* up and return the name of a queue in the queue registry from the queue's
|
* up and return the name of a queue in the queue registry from the queue's
|
||||||
* handle.
|
* handle.
|
||||||
|
|
|
@ -1152,11 +1152,11 @@ typedef QueueHandle_t SemaphoreHandle_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* semphr.h
|
* semphr.h
|
||||||
* <pre>TaskHandle_t xSemaphoreGetCount( SemaphoreHandle_t xMutex );</pre>
|
* <pre>UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xMutex );</pre>
|
||||||
*
|
*
|
||||||
* If the semaphore is a counting semaphore then xSemaphoreGetCount() returns
|
* If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns
|
||||||
* its current count value. If the semaphore is a binary semaphore then
|
* its current count value. If the semaphore is a binary semaphore then
|
||||||
* xSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the
|
* uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the
|
||||||
* semaphore is not available.
|
* semaphore is not available.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue