/* * See header file for description. */ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { StackType_t *pxOriginalTOS; pxOriginalTOS = pxTopOfStack; #if __TI_VFP_SUPPORT__ { /* Ensure the stack is correctly aligned on exit. */ pxTopOfStack--; } #endif /* Setup the initial stack of the task. The stack is set exactly as expected by the portRESTORE_CONTEXT() macro. */ /* First on the stack is the return address - which is the start of the as the task has not executed yet. The offset is added to make the return address appear as it would within an IRQ ISR. */ *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ pxTopOfStack--; #ifdef portPRELOAD_TASK_REGISTERS { *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ pxTopOfStack--; *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ pxTopOfStack--; } #else { pxTopOfStack -= portSPACE_BETWEEN_TOS_AND_PARAMETERS; } #endif /* Function parameters are passed in R0. */ *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ pxTopOfStack--; /* Set the status register for system mode, with interrupts enabled. */ *pxTopOfStack = ( StackType_t ) ( ( _get_CPSR() & ~0xFF ) | portINITIAL_SPSR ); if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) { /* The task will start in thumb mode. */ *pxTopOfStack |= portTHUMB_MODE_BIT; } #ifdef __TI_VFP_SUPPORT__ { pxTopOfStack--; /* The last thing on the stack is the tasks ulUsingFPU value, which by default is set to indicate that the stack frame does not include FPU registers. */ *pxTopOfStack = pdFALSE; } #endif return pxTopOfStack; }
void logger_logmode(void) { logger_debug("System currently in %s mode", logger_getmode(_get_CPSR())); }