123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #include "FreeRTOS.h"
- #include "task.h"
- #ifdef SOFTDEVICE_PRESENT
- #include "nrf_soc.h"
- #endif
- #include "portmacro_cmsis.h"
- STATIC_ASSERT(sizeof(portISRState_t) == sizeof(uint32_t));
- #define portCORTEX_M0_r0p0_ID ( 0x410CC200UL )
- #define portFIRST_USER_INTERRUPT_NUMBER ( 16 )
- #define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff )
- #define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 )
- #define portINITIAL_XPSR (((xPSR_Type){.b.T = 1}).w)
- #define portINITIAL_EXEC_RETURN ( 0xfffffffd )
- #ifdef configTASK_RETURN_ADDRESS
- #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS
- #else
- #define portTASK_RETURN_ADDRESS prvTaskExitError
- #endif
- static UBaseType_t uxCriticalNesting = 0;
- #ifdef SOFTDEVICE_PRESENT
- static UBaseType_t uxYieldFlag = 0;
- #endif
- extern void vPortSetupTimerInterrupt( void );
- void xPortSysTickHandler( void );
- extern void vPortStartFirstTask( void );
- static void prvTaskExitError( void );
- StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
- {
-
-
- pxTopOfStack--;
- *pxTopOfStack = portINITIAL_XPSR;
- pxTopOfStack--;
- *pxTopOfStack = ( StackType_t ) pxCode;
- pxTopOfStack--;
- *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS;
-
- pxTopOfStack -= 5;
- *pxTopOfStack = ( StackType_t ) pvParameters;
- pxTopOfStack -= 8;
- return pxTopOfStack;
- }
- static void prvTaskExitError( void )
- {
-
- configASSERT( uxCriticalNesting == ~0UL );
- portDISABLE_INTERRUPTS();
- for ( ;; );
- }
- BaseType_t xPortStartScheduler( void )
- {
-
- configASSERT( SCB->CPUID == portCORTEX_M0_r0p0_ID );
-
- NVIC_SetPriority(PendSV_IRQn, configKERNEL_INTERRUPT_PRIORITY);
-
- vPortSetupTimerInterrupt();
-
- uxCriticalNesting = 0;
-
- SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
-
- vPortStartFirstTask();
-
- prvTaskExitError();
-
- return 0;
- }
- void vPortEndScheduler( void )
- {
-
- configASSERT( uxCriticalNesting == 1000UL );
- }
- void vPortTaskYield( void )
- {
- #ifdef SOFTDEVICE_PRESENT
- if (uxCriticalNesting > 0)
- {
- uxYieldFlag = 1;
- }
- else
- {
- portPendSVSchedule();
- }
- #else
- portPendSVSchedule();
- #endif
- }
- void vPortEnterCritical( void )
- {
- portDISABLE_INTERRUPTS();
- uxCriticalNesting++;
-
- if ( uxCriticalNesting == 1 )
- {
- configASSERT( ( SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk ) == 0 );
- }
- }
- void vPortExitCritical( void )
- {
- configASSERT( uxCriticalNesting );
- uxCriticalNesting--;
- if ( uxCriticalNesting == 0 )
- {
- portENABLE_INTERRUPTS();
- #ifdef SOFTDEVICE_PRESENT
- if (uxYieldFlag)
- {
- uxYieldFlag = 0;
- portPendSVSchedule();
- }
- #endif
- }
- }
- void vPortSafeTaskSwitchContext( void )
- {
- uint32_t isrstate = portSET_INTERRUPT_MASK_FROM_ISR();
- vTaskSwitchContext();
- portCLEAR_INTERRUPT_MASK_FROM_ISR(isrstate);
- }
|