 /*  
 *********************************************************************************************************  
 *                                               uC/OS-II  
 *                                         The Real-Time Kernel  
 *  
 *                        (c) Copyright 1992-1998, Jean J Labrosse, Plantation, FL  
 *                                          All Rights Reserved  
 *                        (c) Copyright ARM Limited 1999  All rights reserved  
 *  
 *                                          ARM Specific code  
 *  
 *  
 * File : OS_CPU_CC  
 *
 * MODIFIED BY : LANCE SIMMS 9/22/10
 *   Included OSTaskStkInit()
 *********************************************************************************************************  
 */   
    
 #define  OS_CPU_GLOBALS   
 #include "ucos_ii.h"   
    
 #define BUILD_DATE "Build Date: " __DATE__ "\n"   
    
 /*  
 *********************************************************************************************************  
 *                                        INITIALIZE A TASK'S STACK  
 *  
 * Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the  
 *              stack frame of the task being created  This function is highly processor specific  
 *  
 * Arguments  : task          is a pointer to the task code  
 *  
 *              pdata         is a pointer to a user supplied data area that will be passed to the task  
 *                            when the task first executes  
 *  
 *              ptos          is a pointer to the top of stack  It is assumed that 'ptos' points to  
 *                            a 'free' entry on the task stack  If OS_STK_GROWTH is set to 1 then   
 *                            'ptos' will contain the HIGHEST valid address of the stack  Similarly, if  
 *                            OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address  
 *                            of the stack  
 *  
 *              opt           specifies options that can be used to alter the behavior of OSTaskStkInit()  
 *                            (see uCOS_IIH for OS_TASK_OPT_???)  
 *  
 * Returns    : Always returns the location of the new top-of-stack' once the processor registers have  
 *              been placed on the stack in the proper order  
 *  
 * Note(s)    : Interrupts are enabled when your task starts executing You can change this by setting the  
 *              PSW to 0x0002 instead  In this case, interrupts would be disabled upon task startup  The  
 *              application code would be responsible for enabling interrupts at the beginning of the task  
 *              code  You will need to modify OSTaskIdle() and OSTaskStat() so that they enable   
 *              interrupts  Failure to do this will make your system crash!  
 * 
 *              LS: 9/22/10
 *                I based this function definition off of AN-1226, which is supposed to compile on a PXA255
 *                processor and the text from pg.300-301 in MicroC/OS-II
 *
 *                The order of registers can be seen easily from the comments on the right to be 
 *                R13 (PC), R14 (LR), R12, R11....., R0, CPSR, SPSR
 *
*********************************************************************************************************  
 */   
    
