/*\r
- FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+ FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.\r
All rights reserved\r
\r
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
as this demo could easily create one large heap region instead of multiple\r
smaller heap regions - in which case heap_4.c would be the more appropriate\r
choice. See http://www.freertos.org/a00111.html for an explanation. */\r
-#define mainREGION_1_SIZE 4001\r
+#define mainREGION_1_SIZE 7001\r
#define mainREGION_2_SIZE 18105\r
-#define mainREGION_3_SIZE 1807\r
+#define mainREGION_3_SIZE 2807\r
\r
/*-----------------------------------------------------------*/\r
\r
void vApplicationIdleHook( void );\r
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );\r
void vApplicationTickHook( void );\r
-void vApplicationGetIdleTaskMemory( DummyTCB_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize );\r
-void vApplicationGetTimerTaskMemory( DummyTCB_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize );\r
+void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );\r
+void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize );\r
\r
/*\r
* Writes trace data to a disk file when the trace recording is stopped.\r
*/\r
static void prvSaveTraceFile( void );\r
\r
+/*-----------------------------------------------------------*/\r
+\r
+/* When configSUPPORT_STATIC_ALLOCATION is set to 1 the application writer can\r
+use a callback function to optionally provide the memory required by the idle\r
+and timer tasks. This is the stack that will be used by the timer task. It is\r
+declared here, as a global, so it can be checked by a test that is implemented\r
+in a different file. */\r
+StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];\r
+\r
/* The user trace event posted to the trace recording on each tick interrupt.\r
Note: This project runs under Windows, and Windows will not be executing the\r
RTOS threads continuously. Therefore tick events will not appear with a regular\r
-interval within the the trace recording. */\r
+interval within the trace recording. */\r
traceLabel xTickTraceUserEvent;\r
static portBASE_TYPE xTraceRunning = pdTRUE;\r
\r
}\r
/*-----------------------------------------------------------*/\r
\r
+void vApplicationDaemonTaskStartupHook( void )\r
+{\r
+ /* This function will be called once only, when the daemon task starts to\r
+ execute (sometimes called the timer task). This is useful if the\r
+ application includes initialisation code that would benefit from executing\r
+ after the scheduler has been started. */\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
void vAssertCalled( unsigned long ulLine, const char * const pcFileName )\r
{\r
static portBASE_TYPE xPrinted = pdFALSE;\r
( void ) ulLine;\r
( void ) pcFileName;\r
\r
- printf( "ASSERT! Line %d, file %s\r\n", ulLine, pcFileName );\r
+ printf( "ASSERT! Line %d, file %s, GetLastError() %d\r\n", ulLine, pcFileName, GetLastError() );\r
\r
taskENTER_CRITICAL();\r
{\r
}\r
/*-----------------------------------------------------------*/\r
\r
-void vApplicationGetIdleTaskMemory( DummyTCB_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )\r
+/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an\r
+implementation of vApplicationGetIdleTaskMemory() to provide the memory that is\r
+used by the Idle task. */\r
+void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )\r
{\r
-/* The buffers used by the idle task must be static so they are persistent, and\r
-so exist after this function returns. */\r
-static DummyTCB_t xIdleTaskTCB;\r
+/* If the buffers to be provided to the Idle task are declared inside this\r
+function then they must be declared static - otherwise they will be allocated on\r
+the stack and so not exists after this function exits. */\r
+static StaticTask_t xIdleTaskTCB;\r
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];\r
\r
- /* configUSE_STATIC_ALLOCATION is set to 1, so the application has the\r
- opportunity to supply the buffers that will be used by the Idle task as its\r
- stack and to hold its TCB. If these are set to NULL then the buffers will\r
- be allocated dynamically, just as if xTaskCreate() had been called. */\r
+ /* Pass out a pointer to the StaticTask_t structure in which the Idle task's\r
+ state will be stored. */\r
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;\r
+\r
+ /* Pass out the array that will be used as the Idle task's stack. */\r
*ppxIdleTaskStackBuffer = uxIdleTaskStack;\r
- *pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */\r
+\r
+ /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.\r
+ Note that, as the array is necessarily of type StackType_t,\r
+ configMINIMAL_STACK_SIZE is specified in words, not bytes. */\r
+ *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;\r
}\r
/*-----------------------------------------------------------*/\r
-DummyTCB_t xTimerTaskTCB;\r
-void vApplicationGetTimerTaskMemory( DummyTCB_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )\r
+\r
+/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the\r
+application must provide an implementation of vApplicationGetTimerTaskMemory()\r
+to provide the memory that is used by the Timer service task. */\r
+void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )\r
{\r
-/* The buffers used by the Timer/Daemon task must be static so they are\r
-persistent, and so exist after this function returns. */\r
-//static DummyTCB_t xTimerTaskTCB;\r
-static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];\r
-\r
- /* configUSE_STATIC_ALLOCATION is set to 1, so the application has the\r
- opportunity to supply the buffers that will be used by the Timer/RTOS daemon\r
- task as its stack and to hold its TCB. If these are set to NULL then the\r
- buffers will be allocated dynamically, just as if xTaskCreate() had been\r
- called. */\r
+/* If the buffers to be provided to the Timer task are declared inside this\r
+function then they must be declared static - otherwise they will be allocated on\r
+the stack and so not exists after this function exits. */\r
+static StaticTask_t xTimerTaskTCB;\r
+\r
+ /* Pass out a pointer to the StaticTask_t structure in which the Timer\r
+ task's state will be stored. */\r
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;\r
+\r
+ /* Pass out the array that will be used as the Timer task's stack. */\r
*ppxTimerTaskStackBuffer = uxTimerTaskStack;\r
- *pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */\r
+\r
+ /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.\r
+ Note that, as the array is necessarily of type StackType_t,\r
+ configMINIMAL_STACK_SIZE is specified in words, not bytes. */\r
+ *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;\r
}\r
\r