/* | |
* FreeRTOS POSIX Demo V1.0.0 | |
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy of | |
* this software and associated documentation files (the "Software"), to deal in | |
* the Software without restriction, including without limitation the rights to | |
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
* the Software, and to permit persons to whom the Software is furnished to do so, | |
* subject to the following conditions: | |
* | |
* The above copyright notice and this permission notice shall be included in all | |
* copies or substantial portions of the Software. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
* | |
* http://www.FreeRTOS.org | |
* http://aws.amazon.com/freertos | |
* | |
* 1 tab == 4 spaces! | |
*/ | |
/* | |
****************************************************************************** | |
* -NOTE- The Win32 port is a simulation (or is that emulation?) only! Do not | |
* expect to get real time behaviour from the Win32 port or this demo | |
* application. It is provided as a convenient development and demonstration | |
* test bed only. This was tested using Windows 10 with Intel Core i7-6700 CPU. | |
* | |
* Windows will not be running the FreeRTOS simulator threads continuously, so | |
* the timing information has no meaningful units. See the documentation page for | |
* the Windows simulator for an explanation of the slow timing: | |
* http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html | |
* - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT - | |
* | |
* Documentation for this demo can be found on: | |
* http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/demo/posix_demo.html | |
****************************************************************************** | |
* | |
* | |
* /* FreeRTOS includes. */ | |
#include "FreeRTOS.h" | |
#include "task.h" | |
/* System headers */ | |
#include <stdio.h> | |
/* demo include */ | |
#include "posix_demo.h" | |
/* Demo task priority */ | |
#define mainPOSIX_DEMO_PRIORITY ( tskIDLE_PRIORITY + 4 ) | |
/*-----------------------------------------------------------*/ | |
int main( void ) | |
{ | |
configASSERT( ( mainPOSIX_DEMO_PRIORITY < configMAX_PRIORITIES ) ); | |
const uint32_t ulLongTime_ms = pdMS_TO_TICKS( 1000UL ); | |
printf( "FreeRTOS POSIX demo\n" ); | |
/* Start the task to run POSIX demo */ | |
xTaskCreate( vStartPOSIXDemo, | |
"posix", | |
configMINIMAL_STACK_SIZE, | |
NULL, | |
mainPOSIX_DEMO_PRIORITY, | |
NULL ); | |
vTaskStartScheduler(); | |
/* If all is well, the scheduler will now be running, and the following | |
* line will never be reached. If the following line does execute, then | |
* there was insufficient FreeRTOS heap memory available for the idle and/or | |
* timer tasks to be created. See the memory management section on the | |
* FreeRTOS web site for more details (this is standard text that is not | |
* really applicable to the Win32 simulator port). */ | |
for( ; ; ) | |
{ | |
Sleep( ulLongTime_ms ); | |
} | |
return 0; | |
} | |
/*-----------------------------------------------------------*/ | |
void vAssertCalled( const char * pcFile, | |
uint32_t ulLine ) | |
{ | |
const uint32_t ulLongSleep = 1000UL; | |
volatile uint32_t ulBlockVariable = 0UL; | |
volatile char * pcFileName = ( volatile char * ) pcFile; | |
volatile uint32_t ulLineNumber = ulLine; | |
( void ) pcFileName; | |
( void ) ulLineNumber; | |
printf( "vAssertCalled %s, %ld\n", pcFile, ( long ) ulLine ); | |
fflush( stdout ); | |
/* Setting ulBlockVariable to a non-zero value in the debugger will allow | |
* this function to be exited. */ | |
taskDISABLE_INTERRUPTS(); | |
{ | |
while( ulBlockVariable == 0UL ) | |
{ | |
Sleep( ulLongSleep ); | |
} | |
} | |
taskENABLE_INTERRUPTS(); | |
} | |
/*-----------------------------------------------------------*/ | |
/* 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 ) | |
{ | |
/* 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. */ | |
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. */ | |
*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. */ | |
*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 ) | |
{ | |
/* 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. */ | |
static StaticTask_t xTimerTaskTCB; | |
static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; | |
/* Pass out a pointer to the StaticTask_t structure in which the Timer | |
* 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, | |
* configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */ | |
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; | |
} | |
/*-----------------------------------------------------------*/ | |
/** | |
* @brief Warn user if pvPortMalloc fails. | |
* | |
* Called if a call to pvPortMalloc() fails because there is insufficient | |
* free memory available in the FreeRTOS heap. pvPortMalloc() is called | |
* internally by FreeRTOS API functions that create tasks, queues, software | |
* timers, and semaphores. The size of the FreeRTOS heap is set by the | |
* configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. | |
* | |
*/ | |
void vApplicationMallocFailedHook() | |
{ | |
taskDISABLE_INTERRUPTS(); | |
for( ; ; ) | |
{ | |
} | |
} |