portBASE_TYPE xPortStartScheduler( void ) { extern void vApplicationSetupTimerInterrupt( void ); /* Use pxCurrentTCB just so it does not get optimised away. */ if( pxCurrentTCB != NULL ) { /* Call an application function to set up the timer that will generate the tick interrupt. This way the application can decide which peripheral to use. A demo application is provided to show a suitable example. */ vApplicationSetupTimerInterrupt(); /* Enable the software interrupt. */ _IEN( _ICU_SWINT ) = 1; /* Ensure the software interrupt is clear. */ _IR( _ICU_SWINT ) = 0; /* Ensure the software interrupt is set to the kernel priority. */ _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; /* Start the first task. */ prvStartFirstTask(); } /* Just to make sure the function is not optimised away. */ ( void ) vSoftwareInterruptISR(); /* Should not get here. */ return pdFAIL; }
BaseType_t xPortStartScheduler( void ) { /* Use pxCurrentTCB just so it does not get optimised away. */ if( pxCurrentTCB != NULL ) { /* Call an application function to set up the timer that will generate the tick interrupt. This way the application can decide which peripheral to use. If tickless mode is used then the default implementation defined in this file (which uses CMT0) should not be overridden. */ configSETUP_TICK_INTERRUPT(); /* Enable the software interrupt. */ _IEN( _ICU_SWINT ) = 1; /* Ensure the software interrupt is clear. */ _IR( _ICU_SWINT ) = 0; /* Ensure the software interrupt is set to the kernel priority. */ _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; /* Start the first task. */ prvStartFirstTask(); } /* Execution should not reach here as the tasks are now running! prvSetupTimerInterrupt() is called here to prevent the compiler outputting a warning about a statically declared function not being referenced in the case that the application writer has provided their own tick interrupt configuration routine (and defined configSETUP_TICK_INTERRUPT() such that their own routine will be called in place of prvSetupTimerInterrupt()). */ prvSetupTimerInterrupt(); /* Just to make sure the function is not optimised away. */ ( void ) vSoftwareInterruptISR(); /* Should not get here. */ return pdFAIL; }