/* ****************************************************************************** * uC/OS-II * The Real-Time Kernel * * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL * All Rights Reserved * * * Intel x86 Specific code * Protected Mode, Flat Memory Model * * DJGPP and NASM * * File : OS_CPU_C.C * By : Dan Lewis ****************************************************************************** */ #define OS_CPU_GLOBALS #include "libepc.h" #include "os_cpu.h" #include "os_cfg.h" #include "ucos_ii.h" ISR OldTickISR ; /* ****************************************************************************** * 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_II.H 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! ****************************************************************************** */ OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) { INT32U *stk; static BOOLEAN configured = FALSE ; if (!configured) { OS_ENTER_CRITICAL() ; OldTickISR = GetISR(IRQ2INT(IRQ_TICK)) ; SetISR(IRQ2INT(IRQ_TICK), OSTickISR) ; /* use 1 msec ticks */ SetISR(uCOS, OSCtxSw) ; /* uCOS task switch: S/W INT */ outportb(0x21, ~0x01) ; /* Unmask the timer IRQ in PIC */ OS_EXIT_CRITICAL() ; configured = TRUE ; } opt = opt ; /* 'opt' is not used, prevent warning */ stk = (INT32U *) ptos ; /* Load stack pointer */ /* Simulate call to function with arg */ *--stk = (INT32U) pdata ; /* Argument */ *--stk = (INT32U) task ; /* return address */ /* Simulate INT instruction */ *--stk = (INT32U) 0x00000200 ; /* PSW = Interrupts enabled */ *--stk = (INT32U) 0x0008 ; /* Code selector */ *--stk = (INT32U) task ; /* return address */ /* Simulate PUSHA instruction */ *--stk = (INT32U) 0xAAAAAAAA ; /* EAX */ *--stk = (INT32U) 0xCCCCCCCC ; /* ECX */ *--stk = (INT32U) 0xDDDDDDDD ; /* EDX */ *--stk = (INT32U) 0xBBBBBBBB ; /* EBX */ *--stk = (INT32U) 0x00000000 ; /* ESP */ *--stk = (INT32U) 0x11111111 ; /* EBP */ *--stk = (INT32U) 0x22222222 ; /* ESI */ *--stk = (INT32U) 0x33333333 ; /* EDI */ return ((OS_STK *) stk) ; } #if OS_CPU_HOOKS_EN /* ****************************************************************************** * 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_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_VERSION > 203 void OSInitHookEnd (void) { } #endif /* ****************************************************************************** * 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. ****************************************************************************** */ void OSTaskCreateHook (OS_TCB *ptcb) { ptcb = ptcb ; /* Prevent compiler warning */ } /* ****************************************************************************** * 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. ****************************************************************************** */ void OSTaskDelHook (OS_TCB *ptcb) { ptcb = ptcb ; /* Prevent compiler warning */ } /* ****************************************************************************** * 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' (i.e. the highest priority task) and, 'OSTCBCur' * points to the task being switched out (i.e. the * preempted task). ****************************************************************************** */ void OSTaskSwHook (void) { } /* ****************************************************************************** * 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 ****************************************************************************** */ void OSTaskStatHook (void) { } /* ****************************************************************************** * OSTCBInit() HOOK * * Description: This function is called by OSTCBInit() 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_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. ****************************************************************************** */ void OSTimeTickHook (void) { } /* ****************************************************************************** * 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_VERSION >= 251 void OSTaskIdleHook (void) { } #endif #endif