/******************************************************************//** * @file stack.c * @brief This file is part of RT-Thread RTOS * COPYRIGHT (C) 2011, RT-Thread Development Team * @author Bernard, onelife * @version 0.4 beta ********************************************************************** * @section License * The license and distribution terms for this file may be found in the file LICENSE in this * distribution or at http://www.rt-thread.org/license/LICENSE ********************************************************************** * @section Change Logs * Date Author Notes * 2006-08-23 Bernard first version * 2011-02-14 onelife Modify for EFM32 *********************************************************************/ /******************************************************************//** * @addtogroup cortex-m3 * @{ *********************************************************************/ /* Includes -------------------------------------------------------------------*/ #include /* Private typedef -------------------------------------------------------------*/ /* Private define --------------------------------------------------------------*/ /* Private macro --------------------------------------------------------------*/ /* Private variables ------------------------------------------------------------*/ /* Private function prototypes ---------------------------------------------------*/ /* Private functions ------------------------------------------------------------*/ /** * This function will initialize thread stack * * @param tentry the entry of thread * @param parameter the parameter of entry * @param stack_addr the beginning stack address * @param texit the function will be called when thread exit * * @return stack address */ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { unsigned long *stk; stk = (unsigned long *)stack_addr; *(stk) = 0x01000000L; /* PSR */ *(--stk) = (unsigned long)tentry; /* entry point, pc */ *(--stk) = (unsigned long)texit; /* lr */ *(--stk) = 0; /* r12 */ *(--stk) = 0; /* r3 */ *(--stk) = 0; /* r2 */ *(--stk) = 0; /* r1 */ *(--stk) = (unsigned long)parameter; /* r0 : argument */ *(--stk) = 0; /* r11 */ *(--stk) = 0; /* r10 */ *(--stk) = 0; /* r9 */ *(--stk) = 0; /* r8 */ *(--stk) = 0; /* r7 */ *(--stk) = 0; /* r6 */ *(--stk) = 0; /* r5 */ *(--stk) = 0; /* r4 */ /* return task's current stack address */ return (rt_uint8_t *)stk; } /******************************************************************//** * @} *********************************************************************/