#define   ARM_SYS_MODE  0x0000001F             /* This is the value for CSPR that enables interrupts      */

 OS_STK *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)   
 {   
     OS_STK *stk;   
    
     opt      = opt;                           /* 'opt' is not used, prevent warning                      */   
     stk      = ptos;                          /* Load stack pointer (SP)                                 */   
    
     *stk     = (OS_STK)task;                  /* R13 (PC) : Entry Point: Program Counter                 */  
     *(--stk) = (INT32U)0x14141414L;           /* R14 (LR)                                                */   
     *(--stk) = (INT32U)0x12121212L;           /* R12                                                     */
     *(--stk) = (INT32U)0x11111111L;           /* R11                                                     */   
     *(--stk) = (INT32U)0x10101010L;           /* R10                                                     */
     *(--stk) = (INT32U)0x09090909L;           /* R9                                                      */
     *(--stk) = (INT32U)0x08080808L;           /* R8                                                      */
     *(--stk) = (INT32U)0x07070707L;           /* R7                                                      */
     *(--stk) = (INT32U)0x06060606L;           /* R6                                                      */
     *(--stk) = (INT32U)0x05050505L;           /* R5                                                      */
     *(--stk) = (INT32U)0x04040404L;           /* R4                                                      */     
     *(--stk) = (INT32U)0x03030303L;           /* R3                                                      */
     *(--stk) = (INT32U)0x02020202L;           /* R2                                                      */
     *(--stk) = (INT32U)0x01010101L;           /* R1                                                      */
     *(--stk) = (INT32U)pdata;                 /* R0                                                      */  
     *(--stk) = (INT32U)ARM_SYS_MODE;          /* CPSR (Enable both IRQ and FIQ interrupts)               */
 
     return (stk);                             /* Return the address to which the stack pointer points    */  
 }   
    
 /*$PAGE*/   
 /*  
 *********************************************************************************************************  
 *                                       OS INITIALIZATION HOOK  
 *                                            (BEGINNING)  
 *  
 * Description: This function is called by OSInit() at the beginning of OSInit()  
 *  
 * Arguments  : none  
 *  
 * Note(s)    : 1) Interrupts should be disabled during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203   
 void  OSInitHookBegin (void)   
 {   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                       OS INITIALIZATION HOOK  
 *                                               (END)  
 *  
 * Description: This function is called by OSInit() at the end of OSInit()  
 *  
 * Arguments  : none  
 *  
 * Note(s)    : 1) Interrupts should be disabled during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203   
 void  OSInitHookEnd (void)   
 {   
 }   
 #endif   
    
 /*$PAGE*/   
 /*  
 *********************************************************************************************************  
 *                                          TASK CREATION HOOK  
 *  
 * Description: This function is called when a task is created  
 *  
 * Arguments  : ptcb   is a pointer to the task control block of the task being created  
 *  
 * Note(s)    : 1) Interrupts are disabled during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0    
 void  OSTaskCreateHook (OS_TCB *ptcb)   
 {   
     ptcb = ptcb;                       /* Prevent compiler warning                                     */   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                           TASK DELETION HOOK  
 *  
 * Description: This function is called when a task is deleted  
 *  
 * Arguments  : ptcb   is a pointer to the task control block of the task being deleted  
 *  
 * Note(s)    : 1) Interrupts are disabled during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0    
 void  OSTaskDelHook (OS_TCB *ptcb)   
 {   
     ptcb = ptcb;                       /* Prevent compiler warning                                     */   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                             IDLE TASK HOOK  
 *  
 * Description: This function is called by the idle task  This hook has been added to allow you to do    
 *              such things as STOP the CPU to conserve power  
 *  
 * Arguments  : none  
 *  
 * Note(s)    : 1) Interrupts are enabled during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251   
 void  OSTaskIdleHook (void)   
 {   
 
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                           STATISTIC TASK HOOK  
 *  
 * Description: This function is called every second by uC/OS-II's statistics task  This allows your   
 *              application to add functionality to the statistics task  
 *  
 * Arguments  : none  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0    
 void  OSTaskStatHook (void)   
 {   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                           TASK SWITCH HOOK  
 *  
 * Description: This function is called when a task switch is performed  This allows you to perform other  
 *              operations during a context switch  
 *  
 * Arguments  : none  
 *  
 * Note(s)    : 1) Interrupts are disabled during this call  
 *              2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that  
 *                 will be 'switched in' (ie the highest priority task) and, 'OSTCBCur' points to the   
 *                 task being switched out (ie the preempted task)  
 *
 * NOTES: Lance Simms, 9/23/10
 *        This function was empty to start with and there does not seem to be a reason it should do 
 *        anything in our application
 *
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0    
 void  OSTaskSwHook (void)   
 {   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                           OSTCBInit() HOOK  
 *  
 * Description: This function is called by OS_TCBInit() after setting up most of the TCB  
 *  
 * Arguments  : ptcb    is a pointer to the TCB of the task being created  
 *  
 * Note(s)    : 1) Interrupts may or may not be ENABLED during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203   
 void  OSTCBInitHook (OS_TCB *ptcb)   
 {   
     ptcb = ptcb;                                           /* Prevent Compiler warning                 */   
 }   
 #endif   
    
 /*  
 *********************************************************************************************************  
 *                                               TICK HOOK  
 *  
 * Description: This function is called every tick  
 *  
 * Arguments  : none  
 *  
 * Note(s)    : 1) Interrupts may or may not be ENABLED during this call  
 *********************************************************************************************************  
 */   
    
 #if OS_CPU_HOOKS_EN > 0    
 void  OSTimeTickHook (void)   
 {   
 }   
 #endif   
