📄 task_init.c.svn-base
字号:
#include "OS_CPU.h"
#include "OS_TCB.h"
#include "global.h"
extern INT8U const OSUnMapTbl[256];
extern INT8U const OSMapTbl[8];
extern void OSStartHighRdy(void);extern INT8U CPU_SR_Rd(void);
void OS_InitRdyList (void)
{
INT8U i;
INT8U *prdytbl;
OSRdyGrp = 0; /* Clear the ready list */
prdytbl = &OSRdyTbl[0];
for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
*prdytbl++ = 0;
}
OSPrioCur = 0;
OSPrioHighRdy = 0;
OSTCBHighRdy = (OS_TCB *)0;
OSTCBCur = (OS_TCB *)0;
}
void OS_MemClr (INT8U *pdest, INT16U size)
{
while (size > 0) {
*pdest++ = (INT8U)0;
size--;
}
}
void OS_InitTCBList (void)
{
INT8U i;
OS_TCB *ptcb1;
OS_TCB *ptcb2;
OS_MemClr((INT8U *)&OSTCBTbl[0], sizeof(OSTCBTbl)); /* Clear all the TCBs */
OS_MemClr((INT8U *)&OSTCBidTbl[0], sizeof(OSTCBidTbl)); /* Clear the id table */
OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); /* Clear the priority table */
ptcb1 = &OSTCBTbl[0];
ptcb2 = &OSTCBTbl[1];
for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
ptcb1->OSTCBNext = ptcb2;
ptcb1++;
ptcb2++;
}
ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
OSTCBList = (OS_TCB *)0; /* TCB lists initializations */
OSTCBFreeList = &OSTCBTbl[0];
}
INT8U OS_TCBInit (OS_STK *ptos,INT8U prio, INT8U id, INT32U stk_size, INT8U taskclass,INT8U autoact,INT8U schedpcy)
{
OS_TCB *ptcb;
DisableAllInterrupts();
ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
if (ptcb != (OS_TCB *)0) {
OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
EnableAllInterrupts();
ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
ptcb->prio = prio; /* Load task priority into TCB */
ptcb->id = id; /* Store task ID */
ptcb->state =suspended;
ptcb->taskclass =taskclass;
ptcb->autoact =autoact;
#if SCHEDULE==MIXPREEMPT
ptcb->schedpcy =schedpcy;
#else
#if SCHEDULE==PREEMPT
ptcb->schedpcy =1;
#endif
#if SCHEDULE==NONPREEMPT
ptcb->schedpcy =0;
#endif
#endif
ptcb->OSTCBY = (INT8U)(prio >> 3); /* Pre-compute X, Y, BitX and BitY */
ptcb->OSTCBBitY = (INT8U)OSMapTbl[ptcb->OSTCBY];
ptcb->OSTCBX = (INT8U)(prio & 0x07);
ptcb->OSTCBBitX = (INT8U)OSMapTbl[ptcb->OSTCBX];
DisableAllInterrupts();
OSTCBidTbl[id] = ptcb;
#if ((CC==BCC1)||(CC==ECC1))
OSTCBPrioTbl[prio] = ptcb;
#endif
ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
ptcb->OSTCBPrev = (OS_TCB *)0;
if (OSTCBList != (OS_TCB *)0) {
OSTCBList->OSTCBPrev = ptcb;
}
OSTCBList = ptcb;
OSTaskCtr++; /* Increment the #tasks counter */
EnableAllInterrupts();
return (OS_ERR_NONE);
}
return (OS_ERR_TASK_NO_MORE_TCB);
}
void OS_InitTaskIdle (void)
{
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(TaskIdle,
(void *)0,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1]
,512,OS_TASK_IDLE_PRIO,0,BT,1,1);
#else
(void)OSTaskCreate(TaskIdle,
(void *)0,
&OSTaskIdleStk[0],
512,OS_TASK_IDLE_PRIO,0,BT,1,1);
#endif
}
#if (CC==BCC2)||(CC==ECC2)
void EnQueue(RdyQueue *Q,OS_TCB *x)
{
OS_TCB *ptcb;
if(Q->rear==(OS_TCB *)0) {
Q->front =x;
Q->rear =x;
} else {
Q->rear->RdyNext =x;
Q->rear =x;
}
}
OS_TCB *DeQueue(RdyQueue *Q)
{
OS_TCB *ptcb;
if (Q->front==(OS_TCB *)0) {
return (NO_TASK);
} else {
ptcb=Q->front;
if (Q->rear==Q->front) {
Q->front=(OS_TCB *)0;
Q->rear=(OS_TCB *)0;
} else {
Q->front=Q->front->RdyNext;
}
return (ptcb);
}
}
#endif
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT32U stk_size, INT8U prio, INT8U id, INT8U taskclass,INT8U autoact, INT8U schedpcy)
{
OS_STK *psp;
INT8U err;
if (prio>OS_LOWEST_PRIO) {
return(OS_PRIO_INVALID);
}
#if ((CC==BCC1)||(CC==ECC1))
DisableAllInterrupts();
if ((OSTCBPrioTbl[prio] == (OS_TCB *)0)&&(OSTCBPrioTbl[prio] == (OS_TCB *)0)) { /* Make sure task doesn't already exist at this priority */
OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
OSTCBidTbl[id] = (OS_TCB *)1; /* ... the same thing until task is created. */
EnableAllInterrupts();
psp = OSTaskStkInit(task, p_arg, ptos); /* Initialize the task's stack */
err = OS_TCBInit(psp,prio, id, stk_size, taskclass, autoact, schedpcy);
if (err == OS_ERR_NONE) {
if (autoact==TRUE) {
activatetask(id);
}
} else {
DisableAllInterrupts();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
EnableAllInterrupts();
}
return (err);
}
return (OS_ERR_PRIO_ID_EXIST);
#endif
#if ((CC==BCC2)||(CC==ECC2))
DisableAllInterrupts();
if (OSTCBidTbl[id] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this id */
OSTCBidTbl[id] = (OS_TCB *)1;
EnableAllInterrupts();
psp = OSTaskStkInit(task, p_arg, ptos); /* Initialize the task's stack */
err = OS_TCBInit(psp,prio, id, stk_size, taskclass, autoact, schedpcy);
if (err == OS_ERR_NONE) {
if (autoact==TRUE) {
activatetask(id);
}
} else {
DisableAllInterrupts();
OSTCBidTbl[prio] = (OS_TCB *)0; /* Make this priority available to others */
EnableAllInterrupts();
}
return (err);
}
//开中断
return (OS_ERR_ID_EXIST);
#endif
}
OS_STK *OSTaskStkInit(void (*task)(void *pd), void *p_arg, OS_STK *ptos)
{
OS_STK *stkp; /* Local: Stack pointer */
OS_CPU_SR msr; /* Local: Initial MSR */
OS_CPU_SR srr1; /* Local: Initial SRR1*/
msr = CPU_SR_Rd(); /* get the MSB reg value */
srr1 = (msr | 0x8000); /* set MSR[EE] bit to enable interrupts */
stkp = (OS_STK *)((INT32U) ptos & (INT32U) 0xFFFFFFF8); /* 8-byte align task's stack pointer (EABI)*/
/* Stack Frame Initialization*/
*--stkp = (INT32U)msr; /* MSR*/
*--stkp = (INT32U)task; /* LR */
*--stkp = 0; /* CR*/
*--stkp = 0; /* XER*/
*--stkp = 0; /* CTR */
*--stkp = (INT32U)srr1; /* SRR1*/
*--stkp = (INT32U)task; /* SRR0*/
*--stkp = 0; /* R0*/
*--stkp = 0x30L; /* r30 */
*--stkp = 0x29L; /* r29 */
*--stkp = 0x28L; /* r28 */
*--stkp = 0x27L; /* r27 */
*--stkp = 0x26L; /* r26 */
*--stkp = 0x25L; /* r25 */
*--stkp = 0x24L; /* r24 */
*--stkp = 0x23L; /* r23 */
*--stkp = 0x22L; /* r22 */
*--stkp = 0x21L; /* r21 */
*--stkp = 0x20L; /* r20 */
*--stkp = 0x19L; /* r19 */
*--stkp = 0x18L; /* r18 */
*--stkp = 0x17L; /* r17 */
*--stkp = 0x16L; /* r16 */
*--stkp = 0x15L; /* r15 */
*--stkp = 0x14L; /* r14 */
*--stkp = 0x13L; /* r13 */
*--stkp = 0x12L; /* r12 */
*--stkp = 0x11L; /* r11 */
*--stkp = 0x10L; /* r10 */
*--stkp = 0x9L; /* r09*/
*--stkp = 0x8L; /* r08 */
*--stkp = 0x7L; /* r07 */
*--stkp = 0x6L; /* r06 */
*--stkp = 0x5L; /* r05 */
*--stkp = 0x4L; /* r04 */
*--stkp = (INT32U)p_arg; /* r03 */
*--stkp = 0x2L; /* r02 */
*--stkp = 0x1L; /* r01 */
*--stkp = (INT32U)ptos; /* Stack Ptr*/
return(stkp);
}
static void OS_InitMisc (void){ OSIntNesting = 0; /* Clear the interrupt nesting counter */ OSTaskCtr = 0; /* Clear the number of tasks */ OSRunning = FALSE; /* Indicate that multitasking not started */ OSCtxSwCtr = 0; /* Clear the context switch counter */ OSIdleCtr = 0L; /* Clear the 32-bit idle counter */ }
void OSStart (void)
{
#if (CC==BCC1)||(CC==ECC1)
if (OSRunning == FALSE) {
OS_SchedNew(); /* Find highest priority's task priority number */
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* Execute target specific code to start task */
}
#endif
#if (CC==BCC2)||(CC==ECC2)
if (OSRunning == FALSE) {
OS_SchedNew(); /* Find highest priority's task priority number */
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = DeQueue(&OSTCBPrioTbl[OSPrioHighRdy]); /* Point to highest priority task ready to run */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy();
}
#endif
}
void OSInit(void)
{
OS_InitMisc();
OS_InitRdyList();
OS_InitTCBList();
Init_RCBArray();
OS_InitTaskIdle();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -