Francisco Paez / freertos-cm3

Dependents:   mbed_lpc1768_freertos_lib

Committer:
fep
Date:
Wed May 31 02:36:43 2017 +0000
Revision:
0:5ff20db10a96
FreeRTOS v9.0.0 for ARM Cortex-M3 based boards.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fep 0:5ff20db10a96 1 /*
fep 0:5ff20db10a96 2 FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
fep 0:5ff20db10a96 3 All rights reserved
fep 0:5ff20db10a96 4
fep 0:5ff20db10a96 5 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
fep 0:5ff20db10a96 6
fep 0:5ff20db10a96 7 This file is part of the FreeRTOS distribution.
fep 0:5ff20db10a96 8
fep 0:5ff20db10a96 9 FreeRTOS is free software; you can redistribute it and/or modify it under
fep 0:5ff20db10a96 10 the terms of the GNU General Public License (version 2) as published by the
fep 0:5ff20db10a96 11 Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
fep 0:5ff20db10a96 12
fep 0:5ff20db10a96 13 ***************************************************************************
fep 0:5ff20db10a96 14 >>! NOTE: The modification to the GPL is included to allow you to !<<
fep 0:5ff20db10a96 15 >>! distribute a combined work that includes FreeRTOS without being !<<
fep 0:5ff20db10a96 16 >>! obliged to provide the source code for proprietary components !<<
fep 0:5ff20db10a96 17 >>! outside of the FreeRTOS kernel. !<<
fep 0:5ff20db10a96 18 ***************************************************************************
fep 0:5ff20db10a96 19
fep 0:5ff20db10a96 20 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
fep 0:5ff20db10a96 21 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
fep 0:5ff20db10a96 22 FOR A PARTICULAR PURPOSE. Full license text is available on the following
fep 0:5ff20db10a96 23 link: http://www.freertos.org/a00114.html
fep 0:5ff20db10a96 24
fep 0:5ff20db10a96 25 ***************************************************************************
fep 0:5ff20db10a96 26 * *
fep 0:5ff20db10a96 27 * FreeRTOS provides completely free yet professionally developed, *
fep 0:5ff20db10a96 28 * robust, strictly quality controlled, supported, and cross *
fep 0:5ff20db10a96 29 * platform software that is more than just the market leader, it *
fep 0:5ff20db10a96 30 * is the industry's de facto standard. *
fep 0:5ff20db10a96 31 * *
fep 0:5ff20db10a96 32 * Help yourself get started quickly while simultaneously helping *
fep 0:5ff20db10a96 33 * to support the FreeRTOS project by purchasing a FreeRTOS *
fep 0:5ff20db10a96 34 * tutorial book, reference manual, or both: *
fep 0:5ff20db10a96 35 * http://www.FreeRTOS.org/Documentation *
fep 0:5ff20db10a96 36 * *
fep 0:5ff20db10a96 37 ***************************************************************************
fep 0:5ff20db10a96 38
fep 0:5ff20db10a96 39 http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
fep 0:5ff20db10a96 40 the FAQ page "My application does not run, what could be wrong?". Have you
fep 0:5ff20db10a96 41 defined configASSERT()?
fep 0:5ff20db10a96 42
fep 0:5ff20db10a96 43 http://www.FreeRTOS.org/support - In return for receiving this top quality
fep 0:5ff20db10a96 44 embedded software for free we request you assist our global community by
fep 0:5ff20db10a96 45 participating in the support forum.
fep 0:5ff20db10a96 46
fep 0:5ff20db10a96 47 http://www.FreeRTOS.org/training - Investing in training allows your team to
fep 0:5ff20db10a96 48 be as productive as possible as early as possible. Now you can receive
fep 0:5ff20db10a96 49 FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
fep 0:5ff20db10a96 50 Ltd, and the world's leading authority on the world's leading RTOS.
fep 0:5ff20db10a96 51
fep 0:5ff20db10a96 52 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
fep 0:5ff20db10a96 53 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
fep 0:5ff20db10a96 54 compatible FAT file system, and our tiny thread aware UDP/IP stack.
fep 0:5ff20db10a96 55
fep 0:5ff20db10a96 56 http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
fep 0:5ff20db10a96 57 Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
fep 0:5ff20db10a96 58
fep 0:5ff20db10a96 59 http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
fep 0:5ff20db10a96 60 Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
fep 0:5ff20db10a96 61 licenses offer ticketed support, indemnification and commercial middleware.
fep 0:5ff20db10a96 62
fep 0:5ff20db10a96 63 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
fep 0:5ff20db10a96 64 engineered and independently SIL3 certified version for use in safety and
fep 0:5ff20db10a96 65 mission critical applications that require provable dependability.
fep 0:5ff20db10a96 66
fep 0:5ff20db10a96 67 1 tab == 4 spaces!
fep 0:5ff20db10a96 68 */
fep 0:5ff20db10a96 69
fep 0:5ff20db10a96 70
fep 0:5ff20db10a96 71 /*
fep 0:5ff20db10a96 72 * The simplest possible implementation of pvPortMalloc(). Note that this
fep 0:5ff20db10a96 73 * implementation does NOT allow allocated memory to be freed again.
fep 0:5ff20db10a96 74 *
fep 0:5ff20db10a96 75 * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the
fep 0:5ff20db10a96 76 * memory management pages of http://www.FreeRTOS.org for more information.
fep 0:5ff20db10a96 77 */
fep 0:5ff20db10a96 78 #include <stdlib.h>
fep 0:5ff20db10a96 79
fep 0:5ff20db10a96 80 /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
fep 0:5ff20db10a96 81 all the API functions to use the MPU wrappers. That should only be done when
fep 0:5ff20db10a96 82 task.h is included from an application file. */
fep 0:5ff20db10a96 83 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
fep 0:5ff20db10a96 84
fep 0:5ff20db10a96 85 #include "FreeRTOS.h"
fep 0:5ff20db10a96 86 #include "task.h"
fep 0:5ff20db10a96 87
fep 0:5ff20db10a96 88 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
fep 0:5ff20db10a96 89
fep 0:5ff20db10a96 90 #if( configSUPPORT_DYNAMIC_ALLOCATION == 0 )
fep 0:5ff20db10a96 91 #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
fep 0:5ff20db10a96 92 #endif
fep 0:5ff20db10a96 93
fep 0:5ff20db10a96 94 /* A few bytes might be lost to byte aligning the heap start address. */
fep 0:5ff20db10a96 95 #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
fep 0:5ff20db10a96 96
fep 0:5ff20db10a96 97 /* Allocate the memory for the heap. */
fep 0:5ff20db10a96 98 /* Allocate the memory for the heap. */
fep 0:5ff20db10a96 99 #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
fep 0:5ff20db10a96 100 /* The application writer has already defined the array used for the RTOS
fep 0:5ff20db10a96 101 heap - probably so it can be placed in a special segment or address. */
fep 0:5ff20db10a96 102 extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
fep 0:5ff20db10a96 103 #else
fep 0:5ff20db10a96 104 static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
fep 0:5ff20db10a96 105 #endif /* configAPPLICATION_ALLOCATED_HEAP */
fep 0:5ff20db10a96 106
fep 0:5ff20db10a96 107 static size_t xNextFreeByte = ( size_t ) 0;
fep 0:5ff20db10a96 108
fep 0:5ff20db10a96 109 /*-----------------------------------------------------------*/
fep 0:5ff20db10a96 110
fep 0:5ff20db10a96 111 void *pvPortMalloc( size_t xWantedSize )
fep 0:5ff20db10a96 112 {
fep 0:5ff20db10a96 113 void *pvReturn = NULL;
fep 0:5ff20db10a96 114 static uint8_t *pucAlignedHeap = NULL;
fep 0:5ff20db10a96 115
fep 0:5ff20db10a96 116 /* Ensure that blocks are always aligned to the required number of bytes. */
fep 0:5ff20db10a96 117 #if( portBYTE_ALIGNMENT != 1 )
fep 0:5ff20db10a96 118 {
fep 0:5ff20db10a96 119 if( xWantedSize & portBYTE_ALIGNMENT_MASK )
fep 0:5ff20db10a96 120 {
fep 0:5ff20db10a96 121 /* Byte alignment required. */
fep 0:5ff20db10a96 122 xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
fep 0:5ff20db10a96 123 }
fep 0:5ff20db10a96 124 }
fep 0:5ff20db10a96 125 #endif
fep 0:5ff20db10a96 126
fep 0:5ff20db10a96 127 vTaskSuspendAll();
fep 0:5ff20db10a96 128 {
fep 0:5ff20db10a96 129 if( pucAlignedHeap == NULL )
fep 0:5ff20db10a96 130 {
fep 0:5ff20db10a96 131 /* Ensure the heap starts on a correctly aligned boundary. */
fep 0:5ff20db10a96 132 pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
fep 0:5ff20db10a96 133 }
fep 0:5ff20db10a96 134
fep 0:5ff20db10a96 135 /* Check there is enough room left for the allocation. */
fep 0:5ff20db10a96 136 if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) &&
fep 0:5ff20db10a96 137 ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */
fep 0:5ff20db10a96 138 {
fep 0:5ff20db10a96 139 /* Return the next free byte then increment the index past this
fep 0:5ff20db10a96 140 block. */
fep 0:5ff20db10a96 141 pvReturn = pucAlignedHeap + xNextFreeByte;
fep 0:5ff20db10a96 142 xNextFreeByte += xWantedSize;
fep 0:5ff20db10a96 143 }
fep 0:5ff20db10a96 144
fep 0:5ff20db10a96 145 traceMALLOC( pvReturn, xWantedSize );
fep 0:5ff20db10a96 146 }
fep 0:5ff20db10a96 147 ( void ) xTaskResumeAll();
fep 0:5ff20db10a96 148
fep 0:5ff20db10a96 149 #if( configUSE_MALLOC_FAILED_HOOK == 1 )
fep 0:5ff20db10a96 150 {
fep 0:5ff20db10a96 151 if( pvReturn == NULL )
fep 0:5ff20db10a96 152 {
fep 0:5ff20db10a96 153 extern void vApplicationMallocFailedHook( void );
fep 0:5ff20db10a96 154 vApplicationMallocFailedHook();
fep 0:5ff20db10a96 155 }
fep 0:5ff20db10a96 156 }
fep 0:5ff20db10a96 157 #endif
fep 0:5ff20db10a96 158
fep 0:5ff20db10a96 159 return pvReturn;
fep 0:5ff20db10a96 160 }
fep 0:5ff20db10a96 161 /*-----------------------------------------------------------*/
fep 0:5ff20db10a96 162
fep 0:5ff20db10a96 163 void vPortFree( void *pv )
fep 0:5ff20db10a96 164 {
fep 0:5ff20db10a96 165 /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and
fep 0:5ff20db10a96 166 heap_4.c for alternative implementations, and the memory management pages of
fep 0:5ff20db10a96 167 http://www.FreeRTOS.org for more information. */
fep 0:5ff20db10a96 168 ( void ) pv;
fep 0:5ff20db10a96 169
fep 0:5ff20db10a96 170 /* Force an assert as it is invalid to call this function. */
fep 0:5ff20db10a96 171 configASSERT( pv == NULL );
fep 0:5ff20db10a96 172 }
fep 0:5ff20db10a96 173 /*-----------------------------------------------------------*/
fep 0:5ff20db10a96 174
fep 0:5ff20db10a96 175 void vPortInitialiseBlocks( void )
fep 0:5ff20db10a96 176 {
fep 0:5ff20db10a96 177 /* Only required when static memory is not cleared. */
fep 0:5ff20db10a96 178 xNextFreeByte = ( size_t ) 0;
fep 0:5ff20db10a96 179 }
fep 0:5ff20db10a96 180 /*-----------------------------------------------------------*/
fep 0:5ff20db10a96 181
fep 0:5ff20db10a96 182 size_t xPortGetFreeHeapSize( void )
fep 0:5ff20db10a96 183 {
fep 0:5ff20db10a96 184 return ( configADJUSTED_HEAP_SIZE - xNextFreeByte );
fep 0:5ff20db10a96 185 }
fep 0:5ff20db10a96 186
fep 0:5ff20db10a96 187
fep 0:5ff20db10a96 188
fep 0:5ff20db10a96 189