@ -65,15 +65,15 @@
/* Local includes. */
# include "console.h"
# define BLINKY_DEMO 0
# define FULL_DEMO 1
# define BLINKY_DEMO 0
# define FULL_DEMO 1
# define mainSELECTED_APPLICATION BLINKY_DEMO
# define mainSELECTED_APPLICATION BLINKY_DEMO
# ifdef BUILD_DIR
# define BUILD BUILD_DIR
# define BUILD BUILD_DIR
# else
# define BUILD "./ "
# define BUILD "./ "
# endif
/* This demo uses heap_3.c (the libc provided malloc() and free()). */
@ -82,6 +82,7 @@
extern void main_blinky ( void ) ;
extern void main_full ( void ) ;
static void traceOnEnter ( void ) ;
/*
* Only the comprehensive demo uses application hook ( callback ) functions . See
* http : //www.freertos.org/a00016.html for more information.
@ -96,14 +97,14 @@ void vFullDemoIdleFunction( void );
void vApplicationMallocFailedHook ( void ) ;
void vApplicationIdleHook ( void ) ;
void vApplicationStackOverflowHook ( TaskHandle_t pxTask ,
char * pcTaskName ) ;
char * pcTaskName ) ;
void vApplicationTickHook ( void ) ;
void vApplicationGetIdleTaskMemory ( StaticTask_t * * ppxIdleTaskTCBBuffer ,
StackType_t * * ppxIdleTaskStackBuffer ,
uint32_t * pulIdleTaskStackSize ) ;
void vApplicationGetTimerTaskMemory ( StaticTask_t * * ppxTimerTaskTCBBuffer ,
StackType_t * * ppxTimerTaskStackBuffer ,
uint32_t * pulTimerTaskStackSize ) ;
void vApplicationGetIdleTaskMemory ( StaticTask_t * * ppxIdleTaskTCBBuffer ,
StackType_t * * ppxIdleTaskStackBuffer ,
uint32_t * pulIdleTaskStackSize ) ;
void vApplicationGetTimerTaskMemory ( StaticTask_t * * ppxTimerTaskTCBBuffer ,
StackType_t * * ppxTimerTaskStackBuffer ,
uint32_t * pulTimerTaskStackSize ) ;
/*
* Writes trace data to a disk file when the trace recording is stopped .
@ -115,15 +116,15 @@ static void prvSaveTraceFile( void );
* Signal handler for Ctrl_C to cause the program to exit , and generate the
* profiling info .
*/
static void handle_sigint ( int signal ) ;
static void handle_sigint ( int signal ) ;
/*-----------------------------------------------------------*/
/* When configSUPPORT_STATIC_ALLOCATION is set to 1 the application writer can
use a callback function to optionally provide the memory required by the idle
and timer tasks . This is the stack that will be used by the timer task . It is
declared here , as a global , so it can be checked by a test that is implemented
in a different file . */
* use a callback function to optionally provide the memory required by the idle
* and timer tasks . This is the stack that will be used by the timer task . It is
* declared here , as a global , so it can be checked by a test that is implemented
* in a different file . */
StackType_t uxTimerTaskStack [ configTIMER_TASK_STACK_DEPTH ] ;
/* Notes if the trace is running or not. */
@ -140,34 +141,34 @@ int main( void )
/* Do not include trace code when performing a code coverage analysis. */
# if ( projCOVERAGE_TEST != 1 )
{
/* Initialise the trace recorder. Use of the trace recorder is optional.
See http : //www.FreeRTOS.org/trace for more information. */
vTraceEnable ( TRC_START ) ;
/* Start the trace recording - the recording is written to a file if
configASSERT ( ) is called . */
printf ( " \r \n Trace started. \r \n The trace will be dumped to disk if a call to configASSERT() fails. \r \n " ) ;
printf ( " \r \n The trace will be dumped to disk if Enter is hit. \r \n " ) ;
uiTraceStart ( ) ;
}
{
/* Initialise the trace recorder. Use of the trace recorder is optional.
* See http : //www.FreeRTOS.org/trace for more information. */
vTraceEnable ( TRC_START ) ;
/* Start the trace recording - the recording is written to a file if
* configASSERT ( ) is called . */
printf ( " \r \n Trace started. \r \n The trace will be dumped to disk if a call to configASSERT() fails. \r \n " ) ;
printf ( " \r \n The trace will be dumped to disk if Enter is hit. \r \n " ) ;
uiTraceStart ( ) ;
}
# endif
console_init ( ) ;
# if ( mainSELECTED_APPLICATION == BLINKY_DEMO )
{
console_print ( " Starting echo blinky demo \n " ) ;
main_blinky ( ) ;
}
# elif ( mainSELECTED_APPLICATION == FULL_DEMO )
{
console_print ( " Starting full demo \n " ) ;
main_full ( ) ;
}
{
console_print ( " Starting echo blinky demo \n " ) ;
main_blinky ( ) ;
}
# elif ( mainSELECTED_APPLICATION == FULL_DEMO )
{
console_print ( " Starting full demo \n " ) ;
main_full ( ) ;
}
# else
{
# error "The selected demo is not valid"
}
{
# error "The selected demo is not valid"
}
# endif /* if ( mainSELECTED_APPLICATION ) */
return 0 ;
@ -177,17 +178,17 @@ int main( void )
void vApplicationMallocFailedHook ( void )
{
/* vApplicationMallocFailedHook() will only be called if
configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig . h . It is a hook
function that will get called if a call to pvPortMalloc ( ) fails .
pvPortMalloc ( ) is called internally by the kernel whenever a task , queue ,
timer or semaphore is created . It is also called by various parts of the
demo application . If heap_1 . c , heap_2 . c or heap_4 . c is being used , then the
size of the heap available to pvPortMalloc ( ) is defined by
configTOTAL_HEAP_SIZE in FreeRTOSConfig . h , and the xPortGetFreeHeapSize ( )
API function can be used to query the size of free heap space that remains
( although it does not provide information on how the remaining heap might be
fragmented ) . See http : //www.freertos.org/a00111.html for more
information . */
* configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig . h . It is a hook
* function that will get called if a call to pvPortMalloc ( ) fails .
* pvPortMalloc ( ) is called internally by the kernel whenever a task , queue ,
* timer or semaphore is created . It is also called by various parts of the
* demo application . If heap_1 . c , heap_2 . c or heap_4 . c is being used , then the
* size of the heap available to pvPortMalloc ( ) is defined by
* configTOTAL_HEAP_SIZE in FreeRTOSConfig . h , and the xPortGetFreeHeapSize ( )
* API function can be used to query the size of free heap space that remains
* ( although it does not provide information on how the remaining heap might be
* fragmented ) . See http : //www.freertos.org/a00111.html for more
* information . */
vAssertCalled ( __FILE__ , __LINE__ ) ;
}
/*-----------------------------------------------------------*/
@ -195,40 +196,40 @@ void vApplicationMallocFailedHook( void )
void vApplicationIdleHook ( void )
{
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
to 1 in FreeRTOSConfig . h . It will be called on each iteration of the idle
task . It is essential that code added to this hook function never attempts
to block in any way ( for example , call xQueueReceive ( ) with a block time
specified , or call vTaskDelay ( ) ) . If application tasks make use of the
vTaskDelete ( ) API function to delete themselves then it is also important
that vApplicationIdleHook ( ) is permitted to return to its calling function ,
because it is the responsibility of the idle task to clean up memory
allocated by the kernel to any task that has since deleted itself . */
* to 1 in FreeRTOSConfig . h . It will be called on each iteration of the idle
* task . It is essential that code added to this hook function never attempts
* to block in any way ( for example , call xQueueReceive ( ) with a block time
* specified , or call vTaskDelay ( ) ) . If application tasks make use of the
* vTaskDelete ( ) API function to delete themselves then it is also important
* that vApplicationIdleHook ( ) is permitted to return to its calling function ,
* because it is the responsibility of the idle task to clean up memory
* allocated by the kernel to any task that has since deleted itself . */
usleep ( 15000 ) ;
usleep ( 15000 ) ;
traceOnEnter ( ) ;
# if ( mainSELECTED_APPLICATION == FULL_DEMO )
{
/* Call the idle task processing used by the full demo. The simple
blinky demo does not use the idle task hook . */
vFullDemoIdleFunction ( ) ;
}
{
/* Call the idle task processing used by the full demo. The simple
* blinky demo does not use the idle task hook . */
vFullDemoIdleFunction ( ) ;
}
# endif
}
/*-----------------------------------------------------------*/
void vApplicationStackOverflowHook ( TaskHandle_t pxTask ,
char * pcTaskName )
char * pcTaskName )
{
( void ) pcTaskName ;
( void ) pxTask ;
/* Run time stack overflow checking is performed if
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
function is called if a stack overflow is detected . This function is
provided as an example only as stack overflow checking does not function
when running the FreeRTOS POSIX port . */
* configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
* function is called if a stack overflow is detected . This function is
* provided as an example only as stack overflow checking does not function
* when running the FreeRTOS POSIX port . */
vAssertCalled ( __FILE__ , __LINE__ ) ;
}
/*-----------------------------------------------------------*/
@ -236,15 +237,15 @@ void vApplicationStackOverflowHook( TaskHandle_t pxTask,
void vApplicationTickHook ( void )
{
/* This function will be called by each tick interrupt if
configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig . h . User code can be
added here , but the tick hook is called from an interrupt context , so
code must not attempt to block , and only the interrupt safe FreeRTOS API
functions can be used ( those that end in FromISR ( ) ) . */
* configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig . h . User code can be
* added here , but the tick hook is called from an interrupt context , so
* code must not attempt to block , and only the interrupt safe FreeRTOS API
* functions can be used ( those that end in FromISR ( ) ) . */
# if ( mainSELECTED_APPLICATION == FULL_DEMO )
{
vFullDemoTickHookFunction ( ) ;
}
# if ( mainSELECTED_APPLICATION == FULL_DEMO )
{
vFullDemoTickHookFunction ( ) ;
}
# endif /* mainSELECTED_APPLICATION */
}
@ -253,25 +254,28 @@ void traceOnEnter()
int xReturn ;
struct timeval tv = { 0L , 0L } ;
fd_set fds ;
FD_ZERO ( & fds ) ;
FD_ SET( 0 , & fds ) ;
xReturn = select ( 1 , & fds , NULL , NULL , & tv ) ;
if ( xReturn > 0 )
{
if ( x TraceRunning = = pdTRUE )
FD_ ZERO( & fds ) ;
FD_SET ( 0 , & fds ) ;
xReturn = select ( 1 , & fds , NULL , NULL , & tv ) ;
if ( x Return > 0 )
{
prvSaveTraceFile ( ) ;
}
/* clear the buffer */
char buffer [ 200 ] ;
read ( 1 , & buffer , 200 ) ;
if ( xTraceRunning = = pdTRUE )
{
prvSaveTraceFile ( ) ;
}
/* clear the buffer */
char buffer [ 200 ] ;
read ( 1 , & buffer , 200 ) ;
}
}
void vLoggingPrintf ( const char * pcFormat ,
void vLoggingPrintf ( const char * pcFormat ,
. . . )
{
va_list arg ;
va_list arg ;
va_start ( arg , pcFormat ) ;
vprintf ( pcFormat , arg ) ;
@ -282,20 +286,20 @@ va_list arg;
void vApplicationDaemonTaskStartupHook ( void )
{
/* This function will be called once only, when the daemon task starts to
execute ( sometimes called the timer task ) . This is useful if the
application includes initialisation code that would benefit from executing
after the scheduler has been started . */
* execute ( sometimes called the timer task ) . This is useful if the
* application includes initialisation code that would benefit from executing
* after the scheduler has been started . */
}
/*-----------------------------------------------------------*/
void vAssertCalled ( const char * const pcFileName ,
unsigned long ulLine )
{
static BaseType_t xPrinted = pdFALSE ;
volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0 ;
static BaseType_t xPrinted = pdFALSE ;
volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0 ;
/* Called if an assertion passed to configASSERT() fails. See
http : //www.freertos.org/a00110.html#configASSERT for more information. */
* http : //www.freertos.org/a00110.html#configASSERT for more information. */
/* Parameters are not used. */
( void ) ulLine ;
@ -316,8 +320,8 @@ volatile uint32_t ulSetToNonZeroInDebuggerToContinue = 0;
}
/* You can step out of this function to debug the assertion by using
the debugger to set ulSetToNonZeroInDebuggerToContinue to a non - zero
value . */
* the debugger to set ulSetToNonZeroInDebuggerToContinue to a non - zero
* value . */
while ( ulSetToNonZeroInDebuggerToContinue = = 0 )
{
__asm volatile ( " NOP " ) ;
@ -332,77 +336,77 @@ static void prvSaveTraceFile( void )
{
/* Tracing is not used when code coverage analysis is being performed. */
# if ( projCOVERAGE_TEST != 1 )
{
FILE * pxOutputFile ;
{
FILE * pxOutputFile ;
vTraceStop ( ) ;
vTraceStop ( ) ;
pxOutputFile = fopen ( " Trace.dump " , " wb " ) ;
pxOutputFile = fopen ( " Trace.dump " , " wb " ) ;
if ( pxOutputFile ! = NULL )
{
fwrite ( RecorderDataPtr , sizeof ( RecorderDataType ) , 1 , pxOutputFile ) ;
fclose ( pxOutputFile ) ;
printf ( " \r \n Trace output saved to Trace.dump \r \n " ) ;
}
else
{
printf ( " \r \n Failed to create trace dump file \r \n " ) ;
if ( pxOutputFile ! = NULL )
{
fwrite ( RecorderDataPtr , sizeof ( RecorderDataType ) , 1 , pxOutputFile ) ;
fclose ( pxOutputFile ) ;
printf ( " \r \n Trace output saved to Trace.dump \r \n " ) ;
}
else
{
printf ( " \r \n Failed to create trace dump file \r \n " ) ;
}
}
}
# endif /* if ( projCOVERAGE_TEST != 1 ) */
}
/*-----------------------------------------------------------*/
/* 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 ,
uint32_t * pulIdleTaskStackSize )
* implementation of vApplicationGetIdleTaskMemory ( ) to provide the memory that is
* used by the Idle task . */
void vApplicationGetIdleTaskMemory ( StaticTask_t * * ppxIdleTaskTCBBuffer ,
StackType_t * * ppxIdleTaskStackBuffer ,
uint32_t * pulIdleTaskStackSize )
{
/* If the buffers to be provided to the Idle task are declared inside this
function then they must be declared static - otherwise they will be allocated on
the stack and so not exists after this function exits . */
* 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 StackType_t uxIdleTaskStack [ configMINIMAL_STACK_SIZE ] ;
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
state will be stored . */
* 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 . */
* Note that , as the array is necessarily of type StackType_t ,
* configMINIMAL_STACK_SIZE is specified in words , not bytes . */
* pulIdleTaskStackSize = 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 ,
uint32_t * pulTimerTaskStackSize )
* 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 ,
uint32_t * pulTimerTaskStackSize )
{
/* If the buffers to be provided to the Timer task are declared inside this
function then they must be declared static - otherwise they will be allocated on
the stack and so not exists after this function exits . */
* 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 ;
/* Pass out a pointer to the StaticTask_t structure in which the Timer
task ' s state will be stored . */
* 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 . */
* Note that , as the array is necessarily of type StackType_t ,
* configMINIMAL_STACK_SIZE is specified in words , not bytes . */
* pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH ;
}
@ -414,5 +418,6 @@ void handle_sigint( int signal )
{
printf ( " chdir into %s error is %d \n " , BUILD , errno ) ;
}
exit ( 1 ) ;
}