void MPU_vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const xRegions ) { portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); vTaskAllocateMPURegions( xTask, xRegions ); portRESET_PRIVILEGE( xRunningPrivileged ); }
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) { BaseType_t xRunningPrivileged = prvRaisePrivilege(); vTaskAllocateMPURegions( xTask, xRegions ); portRESET_PRIVILEGE( xRunningPrivileged ); }
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) { BaseType_t xRunningPrivileged = xPortRaisePrivilege(); vTaskAllocateMPURegions( xTask, xRegions ); vPortResetPrivilege( xRunningPrivileged ); }
static void prvCheckTask( void *pvParameters ) { /* This task is created in privileged mode so can access the file scope queue variable. Take a stack copy of this before the task is set into user mode. Once that task is in user mode the file scope queue variable will no longer be accessible but the stack copy will. */ xQueueHandle xQueue = xFileScopeCheckQueue; long lMessage; unsigned long ulStillAliveCounts[ 2 ] = { 0 }; char *pcStatusMessage = "PASS\r\n"; unsigned char x = 5, y = 10; /* Just to remove compiler warning. */ ( void ) pvParameters; /* Demonstrate how the various memory regions can and can't be accessed. The task privilege is set down to user mode within this function. */ prvTestMemoryRegions(); /* Change the memory regions allocated to this task to those initially set up for demonstration purposes to those actually required by the task. */ vTaskAllocateMPURegions( NULL, xAltRegions ); /* This loop performs the main function of the task, which is blocking on a message queue then processing each message as it arrives. */ for( ;; ) { /* Wait for the next message to arrive. */ xQueueReceive( xQueue, &lMessage, portMAX_DELAY ); switch( lMessage ) { case mainREG_TEST_1_STILL_EXECUTING : /* Message from task 1, so task 1 must still be executing. */ ( ulStillAliveCounts[ 0 ] )++; break; case mainREG_TEST_2_STILL_EXECUTING : /* Message from task 2, so task 2 must still be executing. */ ( ulStillAliveCounts[ 1 ] )++; break; case mainPRINT_SYSTEM_STATUS : /* Message from tick hook, time to print out the system status. If messages has stopped arriving from either reg test task then the status must be set to fail. */ if( ( ulStillAliveCounts[ 0 ] == 0 ) || ( ulStillAliveCounts[ 1 ] == 0 ) ) { /* One or both of the test tasks are no longer sending 'still alive' messages. */ pcStatusMessage = "FAIL\r\n"; } /* Print a pass/fail message to the LCD - moving the message each time to provide feedback that the output is still being produced. LCD_PrintString() accesses const data stored in flash, which all tasks are at liberty to do, and GPIO for which an MPU region has been set up for it. */ LCD_ClearScreen(); LCD_PrintString( x>>1, y>>1, pcStatusMessage, 6, COLOR_RED ); x += 7; y += 9; /* Reset the count of 'still alive' messages. */ memset( ulStillAliveCounts, 0x00, sizeof( ulStillAliveCounts ) ); break; default : /* Something unexpected happened. Delete this task so the error is apparent (no output will be displayed). */ prvDeleteMe(); break; } } }