📄 os_cpu_c.c
字号:
/*
******************************************************************************
* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -