2 * FreeRTOS Kernel V10.6.1
3 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5 * SPDX-License-Identifier: MIT
7 * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 * this software and associated documentation files (the "Software"), to deal in
9 * the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 * https://www.FreeRTOS.org
25 * https://github.com/FreeRTOS
30 * Implementation of the wrapper functions used to raise the processor privilege
31 * before calling a standard FreeRTOS API function.
34 /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
35 * all the API functions to use the MPU wrappers. That should only be done when
36 * task.h is included from an application file. */
37 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
39 /* Scheduler includes. */
44 #include "event_groups.h"
45 #include "stream_buffer.h"
46 #include "mpu_prototypes.h"
48 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
49 /*-----------------------------------------------------------*/
51 #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
53 #ifndef configPROTECTED_KERNEL_OBJECT_POOL_SIZE
54 #error configPROTECTED_KERNEL_OBJECT_POOL_SIZE must be defined to maximum number of kernel objects in the application.
58 * @brief Offset added to the index before returning to the user.
60 * If the actual handle is stored at index i, ( i + INDEX_OFFSET )
61 * is returned to the user.
63 #define INDEX_OFFSET 1
66 * @brief Opaque type for a kernel object.
69 typedef struct OpaqueObject * OpaqueObjectHandle_t;
72 * @brief Defines kernel object in the kernel object pool.
74 typedef struct KernelObject
76 OpaqueObjectHandle_t xInternalObjectHandle;
77 uint32_t ulKernelObjectType;
78 void * pvKernelObjectData;
82 * @brief Kernel object types.
84 #define KERNEL_OBJECT_TYPE_INVALID ( 0UL )
85 #define KERNEL_OBJECT_TYPE_QUEUE ( 1UL )
86 #define KERNEL_OBJECT_TYPE_TASK ( 2UL )
87 #define KERNEL_OBJECT_TYPE_STREAM_BUFFER ( 3UL )
88 #define KERNEL_OBJECT_TYPE_EVENT_GROUP ( 4UL )
89 #define KERNEL_OBJECT_TYPE_TIMER ( 5UL )
92 * @brief Checks whether an external index is valid or not.
94 #define IS_EXTERNAL_INDEX_VALID( lIndex ) \
95 ( ( ( lIndex ) >= INDEX_OFFSET ) && \
96 ( ( lIndex ) < ( configPROTECTED_KERNEL_OBJECT_POOL_SIZE + INDEX_OFFSET ) ) )
99 * @brief Checks whether an internal index is valid or not.
101 #define IS_INTERNAL_INDEX_VALID( lIndex ) \
102 ( ( ( lIndex ) >= 0 ) && \
103 ( ( lIndex ) < ( configPROTECTED_KERNEL_OBJECT_POOL_SIZE ) ) )
106 * @brief Converts an internal index into external.
108 #define CONVERT_TO_EXTERNAL_INDEX( lIndex ) ( ( lIndex ) + INDEX_OFFSET )
111 * @brief Converts an external index into internal.
113 #define CONVERT_TO_INTERNAL_INDEX( lIndex ) ( ( lIndex ) - INDEX_OFFSET )
116 * @brief Max value that fits in a uint32_t type.
118 #define mpuUINT32_MAX ( ~( ( uint32_t ) 0 ) )
121 * @brief Check if multiplying a and b will result in overflow.
123 #define mpuMULTIPLY_UINT32_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( mpuUINT32_MAX / ( a ) ) ) )
126 * @brief Get the index of a free slot in the kernel object pool.
128 * If a free slot is found, this function marks the slot as
131 * @return Index of a free slot is returned, if a free slot is
132 * found. Otherwise -1 is returned.
134 static int32_t MPU_GetFreeIndexInKernelObjectPool( void ) PRIVILEGED_FUNCTION;
137 * @brief Set the given index as free in the kernel object pool.
139 * @param lIndex The index to set as free.
141 static void MPU_SetIndexFreeInKernelObjectPool( int32_t lIndex ) PRIVILEGED_FUNCTION;
144 * @brief Get the index at which a given kernel object is stored.
146 * @param xHandle The given kernel object handle.
147 * @param ulKernelObjectType The kernel object type.
149 * @return Index at which the kernel object is stored if it is a valid
150 * handle, -1 otherwise.
152 static int32_t MPU_GetIndexForHandle( OpaqueObjectHandle_t xHandle,
153 uint32_t ulKernelObjectType ) PRIVILEGED_FUNCTION;
156 * @brief Store the given kernel object handle at the given index in
157 * the kernel object pool.
159 * @param lIndex Index to store the given handle at.
160 * @param xHandle Kernel object handle to store.
161 * @param pvKernelObjectData The data associated with the kernel object.
162 * Currently, only used for timer objects to store timer callback.
163 * @param ulKernelObjectType The kernel object type.
165 static void MPU_StoreHandleAndDataAtIndex( int32_t lIndex,
166 OpaqueObjectHandle_t xHandle,
167 void * pvKernelObjectData,
168 uint32_t ulKernelObjectType ) PRIVILEGED_FUNCTION;
171 * @brief Get the kernel object handle at the given index from
172 * the kernel object pool.
174 * @param lIndex Index at which to get the kernel object handle.
175 * @param ulKernelObjectType The kernel object type.
177 * @return The kernel object handle at the index.
179 static OpaqueObjectHandle_t MPU_GetHandleAtIndex( int32_t lIndex,
180 uint32_t ulKernelObjectType ) PRIVILEGED_FUNCTION;
182 #if ( configUSE_TIMERS == 1 )
185 * @brief The function registered as callback for all the timers.
187 * We intercept all the timer callbacks so that we can call application
188 * callbacks with opaque handle.
190 * @param xInternalHandle The internal timer handle.
192 static void MPU_TimerCallback( TimerHandle_t xInternalHandle ) PRIVILEGED_FUNCTION;
194 #endif /* #if ( configUSE_TIMERS == 1 ) */
197 * Wrappers to keep all the casting in one place.
199 #define MPU_StoreQueueHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_QUEUE )
200 #define MPU_GetQueueHandleAtIndex( lIndex ) ( QueueHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_QUEUE )
202 #if ( configUSE_QUEUE_SETS == 1 )
203 #define MPU_StoreQueueSetHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_QUEUE )
204 #define MPU_GetQueueSetHandleAtIndex( lIndex ) ( QueueSetHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_QUEUE )
205 #define MPU_StoreQueueSetMemberHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_QUEUE )
206 #define MPU_GetQueueSetMemberHandleAtIndex( lIndex ) ( QueueSetMemberHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_QUEUE )
207 #define MPU_GetIndexForQueueSetMemberHandle( xHandle ) MPU_GetIndexForHandle( ( OpaqueObjectHandle_t ) xHandle, KERNEL_OBJECT_TYPE_QUEUE )
211 * Wrappers to keep all the casting in one place for Task APIs.
213 #define MPU_StoreTaskHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_TASK )
214 #define MPU_GetTaskHandleAtIndex( lIndex ) ( TaskHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_TASK )
215 #define MPU_GetIndexForTaskHandle( xHandle ) MPU_GetIndexForHandle( ( OpaqueObjectHandle_t ) xHandle, KERNEL_OBJECT_TYPE_TASK )
218 * Wrappers to keep all the casting in one place for Event Group APIs.
220 #define MPU_StoreEventGroupHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_EVENT_GROUP )
221 #define MPU_GetEventGroupHandleAtIndex( lIndex ) ( EventGroupHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_EVENT_GROUP )
222 #define MPU_GetIndexForEventGroupHandle( xHandle ) MPU_GetIndexForHandle( ( OpaqueObjectHandle_t ) xHandle, KERNEL_OBJECT_TYPE_EVENT_GROUP )
225 * Wrappers to keep all the casting in one place for Stream Buffer APIs.
227 #define MPU_StoreStreamBufferHandleAtIndex( lIndex, xHandle ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, NULL, KERNEL_OBJECT_TYPE_STREAM_BUFFER )
228 #define MPU_GetStreamBufferHandleAtIndex( lIndex ) ( StreamBufferHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_STREAM_BUFFER )
229 #define MPU_GetIndexForStreamBufferHandle( xHandle ) MPU_GetIndexForHandle( ( OpaqueObjectHandle_t ) xHandle, KERNEL_OBJECT_TYPE_STREAM_BUFFER )
231 #if ( configUSE_TIMERS == 1 )
234 * Wrappers to keep all the casting in one place for Timer APIs.
236 #define MPU_StoreTimerHandleAtIndex( lIndex, xHandle, pxApplicationCallback ) MPU_StoreHandleAndDataAtIndex( lIndex, ( OpaqueObjectHandle_t ) xHandle, ( void * ) pxApplicationCallback, KERNEL_OBJECT_TYPE_TIMER )
237 #define MPU_GetTimerHandleAtIndex( lIndex ) ( TimerHandle_t ) MPU_GetHandleAtIndex( lIndex, KERNEL_OBJECT_TYPE_TIMER )
238 #define MPU_GetIndexForTimerHandle( xHandle ) MPU_GetIndexForHandle( ( OpaqueObjectHandle_t ) xHandle, KERNEL_OBJECT_TYPE_TIMER )
240 #endif /* #if ( configUSE_TIMERS == 1 ) */
242 /*-----------------------------------------------------------*/
245 * @brief Kernel object pool.
247 PRIVILEGED_DATA static KernelObject_t xKernelObjectPool[ configPROTECTED_KERNEL_OBJECT_POOL_SIZE ] = { NULL };
248 /*-----------------------------------------------------------*/
250 static int32_t MPU_GetFreeIndexInKernelObjectPool( void ) /* PRIVILEGED_FUNCTION */
252 int32_t i, lFreeIndex = -1;
254 /* This function is called only from resource create APIs
255 * which are not supposed to be called from ISRs. Therefore,
256 * we only need to suspend the scheduler and do not require
257 * critical section. */
260 for( i = 0; i < configPROTECTED_KERNEL_OBJECT_POOL_SIZE; i++ )
262 if( xKernelObjectPool[ i ].xInternalObjectHandle == NULL )
264 /* Mark this index as not free. */
265 xKernelObjectPool[ i ].xInternalObjectHandle = ( OpaqueObjectHandle_t ) ( ~0 );
275 /*-----------------------------------------------------------*/
277 static void MPU_SetIndexFreeInKernelObjectPool( int32_t lIndex ) /* PRIVILEGED_FUNCTION */
279 configASSERT( IS_INTERNAL_INDEX_VALID( lIndex ) != pdFALSE );
281 taskENTER_CRITICAL();
283 xKernelObjectPool[ lIndex ].xInternalObjectHandle = NULL;
284 xKernelObjectPool[ lIndex ].ulKernelObjectType = KERNEL_OBJECT_TYPE_INVALID;
285 xKernelObjectPool[ lIndex ].pvKernelObjectData = NULL;
289 /*-----------------------------------------------------------*/
291 static int32_t MPU_GetIndexForHandle( OpaqueObjectHandle_t xHandle,
292 uint32_t ulKernelObjectType ) /* PRIVILEGED_FUNCTION */
294 int32_t i, lIndex = -1;
296 configASSERT( xHandle != NULL );
298 for( i = 0; i < configPROTECTED_KERNEL_OBJECT_POOL_SIZE; i++ )
300 if( ( xKernelObjectPool[ i ].xInternalObjectHandle == xHandle ) &&
301 ( xKernelObjectPool[ i ].ulKernelObjectType == ulKernelObjectType ) )
310 /*-----------------------------------------------------------*/
312 static void MPU_StoreHandleAndDataAtIndex( int32_t lIndex,
313 OpaqueObjectHandle_t xHandle,
314 void * pvKernelObjectData,
315 uint32_t ulKernelObjectType ) /* PRIVILEGED_FUNCTION */
317 configASSERT( IS_INTERNAL_INDEX_VALID( lIndex ) != pdFALSE );
318 xKernelObjectPool[ lIndex ].xInternalObjectHandle = xHandle;
319 xKernelObjectPool[ lIndex ].ulKernelObjectType = ulKernelObjectType;
320 xKernelObjectPool[ lIndex ].pvKernelObjectData = pvKernelObjectData;
322 /*-----------------------------------------------------------*/
324 static OpaqueObjectHandle_t MPU_GetHandleAtIndex( int32_t lIndex,
325 uint32_t ulKernelObjectType ) /* PRIVILEGED_FUNCTION */
327 configASSERT( IS_INTERNAL_INDEX_VALID( lIndex ) != pdFALSE );
328 configASSERT( xKernelObjectPool[ lIndex ].ulKernelObjectType == ulKernelObjectType );
329 return xKernelObjectPool[ lIndex ].xInternalObjectHandle;
331 /*-----------------------------------------------------------*/
333 #if ( configUSE_TIMERS == 1 )
335 static void MPU_TimerCallback( TimerHandle_t xInternalHandle ) /* PRIVILEGED_FUNCTION */
337 int32_t i, lIndex = -1;
338 TimerHandle_t xExternalHandle = NULL;
339 TimerCallbackFunction_t pxApplicationCallBack = NULL;
341 /* Coming from the timer task and therefore, should be valid. */
342 configASSERT( xInternalHandle != NULL );
344 for( i = 0; i < configPROTECTED_KERNEL_OBJECT_POOL_SIZE; i++ )
346 if( ( ( TimerHandle_t ) xKernelObjectPool[ i ].xInternalObjectHandle == xInternalHandle ) &&
347 ( xKernelObjectPool[ i ].ulKernelObjectType == KERNEL_OBJECT_TYPE_TIMER ) )
354 configASSERT( lIndex != -1 );
355 xExternalHandle = ( TimerHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
357 pxApplicationCallBack = ( TimerCallbackFunction_t ) xKernelObjectPool[ lIndex ].pvKernelObjectData;
358 pxApplicationCallBack( xExternalHandle );
361 #endif /* #if ( configUSE_TIMERS == 1 ) */
362 /*-----------------------------------------------------------*/
364 /*-----------------------------------------------------------*/
365 /* MPU wrappers for tasks APIs. */
366 /*-----------------------------------------------------------*/
368 #if ( INCLUDE_xTaskDelayUntil == 1 )
370 BaseType_t MPU_xTaskDelayUntilImpl( TickType_t * const pxPreviousWakeTime,
371 TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION;
373 BaseType_t MPU_xTaskDelayUntilImpl( TickType_t * const pxPreviousWakeTime,
374 TickType_t xTimeIncrement ) /* PRIVILEGED_FUNCTION */
376 BaseType_t xReturn = pdFAIL;
377 BaseType_t xIsPreviousWakeTimeAccessible = pdFALSE;
379 if( ( pxPreviousWakeTime != NULL ) && ( xTimeIncrement > 0U ) )
381 xIsPreviousWakeTimeAccessible = xPortIsAuthorizedToAccessBuffer( pxPreviousWakeTime,
382 sizeof( TickType_t ),
383 ( tskMPU_WRITE_PERMISSION | tskMPU_READ_PERMISSION ) );
385 if( xIsPreviousWakeTimeAccessible == pdTRUE )
387 xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement );
394 #endif /* if ( INCLUDE_xTaskDelayUntil == 1 ) */
395 /*-----------------------------------------------------------*/
397 #if ( INCLUDE_xTaskAbortDelay == 1 )
399 BaseType_t MPU_xTaskAbortDelayImpl( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
401 BaseType_t MPU_xTaskAbortDelayImpl( TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
403 BaseType_t xReturn = pdFAIL;
404 TaskHandle_t xInternalTaskHandle = NULL;
407 lIndex = ( int32_t ) xTask;
409 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
411 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
413 if( xInternalTaskHandle != NULL )
415 xReturn = xTaskAbortDelay( xInternalTaskHandle );
422 #endif /* if ( INCLUDE_xTaskAbortDelay == 1 ) */
423 /*-----------------------------------------------------------*/
425 #if ( INCLUDE_vTaskDelay == 1 )
427 void MPU_vTaskDelayImpl( TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION;
429 void MPU_vTaskDelayImpl( TickType_t xTicksToDelay ) /* PRIVILEGED_FUNCTION */
431 vTaskDelay( xTicksToDelay );
434 #endif /* if ( INCLUDE_vTaskDelay == 1 ) */
435 /*-----------------------------------------------------------*/
437 #if ( INCLUDE_uxTaskPriorityGet == 1 )
439 UBaseType_t MPU_uxTaskPriorityGetImpl( const TaskHandle_t pxTask ) PRIVILEGED_FUNCTION;
441 UBaseType_t MPU_uxTaskPriorityGetImpl( const TaskHandle_t pxTask ) /* PRIVILEGED_FUNCTION */
443 UBaseType_t uxReturn = configMAX_PRIORITIES;
445 TaskHandle_t xInternalTaskHandle = NULL;
449 uxReturn = uxTaskPriorityGet( pxTask );
453 lIndex = ( int32_t ) pxTask;
455 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
457 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
459 if( xInternalTaskHandle != NULL )
461 uxReturn = uxTaskPriorityGet( xInternalTaskHandle );
469 #endif /* if ( INCLUDE_uxTaskPriorityGet == 1 ) */
470 /*-----------------------------------------------------------*/
472 #if ( INCLUDE_eTaskGetState == 1 )
474 eTaskState MPU_eTaskGetStateImpl( TaskHandle_t pxTask ) PRIVILEGED_FUNCTION;
476 eTaskState MPU_eTaskGetStateImpl( TaskHandle_t pxTask ) /* PRIVILEGED_FUNCTION */
478 eTaskState eReturn = eInvalid;
479 TaskHandle_t xInternalTaskHandle = NULL;
482 lIndex = ( int32_t ) pxTask;
484 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
486 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
488 if( xInternalTaskHandle != NULL )
490 eReturn = eTaskGetState( xInternalTaskHandle );
497 #endif /* if ( INCLUDE_eTaskGetState == 1 ) */
498 /*-----------------------------------------------------------*/
500 #if ( configUSE_TRACE_FACILITY == 1 )
502 void MPU_vTaskGetInfoImpl( TaskHandle_t xTask,
503 TaskStatus_t * pxTaskStatus,
504 BaseType_t xGetFreeStackSpace,
505 eTaskState eState ) PRIVILEGED_FUNCTION;
507 void MPU_vTaskGetInfoImpl( TaskHandle_t xTask,
508 TaskStatus_t * pxTaskStatus,
509 BaseType_t xGetFreeStackSpace,
510 eTaskState eState ) /* PRIVILEGED_FUNCTION */
513 TaskHandle_t xInternalTaskHandle = NULL;
514 BaseType_t xIsTaskStatusWriteable = pdFALSE;
516 xIsTaskStatusWriteable = xPortIsAuthorizedToAccessBuffer( pxTaskStatus,
517 sizeof( TaskStatus_t ),
518 tskMPU_WRITE_PERMISSION );
520 if( xIsTaskStatusWriteable == pdTRUE )
524 vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState );
528 lIndex = ( int32_t ) xTask;
530 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
532 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
534 if( xInternalTaskHandle != NULL )
536 vTaskGetInfo( xInternalTaskHandle, pxTaskStatus, xGetFreeStackSpace, eState );
543 #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */
544 /*-----------------------------------------------------------*/
546 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
548 TaskHandle_t MPU_xTaskGetIdleTaskHandleImpl( void ) PRIVILEGED_FUNCTION;
550 TaskHandle_t MPU_xTaskGetIdleTaskHandleImpl( void ) /* PRIVILEGED_FUNCTION */
552 TaskHandle_t xIdleTaskHandle = NULL;
554 xIdleTaskHandle = xTaskGetIdleTaskHandle();
556 return xIdleTaskHandle;
559 #endif /* if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */
560 /*-----------------------------------------------------------*/
562 #if ( INCLUDE_vTaskSuspend == 1 )
564 void MPU_vTaskSuspendImpl( TaskHandle_t pxTaskToSuspend ) PRIVILEGED_FUNCTION;
566 void MPU_vTaskSuspendImpl( TaskHandle_t pxTaskToSuspend ) /* PRIVILEGED_FUNCTION */
569 TaskHandle_t xInternalTaskHandle = NULL;
571 if( pxTaskToSuspend == NULL )
573 vTaskSuspend( pxTaskToSuspend );
577 /* After the scheduler starts, only privileged tasks are allowed
578 * to suspend other tasks. */
579 #if ( INCLUDE_xTaskGetSchedulerState == 1 )
580 if( ( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED ) || ( portIS_TASK_PRIVILEGED() == pdTRUE ) )
582 if( portIS_TASK_PRIVILEGED() == pdTRUE )
585 lIndex = ( int32_t ) pxTaskToSuspend;
587 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
589 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
591 if( xInternalTaskHandle != NULL )
593 vTaskSuspend( xInternalTaskHandle );
600 #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */
601 /*-----------------------------------------------------------*/
603 #if ( INCLUDE_vTaskSuspend == 1 )
605 void MPU_vTaskResumeImpl( TaskHandle_t pxTaskToResume ) PRIVILEGED_FUNCTION;
607 void MPU_vTaskResumeImpl( TaskHandle_t pxTaskToResume ) /* PRIVILEGED_FUNCTION */
610 TaskHandle_t xInternalTaskHandle = NULL;
612 lIndex = ( int32_t ) pxTaskToResume;
614 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
616 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
618 if( xInternalTaskHandle != NULL )
620 vTaskResume( xInternalTaskHandle );
625 #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */
626 /*-----------------------------------------------------------*/
628 TickType_t MPU_xTaskGetTickCountImpl( void ) PRIVILEGED_FUNCTION;
630 TickType_t MPU_xTaskGetTickCountImpl( void ) /* PRIVILEGED_FUNCTION */
634 xReturn = xTaskGetTickCount();
638 /*-----------------------------------------------------------*/
640 UBaseType_t MPU_uxTaskGetNumberOfTasksImpl( void ) PRIVILEGED_FUNCTION;
642 UBaseType_t MPU_uxTaskGetNumberOfTasksImpl( void ) /* PRIVILEGED_FUNCTION */
644 UBaseType_t uxReturn;
646 uxReturn = uxTaskGetNumberOfTasks();
650 /*-----------------------------------------------------------*/
652 char * MPU_pcTaskGetNameImpl( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION;
654 char * MPU_pcTaskGetNameImpl( TaskHandle_t xTaskToQuery ) /* PRIVILEGED_FUNCTION */
656 char * pcReturn = NULL;
658 TaskHandle_t xInternalTaskHandle = NULL;
660 if( xTaskToQuery == NULL )
662 pcReturn = pcTaskGetName( xTaskToQuery );
666 lIndex = ( int32_t ) xTaskToQuery;
668 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
670 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
672 if( xInternalTaskHandle != NULL )
674 pcReturn = pcTaskGetName( xInternalTaskHandle );
681 /*-----------------------------------------------------------*/
683 #if ( configGENERATE_RUN_TIME_STATS == 1 )
685 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounterImpl( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
687 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounterImpl( const TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
689 configRUN_TIME_COUNTER_TYPE xReturn = 0;
691 TaskHandle_t xInternalTaskHandle = NULL;
695 xReturn = ulTaskGetRunTimeCounter( xTask );
699 lIndex = ( int32_t ) xTask;
701 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
703 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
705 if( xInternalTaskHandle != NULL )
707 xReturn = ulTaskGetRunTimeCounter( xInternalTaskHandle );
715 #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) */
716 /*-----------------------------------------------------------*/
718 #if ( configGENERATE_RUN_TIME_STATS == 1 )
720 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercentImpl( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
722 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercentImpl( const TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
724 configRUN_TIME_COUNTER_TYPE xReturn = 0;
726 TaskHandle_t xInternalTaskHandle = NULL;
730 xReturn = ulTaskGetRunTimePercent( xTask );
734 lIndex = ( int32_t ) xTask;
736 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
738 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
740 if( xInternalTaskHandle != NULL )
742 xReturn = ulTaskGetRunTimePercent( xInternalTaskHandle );
750 #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) */
751 /*-----------------------------------------------------------*/
753 #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )
755 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercentImpl( void ) PRIVILEGED_FUNCTION;
757 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercentImpl( void ) /* PRIVILEGED_FUNCTION */
759 configRUN_TIME_COUNTER_TYPE xReturn;
761 xReturn = ulTaskGetIdleRunTimePercent();
766 #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */
767 /*-----------------------------------------------------------*/
769 #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )
771 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounterImpl( void ) PRIVILEGED_FUNCTION;
773 configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounterImpl( void ) /* PRIVILEGED_FUNCTION */
775 configRUN_TIME_COUNTER_TYPE xReturn;
777 xReturn = ulTaskGetIdleRunTimeCounter();
782 #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */
783 /*-----------------------------------------------------------*/
785 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
787 void MPU_vTaskSetApplicationTaskTagImpl( TaskHandle_t xTask,
788 TaskHookFunction_t pxTagValue ) PRIVILEGED_FUNCTION;
790 void MPU_vTaskSetApplicationTaskTagImpl( TaskHandle_t xTask,
791 TaskHookFunction_t pxTagValue ) /* PRIVILEGED_FUNCTION */
793 TaskHandle_t xInternalTaskHandle = NULL;
798 vTaskSetApplicationTaskTag( xTask, pxTagValue );
802 lIndex = ( int32_t ) xTask;
804 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
806 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
808 if( xInternalTaskHandle != NULL )
810 vTaskSetApplicationTaskTag( xInternalTaskHandle, pxTagValue );
816 #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */
817 /*-----------------------------------------------------------*/
819 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
821 TaskHookFunction_t MPU_xTaskGetApplicationTaskTagImpl( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
823 TaskHookFunction_t MPU_xTaskGetApplicationTaskTagImpl( TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
825 TaskHookFunction_t xReturn = NULL;
827 TaskHandle_t xInternalTaskHandle = NULL;
831 xReturn = xTaskGetApplicationTaskTag( xTask );
835 lIndex = ( int32_t ) xTask;
837 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
839 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
841 if( xInternalTaskHandle != NULL )
843 xReturn = xTaskGetApplicationTaskTag( xInternalTaskHandle );
851 #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */
852 /*-----------------------------------------------------------*/
854 #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
856 void MPU_vTaskSetThreadLocalStoragePointerImpl( TaskHandle_t xTaskToSet,
858 void * pvValue ) PRIVILEGED_FUNCTION;
860 void MPU_vTaskSetThreadLocalStoragePointerImpl( TaskHandle_t xTaskToSet,
862 void * pvValue ) /* PRIVILEGED_FUNCTION */
865 TaskHandle_t xInternalTaskHandle = NULL;
867 if( xTaskToSet == NULL )
869 vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue );
873 lIndex = ( int32_t ) xTaskToSet;
875 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
877 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
879 if( xInternalTaskHandle != NULL )
881 vTaskSetThreadLocalStoragePointer( xInternalTaskHandle, xIndex, pvValue );
887 #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */
888 /*-----------------------------------------------------------*/
890 #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
892 void * MPU_pvTaskGetThreadLocalStoragePointerImpl( TaskHandle_t xTaskToQuery,
893 BaseType_t xIndex ) PRIVILEGED_FUNCTION;
895 void * MPU_pvTaskGetThreadLocalStoragePointerImpl( TaskHandle_t xTaskToQuery,
896 BaseType_t xIndex ) /* PRIVILEGED_FUNCTION */
898 void * pvReturn = NULL;
900 TaskHandle_t xInternalTaskHandle = NULL;
902 if( xTaskToQuery == NULL )
904 pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex );
908 lIndex = ( int32_t ) xTaskToQuery;
910 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
912 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
914 if( xInternalTaskHandle != NULL )
916 pvReturn = pvTaskGetThreadLocalStoragePointer( xInternalTaskHandle, xIndex );
924 #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */
925 /*-----------------------------------------------------------*/
927 #if ( configUSE_TRACE_FACILITY == 1 )
929 UBaseType_t MPU_uxTaskGetSystemStateImpl( TaskStatus_t * pxTaskStatusArray,
930 UBaseType_t uxArraySize,
931 configRUN_TIME_COUNTER_TYPE * pulTotalRunTime ) PRIVILEGED_FUNCTION;
933 UBaseType_t MPU_uxTaskGetSystemStateImpl( TaskStatus_t * pxTaskStatusArray,
934 UBaseType_t uxArraySize,
935 configRUN_TIME_COUNTER_TYPE * pulTotalRunTime ) /* PRIVILEGED_FUNCTION */
937 UBaseType_t uxReturn = 0;
938 UBaseType_t xIsTaskStatusArrayWriteable = pdFALSE;
939 UBaseType_t xIsTotalRunTimeWriteable = pdFALSE;
940 uint32_t ulArraySize = ( uint32_t ) uxArraySize;
941 uint32_t ulTaskStatusSize = ( uint32_t ) sizeof( TaskStatus_t );
943 if( mpuMULTIPLY_UINT32_WILL_OVERFLOW( ulTaskStatusSize, ulArraySize ) == 0 )
945 xIsTaskStatusArrayWriteable = xPortIsAuthorizedToAccessBuffer( pxTaskStatusArray,
946 ulTaskStatusSize * ulArraySize,
947 tskMPU_WRITE_PERMISSION );
949 if( pulTotalRunTime != NULL )
951 xIsTotalRunTimeWriteable = xPortIsAuthorizedToAccessBuffer( pulTotalRunTime,
952 sizeof( configRUN_TIME_COUNTER_TYPE ),
953 tskMPU_WRITE_PERMISSION );
956 if( ( xIsTaskStatusArrayWriteable == pdTRUE ) &&
957 ( ( pulTotalRunTime == NULL ) || ( xIsTotalRunTimeWriteable == pdTRUE ) ) )
959 uxReturn = uxTaskGetSystemState( pxTaskStatusArray, ( UBaseType_t ) ulArraySize, pulTotalRunTime );
966 #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */
967 /*-----------------------------------------------------------*/
969 #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )
971 UBaseType_t MPU_uxTaskGetStackHighWaterMarkImpl( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
973 UBaseType_t MPU_uxTaskGetStackHighWaterMarkImpl( TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
975 UBaseType_t uxReturn = 0;
977 TaskHandle_t xInternalTaskHandle = NULL;
981 uxReturn = uxTaskGetStackHighWaterMark( xTask );
985 lIndex = ( int32_t ) xTask;
987 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
989 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
991 if( xInternalTaskHandle != NULL )
993 uxReturn = uxTaskGetStackHighWaterMark( xInternalTaskHandle );
1001 #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) */
1002 /*-----------------------------------------------------------*/
1004 #if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 )
1006 configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2Impl( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
1008 configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2Impl( TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
1010 configSTACK_DEPTH_TYPE uxReturn = 0;
1012 TaskHandle_t xInternalTaskHandle = NULL;
1016 uxReturn = uxTaskGetStackHighWaterMark2( xTask );
1020 lIndex = ( int32_t ) xTask;
1022 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1024 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1026 if( xInternalTaskHandle != NULL )
1028 uxReturn = uxTaskGetStackHighWaterMark2( xInternalTaskHandle );
1036 #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) */
1037 /*-----------------------------------------------------------*/
1039 #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )
1041 TaskHandle_t MPU_xTaskGetCurrentTaskHandleImpl( void ) PRIVILEGED_FUNCTION;
1043 TaskHandle_t MPU_xTaskGetCurrentTaskHandleImpl( void ) /* PRIVILEGED_FUNCTION */
1045 TaskHandle_t xInternalTaskHandle = NULL;
1046 TaskHandle_t xExternalTaskHandle = NULL;
1049 xInternalTaskHandle = xTaskGetCurrentTaskHandle();
1051 if( xInternalTaskHandle != NULL )
1053 lIndex = MPU_GetIndexForTaskHandle( xInternalTaskHandle );
1057 xExternalTaskHandle = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1061 return xExternalTaskHandle;
1064 #endif /* if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */
1065 /*-----------------------------------------------------------*/
1067 #if ( INCLUDE_xTaskGetSchedulerState == 1 )
1069 BaseType_t MPU_xTaskGetSchedulerStateImpl( void ) PRIVILEGED_FUNCTION;
1071 BaseType_t MPU_xTaskGetSchedulerStateImpl( void ) /* PRIVILEGED_FUNCTION */
1073 BaseType_t xReturn = taskSCHEDULER_NOT_STARTED;
1075 xReturn = xTaskGetSchedulerState();
1080 #endif /* if ( INCLUDE_xTaskGetSchedulerState == 1 ) */
1081 /*-----------------------------------------------------------*/
1083 void MPU_vTaskSetTimeOutStateImpl( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
1085 void MPU_vTaskSetTimeOutStateImpl( TimeOut_t * const pxTimeOut ) /* PRIVILEGED_FUNCTION */
1087 BaseType_t xIsTimeOutWriteable = pdFALSE;
1089 if( pxTimeOut != NULL )
1091 xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
1092 sizeof( TimeOut_t ),
1093 tskMPU_WRITE_PERMISSION );
1095 if( xIsTimeOutWriteable == pdTRUE )
1097 vTaskSetTimeOutState( pxTimeOut );
1101 /*-----------------------------------------------------------*/
1103 BaseType_t MPU_xTaskCheckForTimeOutImpl( TimeOut_t * const pxTimeOut,
1104 TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;
1106 BaseType_t MPU_xTaskCheckForTimeOutImpl( TimeOut_t * const pxTimeOut,
1107 TickType_t * const pxTicksToWait ) /* PRIVILEGED_FUNCTION */
1109 BaseType_t xReturn = pdFALSE;
1110 BaseType_t xIsTimeOutWriteable = pdFALSE;
1111 BaseType_t xIsTicksToWaitWriteable = pdFALSE;
1113 if( ( pxTimeOut != NULL ) && ( pxTicksToWait != NULL ) )
1115 xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
1116 sizeof( TimeOut_t ),
1117 tskMPU_WRITE_PERMISSION );
1118 xIsTicksToWaitWriteable = xPortIsAuthorizedToAccessBuffer( pxTicksToWait,
1119 sizeof( TickType_t ),
1120 tskMPU_WRITE_PERMISSION );
1122 if( ( xIsTimeOutWriteable == pdTRUE ) && ( xIsTicksToWaitWriteable == pdTRUE ) )
1124 xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait );
1130 /*-----------------------------------------------------------*/
1132 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1134 BaseType_t MPU_xTaskGenericNotifyImpl( TaskHandle_t xTaskToNotify,
1135 UBaseType_t uxIndexToNotify,
1137 eNotifyAction eAction,
1138 uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION;
1140 BaseType_t MPU_xTaskGenericNotifyImpl( TaskHandle_t xTaskToNotify,
1141 UBaseType_t uxIndexToNotify,
1143 eNotifyAction eAction,
1144 uint32_t * pulPreviousNotificationValue ) /* PRIVILEGED_FUNCTION */
1146 BaseType_t xReturn = pdFAIL;
1148 TaskHandle_t xInternalTaskHandle = NULL;
1149 BaseType_t xIsPreviousNotificationValueWriteable = pdFALSE;
1151 if( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES )
1153 if( pulPreviousNotificationValue != NULL )
1155 xIsPreviousNotificationValueWriteable = xPortIsAuthorizedToAccessBuffer( pulPreviousNotificationValue,
1157 tskMPU_WRITE_PERMISSION );
1160 if( ( pulPreviousNotificationValue == NULL ) || ( xIsPreviousNotificationValueWriteable == pdTRUE ) )
1162 lIndex = ( int32_t ) xTaskToNotify;
1164 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1166 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1168 if( xInternalTaskHandle != NULL )
1170 xReturn = xTaskGenericNotify( xInternalTaskHandle, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue );
1179 #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1180 /*-----------------------------------------------------------*/
1182 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1184 BaseType_t MPU_xTaskGenericNotifyWaitImpl( UBaseType_t uxIndexToWaitOn,
1185 uint32_t ulBitsToClearOnEntry,
1186 uint32_t ulBitsToClearOnExit,
1187 uint32_t * pulNotificationValue,
1188 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1190 BaseType_t MPU_xTaskGenericNotifyWaitImpl( UBaseType_t uxIndexToWaitOn,
1191 uint32_t ulBitsToClearOnEntry,
1192 uint32_t ulBitsToClearOnExit,
1193 uint32_t * pulNotificationValue,
1194 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
1196 BaseType_t xReturn = pdFAIL;
1197 BaseType_t xIsNotificationValueWritable = pdFALSE;
1199 if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
1201 if( pulNotificationValue != NULL )
1203 xIsNotificationValueWritable = xPortIsAuthorizedToAccessBuffer( pulNotificationValue,
1205 tskMPU_WRITE_PERMISSION );
1208 if( ( pulNotificationValue == NULL ) || ( xIsNotificationValueWritable == pdTRUE ) )
1210 xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );
1217 #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1218 /*-----------------------------------------------------------*/
1220 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1222 uint32_t MPU_ulTaskGenericNotifyTakeImpl( UBaseType_t uxIndexToWaitOn,
1223 BaseType_t xClearCountOnExit,
1224 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1226 uint32_t MPU_ulTaskGenericNotifyTakeImpl( UBaseType_t uxIndexToWaitOn,
1227 BaseType_t xClearCountOnExit,
1228 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
1230 uint32_t ulReturn = 0;
1232 if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
1234 ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait );
1240 #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1241 /*-----------------------------------------------------------*/
1243 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1245 BaseType_t MPU_xTaskGenericNotifyStateClearImpl( TaskHandle_t xTask,
1246 UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION;
1248 BaseType_t MPU_xTaskGenericNotifyStateClearImpl( TaskHandle_t xTask,
1249 UBaseType_t uxIndexToClear ) /* PRIVILEGED_FUNCTION */
1251 BaseType_t xReturn = pdFAIL;
1253 TaskHandle_t xInternalTaskHandle = NULL;
1255 if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
1259 xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear );
1263 lIndex = ( int32_t ) xTask;
1265 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1267 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1269 if( xInternalTaskHandle != NULL )
1271 xReturn = xTaskGenericNotifyStateClear( xInternalTaskHandle, uxIndexToClear );
1280 #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1281 /*-----------------------------------------------------------*/
1283 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1285 uint32_t MPU_ulTaskGenericNotifyValueClearImpl( TaskHandle_t xTask,
1286 UBaseType_t uxIndexToClear,
1287 uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;
1289 uint32_t MPU_ulTaskGenericNotifyValueClearImpl( TaskHandle_t xTask,
1290 UBaseType_t uxIndexToClear,
1291 uint32_t ulBitsToClear ) /* PRIVILEGED_FUNCTION */
1293 uint32_t ulReturn = 0;
1295 TaskHandle_t xInternalTaskHandle = NULL;
1297 if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
1301 ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear );
1305 lIndex = ( int32_t ) xTask;
1307 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1309 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1311 if( xInternalTaskHandle != NULL )
1313 ulReturn = ulTaskGenericNotifyValueClear( xInternalTaskHandle, uxIndexToClear, ulBitsToClear );
1322 #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1323 /*-----------------------------------------------------------*/
1325 /* Privileged only wrappers for Task APIs. These are needed so that
1326 * the application can use opaque handles maintained in mpu_wrappers.c
1327 * with all the APIs. */
1328 /*-----------------------------------------------------------*/
1330 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
1332 BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode,
1333 const char * const pcName,
1334 uint16_t usStackDepth,
1335 void * pvParameters,
1336 UBaseType_t uxPriority,
1337 TaskHandle_t * pxCreatedTask ) /* PRIVILEGED_FUNCTION */
1339 BaseType_t xReturn = pdFAIL;
1341 TaskHandle_t xInternalTaskHandle = NULL;
1343 lIndex = MPU_GetFreeIndexInKernelObjectPool();
1347 /* xTaskCreate() can only be used to create privileged tasks in MPU port. */
1348 if( ( uxPriority & portPRIVILEGE_BIT ) != 0 )
1350 xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, &( xInternalTaskHandle ) );
1352 if( ( xReturn == pdPASS ) && ( xInternalTaskHandle != NULL ) )
1354 MPU_StoreTaskHandleAtIndex( lIndex, xInternalTaskHandle );
1356 if( pxCreatedTask != NULL )
1358 *pxCreatedTask = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1363 MPU_SetIndexFreeInKernelObjectPool( lIndex );
1371 #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
1372 /*-----------------------------------------------------------*/
1374 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
1376 TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,
1377 const char * const pcName,
1378 const uint32_t ulStackDepth,
1379 void * const pvParameters,
1380 UBaseType_t uxPriority,
1381 StackType_t * const puxStackBuffer,
1382 StaticTask_t * const pxTaskBuffer ) /* PRIVILEGED_FUNCTION */
1384 TaskHandle_t xExternalTaskHandle = NULL;
1385 TaskHandle_t xInternalTaskHandle = NULL;
1388 lIndex = MPU_GetFreeIndexInKernelObjectPool();
1392 xInternalTaskHandle = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer );
1394 if( xInternalTaskHandle != NULL )
1396 MPU_StoreTaskHandleAtIndex( lIndex, xInternalTaskHandle );
1397 xExternalTaskHandle = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1401 MPU_SetIndexFreeInKernelObjectPool( lIndex );
1405 return xExternalTaskHandle;
1408 #endif /* configSUPPORT_STATIC_ALLOCATION */
1409 /*-----------------------------------------------------------*/
1411 #if ( INCLUDE_vTaskDelete == 1 )
1413 void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) /* PRIVILEGED_FUNCTION */
1415 TaskHandle_t xInternalTaskHandle = NULL;
1418 if( pxTaskToDelete == NULL )
1420 xInternalTaskHandle = xTaskGetCurrentTaskHandle();
1421 lIndex = MPU_GetIndexForTaskHandle( xInternalTaskHandle );
1423 vTaskDelete( xInternalTaskHandle );
1427 MPU_SetIndexFreeInKernelObjectPool( lIndex );
1432 lIndex = ( int32_t ) pxTaskToDelete;
1434 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1436 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1438 if( xInternalTaskHandle != NULL )
1440 vTaskDelete( xInternalTaskHandle );
1441 MPU_SetIndexFreeInKernelObjectPool( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1447 #endif /* #if ( INCLUDE_vTaskDelete == 1 ) */
1448 /*-----------------------------------------------------------*/
1451 #if ( INCLUDE_vTaskPrioritySet == 1 )
1453 void MPU_vTaskPrioritySet( TaskHandle_t pxTask,
1454 UBaseType_t uxNewPriority ) /* PRIVILEGED_FUNCTION */
1456 TaskHandle_t xInternalTaskHandle = NULL;
1459 if( pxTask == NULL )
1461 vTaskPrioritySet( pxTask, uxNewPriority );
1465 lIndex = ( int32_t ) pxTask;
1467 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1469 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1471 if( xInternalTaskHandle != NULL )
1473 vTaskPrioritySet( xInternalTaskHandle, uxNewPriority );
1479 #endif /* if ( INCLUDE_vTaskPrioritySet == 1 ) */
1480 /*-----------------------------------------------------------*/
1482 #if ( INCLUDE_xTaskGetHandle == 1 )
1484 TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) /* PRIVILEGED_FUNCTION */
1486 TaskHandle_t xInternalTaskHandle = NULL;
1487 TaskHandle_t xExternalTaskHandle = NULL;
1490 xInternalTaskHandle = xTaskGetHandle( pcNameToQuery );
1492 if( xInternalTaskHandle != NULL )
1494 lIndex = MPU_GetIndexForTaskHandle( xInternalTaskHandle );
1498 xExternalTaskHandle = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1502 return xExternalTaskHandle;
1505 #endif /* if ( INCLUDE_xTaskGetHandle == 1 ) */
1506 /*-----------------------------------------------------------*/
1509 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
1511 BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,
1512 void * pvParameter ) /* PRIVILEGED_FUNCTION */
1514 BaseType_t xReturn = pdFAIL;
1516 TaskHandle_t xInternalTaskHandle = NULL;
1520 xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter );
1524 lIndex = ( int32_t ) xTask;
1526 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1528 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1530 if( xInternalTaskHandle != NULL )
1532 xReturn = xTaskCallApplicationTaskHook( xInternalTaskHandle, pvParameter );
1540 #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */
1541 /*-----------------------------------------------------------*/
1543 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
1545 BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
1546 TaskHandle_t * pxCreatedTask ) /* PRIVILEGED_FUNCTION */
1548 BaseType_t xReturn = pdFAIL;
1550 TaskHandle_t xInternalTaskHandle = NULL;
1552 lIndex = MPU_GetFreeIndexInKernelObjectPool();
1556 xReturn = xTaskCreateRestricted( pxTaskDefinition, &( xInternalTaskHandle ) );
1558 if( ( xReturn == pdPASS ) && ( xInternalTaskHandle != NULL ) )
1560 MPU_StoreTaskHandleAtIndex( lIndex, xInternalTaskHandle );
1562 if( pxCreatedTask != NULL )
1564 *pxCreatedTask = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1569 MPU_SetIndexFreeInKernelObjectPool( lIndex );
1576 #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
1577 /*-----------------------------------------------------------*/
1579 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
1581 BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,
1582 TaskHandle_t * pxCreatedTask ) /* PRIVILEGED_FUNCTION */
1584 BaseType_t xReturn = pdFAIL;
1586 TaskHandle_t xInternalTaskHandle = NULL;
1588 lIndex = MPU_GetFreeIndexInKernelObjectPool();
1592 xReturn = xTaskCreateRestrictedStatic( pxTaskDefinition, &( xInternalTaskHandle ) );
1594 if( ( xReturn == pdPASS ) && ( xInternalTaskHandle != NULL ) )
1596 MPU_StoreTaskHandleAtIndex( lIndex, xInternalTaskHandle );
1598 if( pxCreatedTask != NULL )
1600 *pxCreatedTask = ( TaskHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
1605 MPU_SetIndexFreeInKernelObjectPool( lIndex );
1612 #endif /* configSUPPORT_STATIC_ALLOCATION */
1613 /*-----------------------------------------------------------*/
1615 void MPU_vTaskAllocateMPURegions( TaskHandle_t xTaskToModify,
1616 const MemoryRegion_t * const xRegions ) /* PRIVILEGED_FUNCTION */
1618 TaskHandle_t xInternalTaskHandle = NULL;
1621 if( xTaskToModify == NULL )
1623 vTaskAllocateMPURegions( xTaskToModify, xRegions );
1627 lIndex = ( int32_t ) xTaskToModify;
1629 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1631 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1633 if( xInternalTaskHandle != NULL )
1635 vTaskAllocateMPURegions( xInternalTaskHandle, xRegions );
1640 /*-----------------------------------------------------------*/
1642 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
1644 BaseType_t MPU_xTaskGetStaticBuffers( TaskHandle_t xTask,
1645 StackType_t ** ppuxStackBuffer,
1646 StaticTask_t ** ppxTaskBuffer ) /* PRIVILEGED_FUNCTION */
1648 TaskHandle_t xInternalTaskHandle = NULL;
1650 BaseType_t xReturn = pdFALSE;
1654 xInternalTaskHandle = xTaskGetCurrentTaskHandle();
1655 xReturn = xTaskGetStaticBuffers( xInternalTaskHandle, ppuxStackBuffer, ppxTaskBuffer );
1659 lIndex = ( int32_t ) xTask;
1661 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1663 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1665 if( xInternalTaskHandle != NULL )
1667 xReturn = xTaskGetStaticBuffers( xInternalTaskHandle, ppuxStackBuffer, ppxTaskBuffer );
1675 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
1676 /*-----------------------------------------------------------*/
1678 #if ( INCLUDE_uxTaskPriorityGet == 1 )
1680 UBaseType_t MPU_uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
1682 UBaseType_t uxReturn = configMAX_PRIORITIES;
1684 TaskHandle_t xInternalTaskHandle = NULL;
1688 uxReturn = uxTaskPriorityGetFromISR( xTask );
1692 lIndex = ( int32_t ) xTask;
1694 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1696 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1698 if( xInternalTaskHandle != NULL )
1700 uxReturn = uxTaskPriorityGetFromISR( xInternalTaskHandle );
1708 #endif /* #if ( INCLUDE_uxTaskPriorityGet == 1 ) */
1709 /*-----------------------------------------------------------*/
1711 #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) )
1713 BaseType_t MPU_xTaskResumeFromISR( TaskHandle_t xTaskToResume ) /* PRIVILEGED_FUNCTION */
1715 BaseType_t xReturn = pdFAIL;
1717 TaskHandle_t xInternalTaskHandle = NULL;
1719 lIndex = ( int32_t ) xTaskToResume;
1721 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1723 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1725 if( xInternalTaskHandle != NULL )
1727 xReturn = xTaskResumeFromISR( xInternalTaskHandle );
1734 #endif /* #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) )*/
1735 /*---------------------------------------------------------------------------------------*/
1737 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
1739 TaskHookFunction_t MPU_xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) /* PRIVILEGED_FUNCTION */
1741 TaskHookFunction_t xReturn = NULL;
1743 TaskHandle_t xInternalTaskHandle = NULL;
1747 xReturn = xTaskGetApplicationTaskTagFromISR( xTask );
1751 lIndex = ( int32_t ) xTask;
1753 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1755 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1757 if( xInternalTaskHandle != NULL )
1759 xReturn = xTaskGetApplicationTaskTagFromISR( xInternalTaskHandle );
1767 #endif /* #if ( configUSE_APPLICATION_TASK_TAG == 1 ) */
1768 /*---------------------------------------------------------------------------------------*/
1770 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1772 BaseType_t MPU_xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,
1773 UBaseType_t uxIndexToNotify,
1775 eNotifyAction eAction,
1776 uint32_t * pulPreviousNotificationValue,
1777 BaseType_t * pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
1779 BaseType_t xReturn = pdFAIL;
1781 TaskHandle_t xInternalTaskHandle = NULL;
1783 lIndex = ( int32_t ) xTaskToNotify;
1785 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1787 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1789 if( xInternalTaskHandle != NULL )
1791 xReturn = xTaskGenericNotifyFromISR( xInternalTaskHandle, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken );
1798 #endif /* #if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
1799 /*---------------------------------------------------------------------------------------*/
1801 #if ( configUSE_TASK_NOTIFICATIONS == 1 )
1803 void MPU_vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
1804 UBaseType_t uxIndexToNotify,
1805 BaseType_t * pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
1808 TaskHandle_t xInternalTaskHandle = NULL;
1810 lIndex = ( int32_t ) xTaskToNotify;
1812 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1814 xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1816 if( xInternalTaskHandle != NULL )
1818 vTaskGenericNotifyGiveFromISR( xInternalTaskHandle, uxIndexToNotify, pxHigherPriorityTaskWoken );
1822 #endif /*#if ( configUSE_TASK_NOTIFICATIONS == 1 )*/
1823 /*-----------------------------------------------------------*/
1825 /*-----------------------------------------------------------*/
1826 /* MPU wrappers for queue APIs. */
1827 /*-----------------------------------------------------------*/
1829 BaseType_t MPU_xQueueGenericSendImpl( QueueHandle_t xQueue,
1830 const void * const pvItemToQueue,
1831 TickType_t xTicksToWait,
1832 BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;
1834 BaseType_t MPU_xQueueGenericSendImpl( QueueHandle_t xQueue,
1835 const void * const pvItemToQueue,
1836 TickType_t xTicksToWait,
1837 BaseType_t xCopyPosition ) /* PRIVILEGED_FUNCTION */
1840 QueueHandle_t xInternalQueueHandle = NULL;
1841 BaseType_t xReturn = pdFAIL;
1842 BaseType_t xIsItemToQueueReadable = pdFALSE;
1843 UBaseType_t uxQueueItemSize, uxQueueLength;
1845 lIndex = ( int32_t ) xQueue;
1847 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1849 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1851 if( xInternalQueueHandle != NULL )
1853 uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
1854 uxQueueLength = uxQueueGetQueueLength( xInternalQueueHandle );
1856 if( ( !( ( pvItemToQueue == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) ) &&
1857 ( !( ( xCopyPosition == queueOVERWRITE ) && ( uxQueueLength != ( UBaseType_t ) 1U ) ) )
1858 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
1859 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
1863 if( pvItemToQueue != NULL )
1865 xIsItemToQueueReadable = xPortIsAuthorizedToAccessBuffer( pvItemToQueue,
1866 uxQueueGetQueueItemSize( xInternalQueueHandle ),
1867 tskMPU_READ_PERMISSION );
1870 if( ( pvItemToQueue == NULL ) || ( xIsItemToQueueReadable == pdTRUE ) )
1872 xReturn = xQueueGenericSend( xInternalQueueHandle, pvItemToQueue, xTicksToWait, xCopyPosition );
1880 /*-----------------------------------------------------------*/
1882 UBaseType_t MPU_uxQueueMessagesWaitingImpl( const QueueHandle_t pxQueue ) PRIVILEGED_FUNCTION;
1884 UBaseType_t MPU_uxQueueMessagesWaitingImpl( const QueueHandle_t pxQueue ) /* PRIVILEGED_FUNCTION */
1887 QueueHandle_t xInternalQueueHandle = NULL;
1888 UBaseType_t uxReturn = 0;
1890 lIndex = ( int32_t ) pxQueue;
1892 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1894 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1896 if( xInternalQueueHandle != NULL )
1898 uxReturn = uxQueueMessagesWaiting( xInternalQueueHandle );
1904 /*-----------------------------------------------------------*/
1906 UBaseType_t MPU_uxQueueSpacesAvailableImpl( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1908 UBaseType_t MPU_uxQueueSpacesAvailableImpl( const QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
1911 QueueHandle_t xInternalQueueHandle = NULL;
1912 UBaseType_t uxReturn = 0;
1914 lIndex = ( int32_t ) xQueue;
1916 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1918 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1920 if( xInternalQueueHandle != NULL )
1922 uxReturn = uxQueueSpacesAvailable( xInternalQueueHandle );
1928 /*-----------------------------------------------------------*/
1930 BaseType_t MPU_xQueueReceiveImpl( QueueHandle_t pxQueue,
1931 void * const pvBuffer,
1932 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1934 BaseType_t MPU_xQueueReceiveImpl( QueueHandle_t pxQueue,
1935 void * const pvBuffer,
1936 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
1939 QueueHandle_t xInternalQueueHandle = NULL;
1940 BaseType_t xReturn = pdFAIL;
1941 BaseType_t xIsReceiveBufferWritable = pdFALSE;
1942 UBaseType_t uxQueueItemSize;
1944 lIndex = ( int32_t ) pxQueue;
1946 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1948 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1950 if( xInternalQueueHandle != NULL )
1952 uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
1954 if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
1955 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
1956 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
1960 xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
1961 uxQueueGetQueueItemSize( xInternalQueueHandle ),
1962 tskMPU_WRITE_PERMISSION );
1964 if( xIsReceiveBufferWritable == pdTRUE )
1966 xReturn = xQueueReceive( xInternalQueueHandle, pvBuffer, xTicksToWait );
1974 /*-----------------------------------------------------------*/
1976 BaseType_t MPU_xQueuePeekImpl( QueueHandle_t xQueue,
1977 void * const pvBuffer,
1978 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1980 BaseType_t MPU_xQueuePeekImpl( QueueHandle_t xQueue,
1981 void * const pvBuffer,
1982 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
1985 QueueHandle_t xInternalQueueHandle = NULL;
1986 BaseType_t xReturn = pdFAIL;
1987 BaseType_t xIsReceiveBufferWritable = pdFALSE;
1988 UBaseType_t uxQueueItemSize;
1990 lIndex = ( int32_t ) xQueue;
1992 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
1994 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
1996 if( xInternalQueueHandle != NULL )
1998 uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
2000 if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
2001 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
2002 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
2006 xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
2007 uxQueueGetQueueItemSize( xInternalQueueHandle ),
2008 tskMPU_WRITE_PERMISSION );
2010 if( xIsReceiveBufferWritable == pdTRUE )
2012 xReturn = xQueuePeek( xInternalQueueHandle, pvBuffer, xTicksToWait );
2020 /*-----------------------------------------------------------*/
2022 BaseType_t MPU_xQueueSemaphoreTakeImpl( QueueHandle_t xQueue,
2023 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
2025 BaseType_t MPU_xQueueSemaphoreTakeImpl( QueueHandle_t xQueue,
2026 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
2029 QueueHandle_t xInternalQueueHandle = NULL;
2030 BaseType_t xReturn = pdFAIL;
2031 UBaseType_t uxQueueItemSize;
2033 lIndex = ( int32_t ) xQueue;
2035 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2037 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2039 if( xInternalQueueHandle != NULL )
2041 uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
2043 if( ( uxQueueItemSize == 0 )
2044 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
2045 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
2049 xReturn = xQueueSemaphoreTake( xInternalQueueHandle, xTicksToWait );
2056 /*-----------------------------------------------------------*/
2058 #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
2060 TaskHandle_t MPU_xQueueGetMutexHolderImpl( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
2062 TaskHandle_t MPU_xQueueGetMutexHolderImpl( QueueHandle_t xSemaphore ) /* PRIVILEGED_FUNCTION */
2064 TaskHandle_t xMutexHolderTaskInternalHandle = NULL;
2065 TaskHandle_t xMutexHolderTaskExternalHandle = NULL;
2066 int32_t lIndex, lMutexHolderTaskIndex;
2067 QueueHandle_t xInternalQueueHandle = NULL;
2070 lIndex = ( int32_t ) xSemaphore;
2072 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2074 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2076 if( xInternalQueueHandle != NULL )
2078 xMutexHolderTaskInternalHandle = xQueueGetMutexHolder( xInternalQueueHandle );
2080 if( xMutexHolderTaskInternalHandle != NULL )
2082 lMutexHolderTaskIndex = MPU_GetIndexForTaskHandle( xMutexHolderTaskInternalHandle );
2084 if( lMutexHolderTaskIndex != -1 )
2086 xMutexHolderTaskExternalHandle = ( TaskHandle_t ) ( CONVERT_TO_EXTERNAL_INDEX( lMutexHolderTaskIndex ) );
2092 return xMutexHolderTaskExternalHandle;
2095 #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */
2096 /*-----------------------------------------------------------*/
2098 #if ( configUSE_RECURSIVE_MUTEXES == 1 )
2100 BaseType_t MPU_xQueueTakeMutexRecursiveImpl( QueueHandle_t xMutex,
2101 TickType_t xBlockTime ) PRIVILEGED_FUNCTION;
2103 BaseType_t MPU_xQueueTakeMutexRecursiveImpl( QueueHandle_t xMutex,
2104 TickType_t xBlockTime ) /* PRIVILEGED_FUNCTION */
2106 BaseType_t xReturn = pdFAIL;
2108 QueueHandle_t xInternalQueueHandle = NULL;
2110 lIndex = ( int32_t ) xMutex;
2112 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2114 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2116 if( xInternalQueueHandle != NULL )
2118 xReturn = xQueueTakeMutexRecursive( xInternalQueueHandle, xBlockTime );
2125 #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */
2126 /*-----------------------------------------------------------*/
2128 #if ( configUSE_RECURSIVE_MUTEXES == 1 )
2130 BaseType_t MPU_xQueueGiveMutexRecursiveImpl( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION;
2132 BaseType_t MPU_xQueueGiveMutexRecursiveImpl( QueueHandle_t xMutex ) /* PRIVILEGED_FUNCTION */
2134 BaseType_t xReturn = pdFAIL;
2136 QueueHandle_t xInternalQueueHandle = NULL;
2138 lIndex = ( int32_t ) xMutex;
2140 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2142 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2144 if( xInternalQueueHandle != NULL )
2146 xReturn = xQueueGiveMutexRecursive( xInternalQueueHandle );
2153 #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */
2154 /*-----------------------------------------------------------*/
2156 #if ( configUSE_QUEUE_SETS == 1 )
2158 QueueSetMemberHandle_t MPU_xQueueSelectFromSetImpl( QueueSetHandle_t xQueueSet,
2159 TickType_t xBlockTimeTicks ) PRIVILEGED_FUNCTION;
2161 QueueSetMemberHandle_t MPU_xQueueSelectFromSetImpl( QueueSetHandle_t xQueueSet,
2162 TickType_t xBlockTimeTicks ) /* PRIVILEGED_FUNCTION */
2164 QueueSetHandle_t xInternalQueueSetHandle = NULL;
2165 QueueSetMemberHandle_t xSelectedMemberInternal = NULL;
2166 QueueSetMemberHandle_t xSelectedMemberExternal = NULL;
2167 int32_t lIndexQueueSet, lIndexSelectedMember;
2169 lIndexQueueSet = ( int32_t ) xQueueSet;
2171 if( IS_EXTERNAL_INDEX_VALID( lIndexQueueSet ) != pdFALSE )
2173 xInternalQueueSetHandle = MPU_GetQueueSetHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSet ) );
2175 if( xInternalQueueSetHandle != NULL )
2177 xSelectedMemberInternal = xQueueSelectFromSet( xInternalQueueSetHandle, xBlockTimeTicks );
2179 if( xSelectedMemberInternal != NULL )
2181 lIndexSelectedMember = MPU_GetIndexForQueueSetMemberHandle( xSelectedMemberInternal );
2183 if( lIndexSelectedMember != -1 )
2185 xSelectedMemberExternal = ( QueueSetMemberHandle_t ) ( CONVERT_TO_EXTERNAL_INDEX( lIndexSelectedMember ) );
2191 return xSelectedMemberExternal;
2194 #endif /* if ( configUSE_QUEUE_SETS == 1 ) */
2195 /*-----------------------------------------------------------*/
2197 #if ( configUSE_QUEUE_SETS == 1 )
2199 BaseType_t MPU_xQueueAddToSetImpl( QueueSetMemberHandle_t xQueueOrSemaphore,
2200 QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
2202 BaseType_t MPU_xQueueAddToSetImpl( QueueSetMemberHandle_t xQueueOrSemaphore,
2203 QueueSetHandle_t xQueueSet ) /* PRIVILEGED_FUNCTION */
2205 BaseType_t xReturn = pdFAIL;
2206 QueueSetMemberHandle_t xInternalQueueSetMemberHandle = NULL;
2207 QueueSetHandle_t xInternalQueueSetHandle = NULL;
2208 int32_t lIndexQueueSet, lIndexQueueSetMember;
2210 lIndexQueueSet = ( int32_t ) xQueueSet;
2211 lIndexQueueSetMember = ( int32_t ) xQueueOrSemaphore;
2213 if( ( IS_EXTERNAL_INDEX_VALID( lIndexQueueSet ) != pdFALSE ) &&
2214 ( IS_EXTERNAL_INDEX_VALID( lIndexQueueSetMember ) != pdFALSE ) )
2216 xInternalQueueSetHandle = MPU_GetQueueSetHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSet ) );
2217 xInternalQueueSetMemberHandle = MPU_GetQueueSetMemberHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSetMember ) );
2219 if( ( xInternalQueueSetHandle != NULL ) && ( xInternalQueueSetMemberHandle != NULL ) )
2221 xReturn = xQueueAddToSet( xInternalQueueSetMemberHandle, xInternalQueueSetHandle );
2228 #endif /* if ( configUSE_QUEUE_SETS == 1 ) */
2229 /*-----------------------------------------------------------*/
2231 #if configQUEUE_REGISTRY_SIZE > 0
2233 void MPU_vQueueAddToRegistryImpl( QueueHandle_t xQueue,
2234 const char * pcName ) PRIVILEGED_FUNCTION;
2236 void MPU_vQueueAddToRegistryImpl( QueueHandle_t xQueue,
2237 const char * pcName ) /* PRIVILEGED_FUNCTION */
2240 QueueHandle_t xInternalQueueHandle = NULL;
2242 lIndex = ( int32_t ) xQueue;
2244 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2246 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2248 if( xInternalQueueHandle != NULL )
2250 vQueueAddToRegistry( xInternalQueueHandle, pcName );
2255 #endif /* if configQUEUE_REGISTRY_SIZE > 0 */
2256 /*-----------------------------------------------------------*/
2258 #if configQUEUE_REGISTRY_SIZE > 0
2260 void MPU_vQueueUnregisterQueueImpl( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
2262 void MPU_vQueueUnregisterQueueImpl( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2265 QueueHandle_t xInternalQueueHandle = NULL;
2267 lIndex = ( int32_t ) xQueue;
2269 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2271 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2273 if( xInternalQueueHandle != NULL )
2275 vQueueUnregisterQueue( xInternalQueueHandle );
2280 #endif /* if configQUEUE_REGISTRY_SIZE > 0 */
2281 /*-----------------------------------------------------------*/
2283 #if configQUEUE_REGISTRY_SIZE > 0
2285 const char * MPU_pcQueueGetNameImpl( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
2287 const char * MPU_pcQueueGetNameImpl( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2289 const char * pcReturn = NULL;
2290 QueueHandle_t xInternalQueueHandle = NULL;
2293 lIndex = ( int32_t ) xQueue;
2295 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2297 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2299 if( xInternalQueueHandle != NULL )
2301 pcReturn = pcQueueGetName( xInternalQueueHandle );
2308 #endif /* if configQUEUE_REGISTRY_SIZE > 0 */
2309 /*-----------------------------------------------------------*/
2311 /* Privileged only wrappers for Queue APIs. These are needed so that
2312 * the application can use opaque handles maintained in mpu_wrappers.c
2313 * with all the APIs. */
2314 /*-----------------------------------------------------------*/
2316 void MPU_vQueueDelete( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2318 QueueHandle_t xInternalQueueHandle = NULL;
2321 lIndex = ( int32_t ) xQueue;
2323 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2325 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2327 if( xInternalQueueHandle != NULL )
2329 vQueueDelete( xInternalQueueHandle );
2330 MPU_SetIndexFreeInKernelObjectPool( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2334 /*-----------------------------------------------------------*/
2336 #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
2338 QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) /* PRIVILEGED_FUNCTION */
2340 QueueHandle_t xInternalQueueHandle = NULL;
2341 QueueHandle_t xExternalQueueHandle = NULL;
2344 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2348 xInternalQueueHandle = xQueueCreateMutex( ucQueueType );
2350 if( xInternalQueueHandle != NULL )
2352 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2353 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2357 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2361 return xExternalQueueHandle;
2364 #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */
2365 /*-----------------------------------------------------------*/
2367 #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
2369 QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,
2370 StaticQueue_t * pxStaticQueue ) /* PRIVILEGED_FUNCTION */
2372 QueueHandle_t xInternalQueueHandle = NULL;
2373 QueueHandle_t xExternalQueueHandle = NULL;
2376 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2380 xInternalQueueHandle = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue );
2382 if( xInternalQueueHandle != NULL )
2384 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2385 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2389 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2393 return xExternalQueueHandle;
2396 #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */
2397 /*-----------------------------------------------------------*/
2399 #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
2401 QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue,
2402 UBaseType_t uxInitialCount ) /* PRIVILEGED_FUNCTION */
2404 QueueHandle_t xInternalQueueHandle = NULL;
2405 QueueHandle_t xExternalQueueHandle = NULL;
2408 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2412 xInternalQueueHandle = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount );
2414 if( xInternalQueueHandle != NULL )
2416 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2417 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2421 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2425 return xExternalQueueHandle;
2428 #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */
2429 /*-----------------------------------------------------------*/
2431 #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
2433 QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,
2434 const UBaseType_t uxInitialCount,
2435 StaticQueue_t * pxStaticQueue ) /* PRIVILEGED_FUNCTION */
2437 QueueHandle_t xInternalQueueHandle = NULL;
2438 QueueHandle_t xExternalQueueHandle = NULL;
2441 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2445 xInternalQueueHandle = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue );
2447 if( xInternalQueueHandle != NULL )
2449 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2450 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2454 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2458 return xExternalQueueHandle;
2461 #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */
2462 /*-----------------------------------------------------------*/
2464 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
2466 QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength,
2467 UBaseType_t uxItemSize,
2468 uint8_t ucQueueType ) /* PRIVILEGED_FUNCTION */
2470 QueueHandle_t xInternalQueueHandle = NULL;
2471 QueueHandle_t xExternalQueueHandle = NULL;
2474 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2478 xInternalQueueHandle = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType );
2480 if( xInternalQueueHandle != NULL )
2482 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2483 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2487 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2491 return xExternalQueueHandle;
2494 #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */
2495 /*-----------------------------------------------------------*/
2497 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
2499 QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
2500 const UBaseType_t uxItemSize,
2501 uint8_t * pucQueueStorage,
2502 StaticQueue_t * pxStaticQueue,
2503 const uint8_t ucQueueType ) /* PRIVILEGED_FUNCTION */
2505 QueueHandle_t xInternalQueueHandle = NULL;
2506 QueueHandle_t xExternalQueueHandle = NULL;
2509 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2513 xInternalQueueHandle = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType );
2515 if( xInternalQueueHandle != NULL )
2517 MPU_StoreQueueHandleAtIndex( lIndex, xInternalQueueHandle );
2518 xExternalQueueHandle = ( QueueHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2522 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2526 return xExternalQueueHandle;
2529 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
2530 /*-----------------------------------------------------------*/
2532 BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue,
2533 BaseType_t xNewQueue ) /* PRIVILEGED_FUNCTION */
2536 QueueHandle_t xInternalQueueHandle = NULL;
2537 BaseType_t xReturn = pdFAIL;
2539 lIndex = ( uint32_t ) xQueue;
2541 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2543 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2545 if( xInternalQueueHandle != NULL )
2547 xReturn = xQueueGenericReset( xInternalQueueHandle, xNewQueue );
2553 /*-----------------------------------------------------------*/
2555 #if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
2557 QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) /* PRIVILEGED_FUNCTION */
2559 QueueSetHandle_t xInternalQueueSetHandle = NULL;
2560 QueueSetHandle_t xExternalQueueSetHandle = NULL;
2563 lIndex = MPU_GetFreeIndexInKernelObjectPool();
2567 xInternalQueueSetHandle = xQueueCreateSet( uxEventQueueLength );
2569 if( xInternalQueueSetHandle != NULL )
2571 MPU_StoreQueueSetHandleAtIndex( lIndex, xInternalQueueSetHandle );
2572 xExternalQueueSetHandle = ( QueueSetHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
2576 MPU_SetIndexFreeInKernelObjectPool( lIndex );
2580 return xExternalQueueSetHandle;
2583 #endif /* if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */
2584 /*-----------------------------------------------------------*/
2586 #if ( configUSE_QUEUE_SETS == 1 )
2588 BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
2589 QueueSetHandle_t xQueueSet ) /* PRIVILEGED_FUNCTION */
2591 BaseType_t xReturn = pdFAIL;
2592 QueueSetMemberHandle_t xInternalQueueSetMemberHandle = NULL;
2593 QueueSetHandle_t xInternalQueueSetHandle = NULL;
2594 int32_t lIndexQueueSet, lIndexQueueSetMember;
2596 lIndexQueueSet = ( int32_t ) xQueueSet;
2597 lIndexQueueSetMember = ( int32_t ) xQueueOrSemaphore;
2599 if( ( IS_EXTERNAL_INDEX_VALID( lIndexQueueSet ) != pdFALSE ) &&
2600 ( IS_EXTERNAL_INDEX_VALID( lIndexQueueSetMember ) != pdFALSE ) )
2602 xInternalQueueSetHandle = MPU_GetQueueSetHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSet ) );
2603 xInternalQueueSetMemberHandle = MPU_GetQueueSetMemberHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSetMember ) );
2605 if( ( xInternalQueueSetHandle != NULL ) && ( xInternalQueueSetMemberHandle != NULL ) )
2607 xReturn = xQueueRemoveFromSet( xInternalQueueSetMemberHandle, xInternalQueueSetHandle );
2614 #endif /* if ( configUSE_QUEUE_SETS == 1 ) */
2615 /*-----------------------------------------------------------*/
2617 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
2619 BaseType_t MPU_xQueueGenericGetStaticBuffers( QueueHandle_t xQueue,
2620 uint8_t ** ppucQueueStorage,
2621 StaticQueue_t ** ppxStaticQueue ) /* PRIVILEGED_FUNCTION */
2624 QueueHandle_t xInternalQueueHandle = NULL;
2625 BaseType_t xReturn = pdFALSE;
2627 lIndex = ( int32_t ) xQueue;
2629 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2631 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2633 if( xInternalQueueHandle != NULL )
2635 xReturn = xQueueGenericGetStaticBuffers( xInternalQueueHandle, ppucQueueStorage, ppxStaticQueue );
2642 #endif /*if ( configSUPPORT_STATIC_ALLOCATION == 1 )*/
2643 /*-----------------------------------------------------------*/
2645 BaseType_t MPU_xQueueGenericSendFromISR( QueueHandle_t xQueue,
2646 const void * const pvItemToQueue,
2647 BaseType_t * const pxHigherPriorityTaskWoken,
2648 const BaseType_t xCopyPosition ) /* PRIVILEGED_FUNCTION */
2650 BaseType_t xReturn = pdFAIL;
2652 QueueHandle_t xInternalQueueHandle = NULL;
2654 lIndex = ( int32_t ) xQueue;
2656 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2658 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2660 if( xInternalQueueHandle != NULL )
2662 xReturn = xQueueGenericSendFromISR( xInternalQueueHandle, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition );
2669 /*-----------------------------------------------------------*/
2671 BaseType_t MPU_xQueueGiveFromISR( QueueHandle_t xQueue,
2672 BaseType_t * const pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
2674 BaseType_t xReturn = pdFAIL;
2676 QueueHandle_t xInternalQueueHandle = NULL;
2678 lIndex = ( int32_t ) xQueue;
2680 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2682 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2684 if( xInternalQueueHandle != NULL )
2686 xReturn = xQueueGiveFromISR( xInternalQueueHandle, pxHigherPriorityTaskWoken );
2693 /*-----------------------------------------------------------*/
2695 BaseType_t MPU_xQueuePeekFromISR( QueueHandle_t xQueue,
2696 void * const pvBuffer ) /* PRIVILEGED_FUNCTION */
2698 BaseType_t xReturn = pdFAIL;
2700 QueueHandle_t xInternalQueueHandle = NULL;
2702 lIndex = ( int32_t ) xQueue;
2704 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2706 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2708 if( xInternalQueueHandle != NULL )
2710 xReturn = xQueuePeekFromISR( xInternalQueueHandle, pvBuffer );
2717 /*-----------------------------------------------------------*/
2719 BaseType_t MPU_xQueueReceiveFromISR( QueueHandle_t xQueue,
2720 void * const pvBuffer,
2721 BaseType_t * const pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
2723 BaseType_t xReturn = pdFAIL;
2725 QueueHandle_t xInternalQueueHandle = NULL;
2727 lIndex = ( int32_t ) xQueue;
2729 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2731 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2733 if( xInternalQueueHandle != NULL )
2735 xReturn = xQueueReceiveFromISR( xInternalQueueHandle, pvBuffer, pxHigherPriorityTaskWoken );
2742 /*-----------------------------------------------------------*/
2744 BaseType_t MPU_xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2746 BaseType_t xReturn = pdFAIL;
2748 QueueHandle_t xInternalQueueHandle = NULL;
2750 lIndex = ( int32_t ) xQueue;
2752 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2754 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2756 if( xInternalQueueHandle != NULL )
2758 xReturn = xQueueIsQueueEmptyFromISR( xInternalQueueHandle );
2764 /*-----------------------------------------------------------*/
2766 BaseType_t MPU_xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2768 BaseType_t xReturn = pdFAIL;
2770 QueueHandle_t xInternalQueueHandle = NULL;
2772 lIndex = ( int32_t ) xQueue;
2774 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2776 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2778 if( xInternalQueueHandle != NULL )
2780 xReturn = xQueueIsQueueFullFromISR( xInternalQueueHandle );
2787 /*-----------------------------------------------------------*/
2789 UBaseType_t MPU_uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
2791 UBaseType_t uxReturn = 0;
2793 QueueHandle_t xInternalQueueHandle = NULL;
2795 lIndex = ( int32_t ) xQueue;
2797 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2799 xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2801 if( xInternalQueueHandle != NULL )
2803 uxReturn = uxQueueMessagesWaitingFromISR( xInternalQueueHandle );
2810 /*-----------------------------------------------------------*/
2812 #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
2814 TaskHandle_t MPU_xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) /* PRIVILEGED_FUNCTION */
2816 TaskHandle_t xMutexHolderTaskInternalHandle = NULL;
2817 TaskHandle_t xMutexHolderTaskExternalHandle = NULL;
2818 int32_t lIndex, lMutexHolderTaskIndex;
2819 QueueHandle_t xInternalSemaphoreHandle = NULL;
2821 lIndex = ( int32_t ) xSemaphore;
2823 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2825 xInternalSemaphoreHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2827 if( xInternalSemaphoreHandle != NULL )
2829 xMutexHolderTaskInternalHandle = xQueueGetMutexHolder( xInternalSemaphoreHandle );
2831 if( xMutexHolderTaskInternalHandle != NULL )
2833 lMutexHolderTaskIndex = MPU_GetIndexForTaskHandle( xMutexHolderTaskInternalHandle );
2835 if( lMutexHolderTaskIndex != -1 )
2837 xMutexHolderTaskExternalHandle = ( TaskHandle_t ) ( CONVERT_TO_EXTERNAL_INDEX( lMutexHolderTaskIndex ) );
2843 return xMutexHolderTaskExternalHandle;
2846 #endif /* #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */
2847 /*-----------------------------------------------------------*/
2849 #if ( configUSE_QUEUE_SETS == 1 )
2851 QueueSetMemberHandle_t MPU_xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) /* PRIVILEGED_FUNCTION */
2853 QueueSetHandle_t xInternalQueueSetHandle = NULL;
2854 QueueSetMemberHandle_t xSelectedMemberInternal = NULL;
2855 QueueSetMemberHandle_t xSelectedMemberExternal = NULL;
2856 int32_t lIndexQueueSet, lIndexSelectedMember;
2858 lIndexQueueSet = ( int32_t ) xQueueSet;
2860 if( IS_EXTERNAL_INDEX_VALID( lIndexQueueSet ) != pdFALSE )
2862 xInternalQueueSetHandle = MPU_GetQueueSetHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndexQueueSet ) );
2864 if( xInternalQueueSetHandle != NULL )
2866 xSelectedMemberInternal = xQueueSelectFromSetFromISR( xInternalQueueSetHandle );
2868 if( xSelectedMemberInternal != NULL )
2870 lIndexSelectedMember = MPU_GetIndexForQueueSetMemberHandle( xSelectedMemberInternal );
2872 if( lIndexSelectedMember != -1 )
2874 xSelectedMemberExternal = ( QueueSetMemberHandle_t ) ( CONVERT_TO_EXTERNAL_INDEX( lIndexSelectedMember ) );
2880 return xSelectedMemberExternal;
2883 #endif /* if ( configUSE_QUEUE_SETS == 1 ) */
2884 /*-----------------------------------------------------------*/
2886 /*-----------------------------------------------------------*/
2887 /* MPU wrappers for timers APIs. */
2888 /*-----------------------------------------------------------*/
2890 #if ( configUSE_TIMERS == 1 )
2892 void * MPU_pvTimerGetTimerIDImpl( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
2894 void * MPU_pvTimerGetTimerIDImpl( const TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
2896 void * pvReturn = NULL;
2897 TimerHandle_t xInternalTimerHandle = NULL;
2900 lIndex = ( int32_t ) xTimer;
2902 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2904 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2906 if( xInternalTimerHandle != NULL )
2908 pvReturn = pvTimerGetTimerID( xInternalTimerHandle );
2915 #endif /* if ( configUSE_TIMERS == 1 ) */
2916 /*-----------------------------------------------------------*/
2918 #if ( configUSE_TIMERS == 1 )
2920 void MPU_vTimerSetTimerIDImpl( TimerHandle_t xTimer,
2921 void * pvNewID ) PRIVILEGED_FUNCTION;
2923 void MPU_vTimerSetTimerIDImpl( TimerHandle_t xTimer,
2924 void * pvNewID ) /* PRIVILEGED_FUNCTION */
2926 TimerHandle_t xInternalTimerHandle = NULL;
2929 lIndex = ( int32_t ) xTimer;
2931 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2933 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2935 if( xInternalTimerHandle != NULL )
2937 vTimerSetTimerID( xInternalTimerHandle, pvNewID );
2942 #endif /* if ( configUSE_TIMERS == 1 ) */
2943 /*-----------------------------------------------------------*/
2945 #if ( configUSE_TIMERS == 1 )
2947 BaseType_t MPU_xTimerIsTimerActiveImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
2949 BaseType_t MPU_xTimerIsTimerActiveImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
2951 BaseType_t xReturn = pdFALSE;
2952 TimerHandle_t xInternalTimerHandle = NULL;
2955 lIndex = ( int32_t ) xTimer;
2957 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
2959 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
2961 if( xInternalTimerHandle != NULL )
2963 xReturn = xTimerIsTimerActive( xInternalTimerHandle );
2970 #endif /* if ( configUSE_TIMERS == 1 ) */
2971 /*-----------------------------------------------------------*/
2973 #if ( configUSE_TIMERS == 1 )
2975 TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandleImpl( void ) PRIVILEGED_FUNCTION;
2977 TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandleImpl( void ) /* PRIVILEGED_FUNCTION */
2979 TaskHandle_t xReturn;
2981 xReturn = xTimerGetTimerDaemonTaskHandle();
2986 #endif /* if ( configUSE_TIMERS == 1 ) */
2987 /*-----------------------------------------------------------*/
2989 #if ( configUSE_TIMERS == 1 )
2991 BaseType_t MPU_xTimerGenericCommandImpl( TimerHandle_t xTimer,
2992 const BaseType_t xCommandID,
2993 const TickType_t xOptionalValue,
2994 BaseType_t * const pxHigherPriorityTaskWoken,
2995 const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
2997 BaseType_t MPU_xTimerGenericCommandImpl( TimerHandle_t xTimer,
2998 const BaseType_t xCommandID,
2999 const TickType_t xOptionalValue,
3000 BaseType_t * const pxHigherPriorityTaskWoken,
3001 const TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
3003 BaseType_t xReturn = pdFALSE;
3004 TimerHandle_t xInternalTimerHandle = NULL;
3006 BaseType_t xIsHigherPriorityTaskWokenWriteable = pdFALSE;
3008 if( pxHigherPriorityTaskWoken != NULL )
3010 xIsHigherPriorityTaskWokenWriteable = xPortIsAuthorizedToAccessBuffer( pxHigherPriorityTaskWoken,
3011 sizeof( BaseType_t ),
3012 tskMPU_WRITE_PERMISSION );
3015 if( ( pxHigherPriorityTaskWoken == NULL ) || ( xIsHigherPriorityTaskWokenWriteable == pdTRUE ) )
3017 lIndex = ( int32_t ) xTimer;
3019 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3021 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3023 if( xInternalTimerHandle != NULL )
3025 xReturn = xTimerGenericCommand( xInternalTimerHandle, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait );
3033 #endif /* if ( configUSE_TIMERS == 1 ) */
3034 /*-----------------------------------------------------------*/
3036 #if ( configUSE_TIMERS == 1 )
3038 const char * MPU_pcTimerGetNameImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
3040 const char * MPU_pcTimerGetNameImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
3042 const char * pcReturn = NULL;
3043 TimerHandle_t xInternalTimerHandle = NULL;
3046 lIndex = ( int32_t ) xTimer;
3048 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3050 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3052 if( xInternalTimerHandle != NULL )
3054 pcReturn = pcTimerGetName( xInternalTimerHandle );
3061 #endif /* if ( configUSE_TIMERS == 1 ) */
3062 /*-----------------------------------------------------------*/
3064 #if ( configUSE_TIMERS == 1 )
3066 void MPU_vTimerSetReloadModeImpl( TimerHandle_t xTimer,
3067 const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
3069 void MPU_vTimerSetReloadModeImpl( TimerHandle_t xTimer,
3070 const UBaseType_t uxAutoReload ) /* PRIVILEGED_FUNCTION */
3072 TimerHandle_t xInternalTimerHandle = NULL;
3075 lIndex = ( int32_t ) xTimer;
3077 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3079 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3081 if( xInternalTimerHandle != NULL )
3083 vTimerSetReloadMode( xInternalTimerHandle, uxAutoReload );
3088 #endif /* if ( configUSE_TIMERS == 1 ) */
3089 /*-----------------------------------------------------------*/
3091 #if ( configUSE_TIMERS == 1 )
3093 BaseType_t MPU_xTimerGetReloadModeImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
3095 BaseType_t MPU_xTimerGetReloadModeImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
3097 BaseType_t xReturn = pdFALSE;
3098 TimerHandle_t xInternalTimerHandle = NULL;
3101 lIndex = ( int32_t ) xTimer;
3103 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3105 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3107 if( xInternalTimerHandle != NULL )
3109 xReturn = xTimerGetReloadMode( xInternalTimerHandle );
3116 #endif /* if ( configUSE_TIMERS == 1 ) */
3117 /*-----------------------------------------------------------*/
3119 #if ( configUSE_TIMERS == 1 )
3121 UBaseType_t MPU_uxTimerGetReloadModeImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
3123 UBaseType_t MPU_uxTimerGetReloadModeImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
3125 UBaseType_t uxReturn = 0;
3126 TimerHandle_t xInternalTimerHandle = NULL;
3129 lIndex = ( int32_t ) xTimer;
3131 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3133 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3135 if( xInternalTimerHandle != NULL )
3137 uxReturn = uxTimerGetReloadMode( xInternalTimerHandle );
3144 #endif /* if ( configUSE_TIMERS == 1 ) */
3145 /*-----------------------------------------------------------*/
3147 #if ( configUSE_TIMERS == 1 )
3149 TickType_t MPU_xTimerGetPeriodImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
3151 TickType_t MPU_xTimerGetPeriodImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
3153 TickType_t xReturn = 0;
3154 TimerHandle_t xInternalTimerHandle = NULL;
3157 lIndex = ( int32_t ) xTimer;
3159 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3161 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3163 if( xInternalTimerHandle != NULL )
3165 xReturn = xTimerGetPeriod( xInternalTimerHandle );
3172 #endif /* if ( configUSE_TIMERS == 1 ) */
3173 /*-----------------------------------------------------------*/
3175 #if ( configUSE_TIMERS == 1 )
3177 TickType_t MPU_xTimerGetExpiryTimeImpl( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
3179 TickType_t MPU_xTimerGetExpiryTimeImpl( TimerHandle_t xTimer ) /* PRIVILEGED_FUNCTION */
3181 TickType_t xReturn = 0;
3182 TimerHandle_t xInternalTimerHandle = NULL;
3185 lIndex = ( int32_t ) xTimer;
3187 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3189 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3191 if( xInternalTimerHandle != NULL )
3193 xReturn = xTimerGetExpiryTime( xInternalTimerHandle );
3200 #endif /* if ( configUSE_TIMERS == 1 ) */
3201 /*-----------------------------------------------------------*/
3203 /* Privileged only wrappers for Timer APIs. These are needed so that
3204 * the application can use opaque handles maintained in mpu_wrappers.c
3205 * with all the APIs. */
3206 /*-----------------------------------------------------------*/
3208 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 )
3210 TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,
3211 const TickType_t xTimerPeriodInTicks,
3212 const UBaseType_t uxAutoReload,
3213 void * const pvTimerID,
3214 TimerCallbackFunction_t pxCallbackFunction ) /* PRIVILEGED_FUNCTION */
3216 TimerHandle_t xInternalTimerHandle = NULL;
3217 TimerHandle_t xExternalTimerHandle = NULL;
3220 lIndex = MPU_GetFreeIndexInKernelObjectPool();
3224 xInternalTimerHandle = xTimerCreate( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, MPU_TimerCallback );
3226 if( xInternalTimerHandle != NULL )
3228 MPU_StoreTimerHandleAtIndex( lIndex, xInternalTimerHandle, pxCallbackFunction );
3229 xExternalTimerHandle = ( TimerHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
3233 MPU_SetIndexFreeInKernelObjectPool( lIndex );
3237 return xExternalTimerHandle;
3240 #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) */
3241 /*-----------------------------------------------------------*/
3243 #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 )
3245 TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,
3246 const TickType_t xTimerPeriodInTicks,
3247 const UBaseType_t uxAutoReload,
3248 void * const pvTimerID,
3249 TimerCallbackFunction_t pxCallbackFunction,
3250 StaticTimer_t * pxTimerBuffer ) /* PRIVILEGED_FUNCTION */
3252 TimerHandle_t xInternalTimerHandle = NULL;
3253 TimerHandle_t xExternalTimerHandle = NULL;
3256 lIndex = MPU_GetFreeIndexInKernelObjectPool();
3260 xInternalTimerHandle = xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, MPU_TimerCallback, pxTimerBuffer );
3262 if( xInternalTimerHandle != NULL )
3264 MPU_StoreTimerHandleAtIndex( lIndex, xInternalTimerHandle, pxCallbackFunction );
3265 xExternalTimerHandle = ( TimerHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
3269 MPU_SetIndexFreeInKernelObjectPool( lIndex );
3273 return xExternalTimerHandle;
3276 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) */
3277 /*-----------------------------------------------------------*/
3279 #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 )
3281 BaseType_t MPU_xTimerGetStaticBuffer( TimerHandle_t xTimer,
3282 StaticTimer_t ** ppxTimerBuffer ) /* PRIVILEGED_FUNCTION */
3284 TimerHandle_t xInternalTimerHandle = NULL;
3286 BaseType_t xReturn = pdFALSE;
3288 lIndex = ( int32_t ) xTimer;
3290 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3292 xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3294 if( xInternalTimerHandle != NULL )
3296 xReturn = xTimerGetStaticBuffer( xInternalTimerHandle, ppxTimerBuffer );
3303 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) */
3304 /*-----------------------------------------------------------*/
3306 /*-----------------------------------------------------------*/
3307 /* MPU wrappers for event group APIs. */
3308 /*-----------------------------------------------------------*/
3310 EventBits_t MPU_xEventGroupWaitBitsImpl( EventGroupHandle_t xEventGroup,
3311 const EventBits_t uxBitsToWaitFor,
3312 const BaseType_t xClearOnExit,
3313 const BaseType_t xWaitForAllBits,
3314 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
3316 EventBits_t MPU_xEventGroupWaitBitsImpl( EventGroupHandle_t xEventGroup,
3317 const EventBits_t uxBitsToWaitFor,
3318 const BaseType_t xClearOnExit,
3319 const BaseType_t xWaitForAllBits,
3320 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
3322 EventBits_t xReturn = 0;
3323 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3326 if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
3327 ( uxBitsToWaitFor != 0 )
3328 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
3329 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
3333 lIndex = ( int32_t ) xEventGroup;
3335 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3337 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3339 if( xInternalEventGroupHandle != NULL )
3341 xReturn = xEventGroupWaitBits( xInternalEventGroupHandle, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait );
3348 /*-----------------------------------------------------------*/
3350 EventBits_t MPU_xEventGroupClearBitsImpl( EventGroupHandle_t xEventGroup,
3351 const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
3353 EventBits_t MPU_xEventGroupClearBitsImpl( EventGroupHandle_t xEventGroup,
3354 const EventBits_t uxBitsToClear ) /* PRIVILEGED_FUNCTION */
3356 EventBits_t xReturn = 0;
3357 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3360 if( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
3362 lIndex = ( int32_t ) xEventGroup;
3364 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3366 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3368 if( xInternalEventGroupHandle != NULL )
3370 xReturn = xEventGroupClearBits( xInternalEventGroupHandle, uxBitsToClear );
3377 /*-----------------------------------------------------------*/
3379 EventBits_t MPU_xEventGroupSetBitsImpl( EventGroupHandle_t xEventGroup,
3380 const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;
3382 EventBits_t MPU_xEventGroupSetBitsImpl( EventGroupHandle_t xEventGroup,
3383 const EventBits_t uxBitsToSet ) /* PRIVILEGED_FUNCTION */
3385 EventBits_t xReturn = 0;
3386 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3389 if( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
3391 lIndex = ( int32_t ) xEventGroup;
3393 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3395 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3397 if( xInternalEventGroupHandle != NULL )
3399 xReturn = xEventGroupSetBits( xInternalEventGroupHandle, uxBitsToSet );
3406 /*-----------------------------------------------------------*/
3408 EventBits_t MPU_xEventGroupSyncImpl( EventGroupHandle_t xEventGroup,
3409 const EventBits_t uxBitsToSet,
3410 const EventBits_t uxBitsToWaitFor,
3411 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
3413 EventBits_t MPU_xEventGroupSyncImpl( EventGroupHandle_t xEventGroup,
3414 const EventBits_t uxBitsToSet,
3415 const EventBits_t uxBitsToWaitFor,
3416 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
3418 EventBits_t xReturn = 0;
3419 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3422 if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
3423 ( uxBitsToWaitFor != 0 )
3424 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
3425 && ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
3429 lIndex = ( int32_t ) xEventGroup;
3431 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3433 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3435 if( xInternalEventGroupHandle != NULL )
3437 xReturn = xEventGroupSync( xInternalEventGroupHandle, uxBitsToSet, uxBitsToWaitFor, xTicksToWait );
3444 /*-----------------------------------------------------------*/
3446 #if ( configUSE_TRACE_FACILITY == 1 )
3448 UBaseType_t MPU_uxEventGroupGetNumberImpl( void * xEventGroup ) PRIVILEGED_FUNCTION;
3450 UBaseType_t MPU_uxEventGroupGetNumberImpl( void * xEventGroup ) /* PRIVILEGED_FUNCTION */
3452 UBaseType_t xReturn = 0;
3453 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3456 lIndex = ( int32_t ) xEventGroup;
3458 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3460 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3462 if( xInternalEventGroupHandle != NULL )
3464 xReturn = uxEventGroupGetNumber( xInternalEventGroupHandle );
3471 #endif /*( configUSE_TRACE_FACILITY == 1 )*/
3472 /*-----------------------------------------------------------*/
3474 #if ( configUSE_TRACE_FACILITY == 1 )
3476 void MPU_vEventGroupSetNumberImpl( void * xEventGroup,
3477 UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION;
3479 void MPU_vEventGroupSetNumberImpl( void * xEventGroup,
3480 UBaseType_t uxEventGroupNumber ) /* PRIVILEGED_FUNCTION */
3482 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3485 lIndex = ( int32_t ) xEventGroup;
3487 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3489 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3491 if( xInternalEventGroupHandle != NULL )
3493 vEventGroupSetNumber( xInternalEventGroupHandle, uxEventGroupNumber );
3498 #endif /*( configUSE_TRACE_FACILITY == 1 )*/
3499 /*-----------------------------------------------------------*/
3501 /* Privileged only wrappers for Event Group APIs. These are needed so that
3502 * the application can use opaque handles maintained in mpu_wrappers.c
3503 * with all the APIs. */
3504 /*-----------------------------------------------------------*/
3506 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
3508 EventGroupHandle_t MPU_xEventGroupCreate( void ) /* PRIVILEGED_FUNCTION */
3510 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3511 EventGroupHandle_t xExternalEventGroupHandle = NULL;
3514 lIndex = MPU_GetFreeIndexInKernelObjectPool();
3518 xInternalEventGroupHandle = xEventGroupCreate();
3520 if( xInternalEventGroupHandle != NULL )
3522 MPU_StoreEventGroupHandleAtIndex( lIndex, xInternalEventGroupHandle );
3523 xExternalEventGroupHandle = ( EventGroupHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
3527 MPU_SetIndexFreeInKernelObjectPool( lIndex );
3531 return xExternalEventGroupHandle;
3534 #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */
3535 /*-----------------------------------------------------------*/
3537 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
3539 EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) /* PRIVILEGED_FUNCTION */
3541 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3542 EventGroupHandle_t xExternalEventGroupHandle = NULL;
3545 lIndex = MPU_GetFreeIndexInKernelObjectPool();
3549 xInternalEventGroupHandle = xEventGroupCreateStatic( pxEventGroupBuffer );
3551 if( xInternalEventGroupHandle != NULL )
3553 MPU_StoreEventGroupHandleAtIndex( lIndex, xInternalEventGroupHandle );
3554 xExternalEventGroupHandle = ( EventGroupHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
3558 MPU_SetIndexFreeInKernelObjectPool( lIndex );
3562 return xExternalEventGroupHandle;
3565 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
3566 /*-----------------------------------------------------------*/
3568 void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) /* PRIVILEGED_FUNCTION */
3570 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3573 lIndex = ( int32_t ) xEventGroup;
3575 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3577 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3579 if( xInternalEventGroupHandle != NULL )
3581 vEventGroupDelete( xInternalEventGroupHandle );
3582 MPU_SetIndexFreeInKernelObjectPool( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3586 /*-----------------------------------------------------------*/
3588 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
3590 BaseType_t MPU_xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup,
3591 StaticEventGroup_t ** ppxEventGroupBuffer ) /* PRIVILEGED_FUNCTION */
3593 BaseType_t xReturn = pdFALSE;
3594 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3597 lIndex = ( int32_t ) xEventGroup;
3599 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3601 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3603 if( xInternalEventGroupHandle != NULL )
3605 xReturn = xEventGroupGetStaticBuffer( xInternalEventGroupHandle, ppxEventGroupBuffer );
3612 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
3613 /*-----------------------------------------------------------*/
3615 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
3617 BaseType_t MPU_xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
3618 const EventBits_t uxBitsToClear ) /* PRIVILEGED_FUNCTION */
3620 BaseType_t xReturn = pdFALSE;
3621 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3624 lIndex = ( int32_t ) xEventGroup;
3626 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3628 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3630 if( xInternalEventGroupHandle != NULL )
3632 xReturn = xEventGroupClearBitsFromISR( xInternalEventGroupHandle, uxBitsToClear );
3639 #endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */
3640 /*-----------------------------------------------------------*/
3642 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
3644 BaseType_t MPU_xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
3645 const EventBits_t uxBitsToSet,
3646 BaseType_t * pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
3648 BaseType_t xReturn = pdFALSE;
3649 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3652 lIndex = ( int32_t ) xEventGroup;
3654 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3656 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3658 if( xInternalEventGroupHandle != NULL )
3660 xReturn = xEventGroupSetBitsFromISR( xInternalEventGroupHandle, uxBitsToSet, pxHigherPriorityTaskWoken );
3667 #endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */
3668 /*-----------------------------------------------------------*/
3670 EventBits_t MPU_xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) /* PRIVILEGED_FUNCTION */
3672 EventBits_t xReturn = 0;
3673 EventGroupHandle_t xInternalEventGroupHandle = NULL;
3676 lIndex = ( int32_t ) xEventGroup;
3678 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3680 xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3682 if( xInternalEventGroupHandle != NULL )
3684 xReturn = xEventGroupGetBitsFromISR( xInternalEventGroupHandle );
3690 /*-----------------------------------------------------------*/
3692 /*-----------------------------------------------------------*/
3693 /* MPU wrappers for stream buffer APIs. */
3694 /*-----------------------------------------------------------*/
3696 size_t MPU_xStreamBufferSendImpl( StreamBufferHandle_t xStreamBuffer,
3697 const void * pvTxData,
3698 size_t xDataLengthBytes,
3699 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
3701 size_t MPU_xStreamBufferSendImpl( StreamBufferHandle_t xStreamBuffer,
3702 const void * pvTxData,
3703 size_t xDataLengthBytes,
3704 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
3707 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3709 BaseType_t xIsTxDataBufferReadable = pdFALSE;
3711 if( pvTxData != NULL )
3713 xIsTxDataBufferReadable = xPortIsAuthorizedToAccessBuffer( pvTxData,
3715 tskMPU_READ_PERMISSION );
3717 if( xIsTxDataBufferReadable == pdTRUE )
3719 lIndex = ( int32_t ) xStreamBuffer;
3721 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3723 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3725 if( xInternalStreamBufferHandle != NULL )
3727 xReturn = xStreamBufferSend( xInternalStreamBufferHandle, pvTxData, xDataLengthBytes, xTicksToWait );
3735 /*-----------------------------------------------------------*/
3737 size_t MPU_xStreamBufferReceiveImpl( StreamBufferHandle_t xStreamBuffer,
3739 size_t xBufferLengthBytes,
3740 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
3742 size_t MPU_xStreamBufferReceiveImpl( StreamBufferHandle_t xStreamBuffer,
3744 size_t xBufferLengthBytes,
3745 TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
3748 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3750 BaseType_t xIsRxDataBufferWriteable = pdFALSE;
3752 if( pvRxData != NULL )
3754 xIsRxDataBufferWriteable = xPortIsAuthorizedToAccessBuffer( pvRxData,
3756 tskMPU_WRITE_PERMISSION );
3758 if( xIsRxDataBufferWriteable == pdTRUE )
3760 lIndex = ( int32_t ) xStreamBuffer;
3762 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3764 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3766 if( xInternalStreamBufferHandle != NULL )
3768 xReturn = xStreamBufferReceive( xInternalStreamBufferHandle, pvRxData, xBufferLengthBytes, xTicksToWait );
3776 /*-----------------------------------------------------------*/
3778 BaseType_t MPU_xStreamBufferIsFullImpl( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
3780 BaseType_t MPU_xStreamBufferIsFullImpl( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
3782 BaseType_t xReturn = pdFALSE;
3783 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3786 lIndex = ( int32_t ) xStreamBuffer;
3788 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3790 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3792 if( xInternalStreamBufferHandle != NULL )
3794 xReturn = xStreamBufferIsFull( xInternalStreamBufferHandle );
3800 /*-----------------------------------------------------------*/
3802 BaseType_t MPU_xStreamBufferIsEmptyImpl( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
3804 BaseType_t MPU_xStreamBufferIsEmptyImpl( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
3806 BaseType_t xReturn = pdFALSE;
3807 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3810 lIndex = ( int32_t ) xStreamBuffer;
3812 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3814 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3816 if( xInternalStreamBufferHandle != NULL )
3818 xReturn = xStreamBufferIsEmpty( xInternalStreamBufferHandle );
3824 /*-----------------------------------------------------------*/
3826 size_t MPU_xStreamBufferSpacesAvailableImpl( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
3828 size_t MPU_xStreamBufferSpacesAvailableImpl( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
3831 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3834 lIndex = ( int32_t ) xStreamBuffer;
3836 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3838 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3840 if( xInternalStreamBufferHandle != NULL )
3842 xReturn = xStreamBufferSpacesAvailable( xInternalStreamBufferHandle );
3848 /*-----------------------------------------------------------*/
3850 size_t MPU_xStreamBufferBytesAvailableImpl( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
3852 size_t MPU_xStreamBufferBytesAvailableImpl( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
3855 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3858 lIndex = ( int32_t ) xStreamBuffer;
3860 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3862 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3864 if( xInternalStreamBufferHandle != NULL )
3866 xReturn = xStreamBufferBytesAvailable( xInternalStreamBufferHandle );
3872 /*-----------------------------------------------------------*/
3874 BaseType_t MPU_xStreamBufferSetTriggerLevelImpl( StreamBufferHandle_t xStreamBuffer,
3875 size_t xTriggerLevel ) PRIVILEGED_FUNCTION;
3877 BaseType_t MPU_xStreamBufferSetTriggerLevelImpl( StreamBufferHandle_t xStreamBuffer,
3878 size_t xTriggerLevel ) /* PRIVILEGED_FUNCTION */
3880 BaseType_t xReturn = pdFALSE;
3881 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3884 lIndex = ( int32_t ) xStreamBuffer;
3886 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3888 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3890 if( xInternalStreamBufferHandle != NULL )
3892 xReturn = xStreamBufferSetTriggerLevel( xInternalStreamBufferHandle, xTriggerLevel );
3898 /*-----------------------------------------------------------*/
3900 size_t MPU_xStreamBufferNextMessageLengthBytesImpl( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
3902 size_t MPU_xStreamBufferNextMessageLengthBytesImpl( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
3905 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3908 lIndex = ( int32_t ) xStreamBuffer;
3910 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
3912 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
3914 if( xInternalStreamBufferHandle != NULL )
3916 xReturn = xStreamBufferNextMessageLengthBytes( xInternalStreamBufferHandle );
3922 /*-----------------------------------------------------------*/
3924 /* Privileged only wrappers for Stream Buffer APIs. These are needed so that
3925 * the application can use opaque handles maintained in mpu_wrappers.c
3926 * with all the APIs. */
3927 /*-----------------------------------------------------------*/
3929 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
3931 StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,
3932 size_t xTriggerLevelBytes,
3933 BaseType_t xIsMessageBuffer,
3934 StreamBufferCallbackFunction_t pxSendCompletedCallback,
3935 StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* PRIVILEGED_FUNCTION */
3937 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3938 StreamBufferHandle_t xExternalStreamBufferHandle = NULL;
3942 * Stream buffer application level callback functionality is disabled for MPU
3945 configASSERT( ( pxSendCompletedCallback == NULL ) &&
3946 ( pxReceiveCompletedCallback == NULL ) );
3948 if( ( pxSendCompletedCallback == NULL ) &&
3949 ( pxReceiveCompletedCallback == NULL ) )
3951 lIndex = MPU_GetFreeIndexInKernelObjectPool();
3955 xInternalStreamBufferHandle = xStreamBufferGenericCreate( xBufferSizeBytes,
3961 if( xInternalStreamBufferHandle != NULL )
3963 MPU_StoreStreamBufferHandleAtIndex( lIndex, xInternalStreamBufferHandle );
3964 xExternalStreamBufferHandle = ( StreamBufferHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
3968 MPU_SetIndexFreeInKernelObjectPool( lIndex );
3974 traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer );
3975 xExternalStreamBufferHandle = NULL;
3978 return xExternalStreamBufferHandle;
3981 #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
3982 /*-----------------------------------------------------------*/
3984 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
3986 StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
3987 size_t xTriggerLevelBytes,
3988 BaseType_t xIsMessageBuffer,
3989 uint8_t * const pucStreamBufferStorageArea,
3990 StaticStreamBuffer_t * const pxStaticStreamBuffer,
3991 StreamBufferCallbackFunction_t pxSendCompletedCallback,
3992 StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* PRIVILEGED_FUNCTION */
3994 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
3995 StreamBufferHandle_t xExternalStreamBufferHandle = NULL;
3999 * Stream buffer application level callback functionality is disabled for MPU
4002 configASSERT( ( pxSendCompletedCallback == NULL ) &&
4003 ( pxReceiveCompletedCallback == NULL ) );
4005 if( ( pxSendCompletedCallback == NULL ) &&
4006 ( pxReceiveCompletedCallback == NULL ) )
4008 lIndex = MPU_GetFreeIndexInKernelObjectPool();
4012 xInternalStreamBufferHandle = xStreamBufferGenericCreateStatic( xBufferSizeBytes,
4015 pucStreamBufferStorageArea,
4016 pxStaticStreamBuffer,
4020 if( xInternalStreamBufferHandle != NULL )
4022 MPU_StoreStreamBufferHandleAtIndex( lIndex, xInternalStreamBufferHandle );
4023 xExternalStreamBufferHandle = ( StreamBufferHandle_t ) CONVERT_TO_EXTERNAL_INDEX( lIndex );
4027 MPU_SetIndexFreeInKernelObjectPool( lIndex );
4033 traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer );
4034 xExternalStreamBufferHandle = NULL;
4037 return xExternalStreamBufferHandle;
4040 #endif /* configSUPPORT_STATIC_ALLOCATION */
4041 /*-----------------------------------------------------------*/
4043 void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
4045 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4048 lIndex = ( int32_t ) xStreamBuffer;
4050 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4052 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4054 if( xInternalStreamBufferHandle != NULL )
4056 vStreamBufferDelete( xInternalStreamBufferHandle );
4059 MPU_SetIndexFreeInKernelObjectPool( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4062 /*-----------------------------------------------------------*/
4064 BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) /* PRIVILEGED_FUNCTION */
4066 BaseType_t xReturn = pdFALSE;
4067 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4070 lIndex = ( int32_t ) xStreamBuffer;
4072 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4074 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4076 if( xInternalStreamBufferHandle != NULL )
4078 xReturn = xStreamBufferReset( xInternalStreamBufferHandle );
4084 /*-----------------------------------------------------------*/
4086 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
4088 BaseType_t MPU_xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffers,
4089 uint8_t * ppucStreamBufferStorageArea,
4090 StaticStreamBuffer_t * ppxStaticStreamBuffer ) /* PRIVILEGED_FUNCTION */
4092 BaseType_t xReturn = pdFALSE;
4093 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4096 lIndex = ( int32_t ) xStreamBuffers;
4098 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4100 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4102 if( xInternalStreamBufferHandle != NULL )
4104 xReturn = MPU_xStreamBufferGetStaticBuffers( xInternalStreamBufferHandle, ppucStreamBufferStorageArea, ppxStaticStreamBuffer );
4111 #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
4112 /*-----------------------------------------------------------*/
4114 size_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
4115 const void * pvTxData,
4116 size_t xDataLengthBytes,
4117 BaseType_t * const pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
4120 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4123 lIndex = ( int32_t ) xStreamBuffer;
4125 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4127 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4129 if( xInternalStreamBufferHandle != NULL )
4131 xReturn = xStreamBufferSendFromISR( xInternalStreamBufferHandle, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken );
4137 /*-----------------------------------------------------------*/
4139 size_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
4141 size_t xBufferLengthBytes,
4142 BaseType_t * const pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
4145 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4148 lIndex = ( int32_t ) xStreamBuffer;
4150 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4152 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4154 if( xInternalStreamBufferHandle != NULL )
4156 xReturn = xStreamBufferReceiveFromISR( xInternalStreamBufferHandle, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken );
4162 /*-----------------------------------------------------------*/
4164 BaseType_t MPU_xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
4165 BaseType_t * pxHigherPriorityTaskWoken ) /* PRIVILEGED_FUNCTION */
4167 BaseType_t xReturn = pdFALSE;
4168 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4171 lIndex = ( int32_t ) xStreamBuffer;
4173 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4175 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4177 if( xInternalStreamBufferHandle != NULL )
4179 xReturn = xStreamBufferSendCompletedFromISR( xInternalStreamBufferHandle, pxHigherPriorityTaskWoken );
4185 /*-----------------------------------------------------------*/
4187 BaseType_t MPU_xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
4188 BaseType_t * pxHigherPriorityTaskWoken ) /*PRIVILEGED_FUNCTION */
4190 BaseType_t xReturn = pdFALSE;
4191 StreamBufferHandle_t xInternalStreamBufferHandle = NULL;
4194 lIndex = ( int32_t ) xStreamBuffer;
4196 if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
4198 xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
4200 if( xInternalStreamBufferHandle != NULL )
4202 xReturn = xStreamBufferReceiveCompletedFromISR( xInternalStreamBufferHandle, pxHigherPriorityTaskWoken );
4209 /*-----------------------------------------------------------*/
4211 /* Functions that the application writer wants to execute in privileged mode
4212 * can be defined in application_defined_privileged_functions.h. */
4214 #if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1
4215 #include "application_defined_privileged_functions.h"
4217 /*-----------------------------------------------------------*/
4219 #endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
4220 /*-----------------------------------------------------------*/