搜档网
当前位置:搜档网 › uCOS-II内核详解

uCOS-II内核详解

uCOS-II内核详解
uCOS-II内核详解

UC/OS-II内核详解

一.内核概述:

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。

UC/OS-II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。UC/OS-II的内核还可以被裁剪,Hmax中RTOS的就是一个被高度裁剪过的UC/OS-II。

二.任务控制块 OS_TCB:

uC/OS-II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。减少动态内存分配和释放。因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。

typedef struct os_tcb

{

OS_STK *OSTCBStkPtr;

#if OS_TASK_CREATE_EXT_EN

void *OSTCBExtPtr;

OS_STK *OSTCBStkBottom;

INT32U OSTCBStkSize;

INT16U OSTCBOpt;

INT16U OSTCBId;

#endif

struct os_tcb *OSTCBNext;

struct os_tcb *OSTCBPrev;

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

OS_EVENT *OSTCBEventPtr;

#endif

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN

void *OSTCBMsg;

#endif

INT16U OSTCBDly;

INT8U OSTCBStat;

INT8U OSTCBPrio;

INT8U OSTCBX;

INT8U OSTCBY;

INT8U OSTCBBitX;

INT8U OSTCBBitY;

#if OS_TASK_DEL_EN

BOOLEAN OSTCBDelReq;

#endif

} OS_TCB;

.OSTCBStkPtr是指向当前任务栈顶的指针。

.*OSTCBExtPtr;:任务扩展模块使用;

.*OSTCBStkBottom; 任务栈底指针

.OSTCBStkSize; 栈尺寸

.OSTCBOpt;

.OSTCBId; 任务ID

.OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双重链接,

.OSTCBEventPtr是指向事件控制块的指针

.OSTCBMsg是指向传给任务的消息的指针。

.OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,

.OSTCBStat是任务的状态字。

.OSTCBPrio是任务优先级。

.OSTCBX, .OSTCBY, .OSTCBBitX和 .OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程,任务就绪表依靠这些量来进行维护

OSTCBY = priority >> 3;

OSTCBBitY = OSMapTbl[priority >> 3];

OSTCBX = priority & 0x07;

OSTCBBitX = OSMapTbl[priority & 0x07];

.OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除

HMAX中的任务TCB删减为:

typedef struct{

OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */

OS_STK *OSTCBStkBot; /* Pointer to bottom of stack */

INTOS OSTCBStkSize; /* stack size */

Uint16 TimerPeriod; /* timer period */

Uint16 TimerCnt; /* timer counter */

TASK_EVENT OSEvent; /* event */

TASK_EVENT OSEventBitMask; /* event mask bits */

} OS_TCB;

三.任务的创建

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)

{

void *psp;

INT8U err;

/* Make sure priority is within allowable range */

if (prio > OS_LOWEST_PRIO) return (OS_PRIO_INVALID);

OS_ENTER_CRITICAL();

if (OSTCBPrioTbl[prio] == (OS_TCB *)0) /* Make sure task doesn't already exist at this priority */

{

/* Reserve the priority to prevent others from doing the same thing until task is created.*/ OSTCBPrioTbl[prio] = (OS_TCB *)1;

OS_EXIT_CRITICAL();

psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); /* Initialize the task's stack */ err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); /* Task’ TCB Init*/

if (err == OS_NO_ERR)

{

OS_ENTER_CRITICAL();

OSTaskCtr++; /* Increment the #tasks counter */

OSTaskCreateHook(OSTCBPrioTbl[prio]); /* Call user defined hook */

OS_EXIT_CRITICAL();

if (OSRunning) /* Find highest priority task if multitasking has started */

{

OSSched();

}

}

else

{

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio]=(OS_TCB *)0; /*Make this priority available to others */

OS_EXIT_CRITICAL();

}

return (err);

}

else

{

OS_EXIT_CRITICAL();

return (OS_PRIO_EXIST);

}

}

INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)

{

OS_TCB *ptcb;

OS_ENTER_CRITICAL();

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 */

OS_EXIT_CRITICAL();

ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */

ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */

ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */

ptcb->OSTCBDly = 0; /* Task is not delayed */

#if OS_TASK_CREATE_EXT_EN

ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */

ptcb->OSTCBStkSize = stk_size; /* Store stack size */

ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */

ptcb->OSTCBOpt = opt; /* Store task options */

ptcb->OSTCBId = id; /* Store task ID */

#else

pext = pext; /* Prevent compiler warning if not used */

stk_size = stk_size;

pbos = pbos;

opt = opt;

id = id;

#endif

#if OS_TASK_DEL_EN

ptcb->OSTCBDelReq = OS_NO_ERR;

#endif

ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */

ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];

ptcb->OSTCBX = prio & 0x07;

ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];

#if OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */ #endif

#if OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2))

ptcb->OSTCBMsg = (void *)0; /* No message received */

#endif

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio] = ptcb;

ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */

ptcb->OSTCBPrev = (OS_TCB *)0;

if (OSTCBList != (OS_TCB *)0)

{

OSTCBList->OSTCBPrev = ptcb;

}

OSTCBList= ptcb;

OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */

OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

OS_EXIT_CRITICAL();

return (OS_NO_ERR);

}

else

{

OS_EXIT_CRITICAL();

return (OS_NO_MORE_TCB);

}

}

OSTCBTbl(OSTCBFreeList所指向)与OSTCBList这两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。

HMAX工程中进行了简化处理,删减了OSTCBPrioTbl和OSTCBList,任务调度中只是对OSTCBTbl(简化为静态数组)进行访问的:

void OSTaskCreate (void (*task)(void), INTOS stksize, INTOS prio)

{

OS_TCB *ptcb;

OS_STK *psp;

OS_STK *ptos;

ptos = OSStkPtr;

OSTCBTbl[prio].OSTCBStkBot = ptos;

OSTCBTbl[prio].OSTCBStkSize = stksize;

OSStkPtr += stksize;

psp = (void*)OSTaskStkInit(task, ptos);

ptcb = &OSTCBTbl[prio];

ptcb->OSTCBStkPtr = psp;

ptcb->TimerPeriod = 0;

ptcb->TimerCnt = 0;

ptcb->OSEvent = 0;

OSTaskRdy(prio);

}

void OSSched (void)

{

OS_ENTER_CRITICAL();

OSPrioHighRdy = OSFindHighPrio(); /* Get the highest priority from table */

OSPrioCur = OSPrioHighRdy;

OSTCBHighRdy = &OSTCBTbl[OSPrioHighRdy];

OS_TASK_SW(); /* Perform a context switch */

OS_EXIT_CRITICAL();

}

四.任务状态:

uC/OS-II主要有五种任务状态,睡眠态就是挂起态,阻塞态和延时态这里统一为等待状态。增加了一个被中断状态。UC/OS-Ⅱ总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务[OSTaskIdle()]永远设为最低优先级空闲任,OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。空闲任务不可能被应用软件删除。

睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理,把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将通过任务调度立即得到CPU的控制权。一个任务可

以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。

正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态。HMAX中这部分功能是被裁剪掉了的。

正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。

正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。当所有的任务都在等待事件发生或等待延迟时间结束,μC/OS-Ⅱ执行空闲任务OSTaskIdle()。

在HMAX中,任务邮箱、信号量、任务消息等任务间通讯方式也都是被删减了的。是通过ptcb->OSEvent的置位检测,判断当前任务是否有事件发生。

void MotorControlTask(void)

{

TASK_EVENT event;

while(1)

{

event = OSEventPend(); //OSSemPend()

……

}

}

亦即OSEventPend相当于OSSemPend的作用。各任务独自运行,同时CPU提供给RTOS 一个中断向量地址为0x00000D1C的Timer计数中断,中断优先级为18,中断服务程序为OSTimerTick,当ptcb->TimerCnt计数达到用户设定的TimerPeriod,则产生一个事件OSISREventSend,OSISREventSend 调用OSTaskRdy 使对应的任务进入就绪状态。

void OSTimerTick(void)

{

while(ptcb <= ptcbend)

{

if(ptcb->TimerPeriod != 0)

{

if(++ptcb->TimerCnt >= ptcb->TimerPeriod)

{

OSISREventSend(prio,OS_EVENTID_TIMER);

}

}

ptcb++;

prio++;

}

}

Name VECTOR ID (1) Address (2) Size (x16) Description (3)

INT14 14 0x0000 0D1C 2 CPU-Timer2(for TI/RTOS use)

五.任务调度分析:

μC/O S-Ⅱ提供最简单的实时内核任务调度,算法简单,因此也只支持优先级抢占任务调度,不支持时间片轮训调度算法,不支持优先级逆转。

μC/OS-Ⅱ总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的。

void OSSched (void)

{

INT8U y;

OS_ENTER_CRITICAL();

/* Task scheduling must be enabled and not ISR level */

if ((OSLockNesting | OSIntNesting) == 0)

{

/* Get pointer to highest priority task ready to run */

y = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

if (OSPrioHighRdy != OSPrioCur)

{ /* No context switch if current task is highest ready */

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++; /* Increment context switch counter */

OS_TASK_SW(); /* Perform a context switch */

}

}

OS_EXIT_CRITICAL();

}

void OSIntExit (void)

{

OS_ENTER_CRITICAL();

if ((--OSIntNesting | OSLockNesting) == 0)

{ /* Reschedule only if all ISRs completed & not locked */

OSIntExitY = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((OSIntExitY << 3)

+ OSUnMapTbl[OSRdyTbl[OSIntExitY]]);

if (OSPrioHighRdy != OSPrioCur)

{

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++;

OSIntCtxSw(); /* Perform interrupt level context switch */ }

}

OS_EXIT_CRITICAL();

}

μC/OS-Ⅱ任务调度所花的时间是常数,与应用程序中建立的任务数无关。在μC/OS中曾经是先得到OSTCBHighRdy然后和OSTCBCur做比较。因为这个比较是两个指针型变量的比较,在8位和一些16位微处理器中这种比较相对较慢。而在μC/OS-Ⅱ中是两个整数的比较。并且,除非用户实际需要做任务切换,在查任务控制块优先级表OSTCBPrioTbl[]时,不需要用指针变量来查OSTCBHighRdy。综合这两项改进,即用整数比较代替指针的比较和当需要任务切换时再查表,使得μC/OS-Ⅱ比μC/OS在8位和一些16位微处理器上要更快一些。

为实现任务切换,OSTCBHighRdy必须指向优先级最高的那个任务控制块OS_TCB,这是通过将以OSPrioHighRdy为下标的OSTCBPrioTbl[]数组中的那个元素赋给OSTCBHighRdy来

实现的。最后宏调用OS_TASK_SW()来完成实际上的任务切换。

HMAX中只有6个任务,做了简化处理,并没有采用查找就绪表的方法查找优先级。采用的OSFindHighPrio()判断当前就绪态任务的优先级谁更高。

OSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。为缩短切换时间,OSSched()全部代码都可以用汇编语言写。为增加可读性,可移植性和将汇编语言代码最少化,OSSched()是用C写的。

六.任务切换:

Context Switch 是任务切换,或CPU寄存器内容切换,也有的书上称之为上下文切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Task’s Context Storage area),也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。

任务切换的相关函数:与CPU体系相关,汇编完成。

1. OSStartHighRdy() 执行优先级最高的任务

2. OSCtxSw() 完成任务的上下文切换

3. OSIntCtxSw() 中断后的上下文切换

任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在μC/OS-Ⅱ中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,μC/OS-Ⅱ运行就绪态的任务所要做的一切,只是恢复所有的CPU寄存器并运行中断返回指令。为了做任务切换,运行OS_TASK_SW(),人为模仿了一次中断。多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。中断服务子程序或陷阱处理(Trap hardler),也称作事故处理(exception handler),必须提供中断向量给汇编语言函数OSCtxSw()

#define uCOS 0x80 /* Interrupt vector # used for context switch */

#define OS_TASK_SW() asm INT uCOS // uCOS 为中断向量号

void main (void)

{

OSInit(); /* Initialize uC/OS-II */

PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */ OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0);

OSStart(); /* Start multitasking */

}

void PC_VectSet (INT8U vect, void (*isr)(void))

{

setvect(vect, (void interrupt (*)(void))isr);

}

HMAX工程中:

Name VECTOR ID (1) Address (2) Size (x16) Description (3)

USER11 30 0x0000 0D3C 2 User Defined Trap

#define OS_TASK_SW() asm(" TRAP #30")

void InitInterrupt(void)

{

// USER11 30 0x0000 0D3C 2 User Defined Trap

https://www.sodocs.net/doc/9013160076.html,ER11 = &OSCtxSw;

}

任务切换具体过程如下:

_OSStartHighRdy PROC FAR

MOV AX, SEG _OSTCBHighRdy ; Reload DS

MOV DS, AX ;

CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook

INC BYTE PTR DS:_OSRunning; Indicate that multitasking has started

LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr

MOV SS, ES:[BX+2] ;

MOV SP, ES:[BX+0] ;

POP DS ; Load task's context

POP ES ;

POPA ;

IRET ; Run task

_OSStartHighRdy ENDP

_OSCtxSw PROC FAR

PUSHA ; Save current task's context

PUSH ES ;

PUSH DS ;

MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered

MOV DS, AX ;

LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP

MOV ES:[BX+2], SS ;

MOV ES:[BX+0], SP ;

CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook

MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy (指针)

MOV DX, WORD PTR DS:_OSTCBHighRdy ;

MOV WORD PTR DS:_OSTCBCur+2, AX ;

MOV WORD PTR DS:_OSTCBCur, DX ;

MOV AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy (Prio)

MOV BYTE PTR DS:_OSPrioCur, AL ;

LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr

MOV SS, ES:[BX+2] ;

MOV SP, ES:[BX] ;

POP DS ; Load new task's context

POP ES ;

POPA ;

IRET ; Return to new task

_OSCtxSw ENDP

被OSIntExit调用的中断级上下文切换过程如下:

_OSIntCtxSw PROC FAR ; Ignore calls to OSIntExit and OSIntCtxSw

; ADD SP,8

ADD SP,10 ;

MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered

MOV DS, AX ;

LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP

MOV ES:[BX+2], SS ;

MOV ES:[BX+0], SP ;

CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook

MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy

MOV DX, WORD PTR DS:_OSTCBHighRdy ;

MOV WORD PTR DS:_OSTCBCur+2, AX ;

MOV WORD PTR DS:_OSTCBCur, DX ;

MOV AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy

MOV BYTE PTR DS:_OSPrioCur, AL

LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr

MOV SS, ES:[BX+2] ;

MOV SP, ES:[BX] ;

POP DS ; Load new task's context

POP ES ;

POPA ;

IRET ; Return to new task

_OSIntCtxSw ENDP

七. UC/OS-II的初始化:

void OSInit (void)

{

INT16U i;

OSTime = 0L; /* Clear the 32-bit system clock */

OSIntNesting = 0; /* Clear the interrupt nesting counter */

OSLockNesting = 0; /* Clear the scheduling lock counter */

OSTaskCtr = 0; /* Clear the number of tasks */

OSRunning = FALSE; /* Indicate that multitasking not started */

OSIdleCtr = 0L; /* Clear the 32-bit idle counter */

OSIdleCtrRun = 0L;

OSIdleCtrMax = 0L;

OSStatRdy = FALSE; /* Statistic task is not ready */

OSCtxSwCtr = 0; /* Clear the context switch counter */

OSRdyGrp = 0; /* Clear the ready list */

for (i = 0; i < OS_RDY_TBL_SIZE; i++) OSRdyTbl[i] = 0;

OSPrioCur = 0;

OSPrioHighRdy = 0;

OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */

OSTCBCur = (OS_TCB *)0;

OSTCBList = (OS_TCB *)0;

for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) /* Clear the priority table */

{

OSTCBPrioTbl[i] = (OS_TCB *)0;

}

for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++)

{ /* Init. list of free TCBs */

OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];

}

OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;

OSTCBFreeList = &OSTCBTbl[0];

#if OS_MAX_EVENTS >= 2

for (i = 0; i < (OS_MAX_EVENTS - 1); i++) /* Init. list of free EVENT control blocks */ {

OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];

}

OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;

OSEventFreeList = &OSEventTbl[0];

#endif

#if OS_Q_EN && (OS_MAX_QS >= 2)

OSQInit(); /* Initialize the message queue structures */

#endif

#if OS_MEM_EN && OS_MAX_MEM_PART >= 2

OSMemInit(); /* Initialize the memory manager */

#endif

OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低。

μC/OS-Ⅱ还初始化了4个空数据结构缓冲区。每个缓冲区都是单向链表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。控制块OS_TCB的数目也就自动确定了。当然,包括足够的任务控制块分配给统计任务和空闲任务。

调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。

八. UC/OS-II内核调度特点总结:

1.只支持基于优先级的抢占式调度算法,不支持时间片轮训;

2.64个优先级,只能创建64个任务,用户只能创建56个任务;

3.每个任务优先级都不相同。

4.不支持优先级逆转;

5.READY队列通过内存映射表实现快速查询。效率非常高;

6.支持时钟节拍;

7.支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;

8.支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;

9.每个任务有自己的堆栈,堆栈大小用户自己设定;

10.支持动态修改任务优先级;

11.任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;12.任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;13.任务的总个数(OS_MAX_TASKS)由用户决定;

14.0优先级最高,63优先级最低;

15.有一个优先级最低的空闲任务,在没有用户任务运行的时候运行.

附:UC/OS-II内核调度与vxWorks内核调度异同

UC/OS-II内核调度

1.只支持基于优先级的抢占式调度算法,不支持时间片轮训;2.64个优先级,只能创建64个任务,用户只能创建56个任务;3.每个任务优先级都不相同。4.不支持优先级逆转;5.READY队列通过内存映射表实现快速查询。效率非常高;6.支持时钟节拍;7.支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;8.支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;9.每个任务有自己的堆栈,堆栈大小用户自己设定;10.支持动态修改任务优先级;11.任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;12.任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;13.任务的总个数(OS_MAX_TASKS)由用户决定;14.0优先级最高,63优先级最低;15.有一个优先级最低的空闲任务,在没有用户任务运行的时候运行.

vxWorks内核调度

1.根据用户指定,动态分配堆栈,可以创建任意多个任务;2.任务的优先级从0——255,0优先级最高,允许多个任务相同优先级;3.支持优先级逆转,TCB保存两个优先级;4.支持抢占与时间片轮训的任务调度方式;5.支持中断嵌套,中断使用专用的堆栈保存上下文;6.队列采用FIFO或者优先级的双向链表实现;7.系统没有空闲任务执行;8.采用工作队列work Queue的方式调度;9.任务是基于类,对象的管理方式;10.任务的TCB保存在任务的堆栈里;11.每个任务有自己的堆栈,堆栈大小用户自己设定;12.支持动态修改任务优先级;13.通过编译开关实现对多CPU体系结构的支持。

实时操作系统UCOS-II,学会RTOS给你的身价增值

实时操作系统UCOS-II,学会RTOS给你的身价增值 如果,你最近关注一些嵌入式招聘职位描述,你可能会经常看到看到使用过uCOS、Vxworks、QNX等RTOS者优先。 随便打开一个20K的嵌入式开发工作职责: 你会发现熟悉RTOS的开发、移植、剪裁真的很吃香! 今天,我们就来介绍一下实时操作系统UCOS-II。 一、嵌入式操作系统概览 嵌入式操作系统的主要好处就是屏蔽了底层硬件的差别,给上层应用提供统一的接口,并管理进程调度和资源(如CPU时间、内存)分配等。并且可以充分利用硬件资源,如在单任务时(大循环结构,如大部分51程序)遇到delay函数时,CPU在空转。而在多任务系统,遇到delay或需等待资源时系统会自动运行下一个任务,等条件满足再回来运行先前的任务,这样就充分利用了CPU,提高了效率。 uC/OS操作系统与裸机程序的最大不同点就在于uC/OS有任务调度,可以根据任务的重要程度(优先级)优先执行重要的任务,从而确保能及时处理最重要的数据。(所以对于一个系统有必要使用OS的判断是能否划分一个个的任务,并且各任务间的耦合很小)可以思考下裸机程序中断的时候发生的过程。利用堆栈可以很自由的在A、B中切换,如果切换足够快,A、B看以来好像同时在执行,这就是并行,A、B就是任务。如果这个切换操作放到定时器函数中来做,就可以严格按照时间来切换。另外,各个任务之间有存在一定的关系,有逻辑上的先后等,必须引进全局的结构体、变量来标记一些信息,全局的这些数据是不会被释放的,所以所有的任务可以去通过读、写这些数据来实现各个程序块交流信息,实现所谓的同步、互斥。这就是操作系统的原理,而这些不同的通信方式按功能细分就成事件管理、内存管理等。

大数据技术架构解析

技术架构解析大数作者:匿名出处:论2016-01-22 20:46大数据数量庞大,格式多样化。大量数据由家庭、制造工厂和办公场所的各种设备、互联网事务交易、社交网络的活动、自动化传感器、移动设备以及科研仪器等生成。它的爆炸式增长已超出了传统IT基础架构的处理能力,给企业和社会带来严峻的数据管理问题。因此必须开发新的数据架构,围绕“数据收集、数据管理、数据分析、知识形成、智慧行动”的全过程,开发使用这些数据,释放出更多数据的隐藏价值。 一、大数据建设思路 1)数据的获得 大数据产生的根本原因在于感知式系统的广泛使用。随着技术的发展,人们已经有能力制造极其微小的带有处理功能的传感器,并开始将这些设备广泛的布置于社会的各个角落,通过这些设备来对整个社会的运转进行监控。这些设备会源源不断的产生新数据,这种数据的产生方式是自动的。因此在数据收集方面,要对来自网络包括物联网、社交网络和机构信息系统的数据附上时空标志,去伪存真,尽可能收集异源甚至是异构的数据,必要时还可与历史数据对照,多角度验证数据的全面性和可信性。 2)数据的汇集和存储 数据只有不断流动和充分共享,才有生命力。应在各专用数据库建设的基础上,通过数据集成,实现各级各类信息系统的数据交换和数据共享。数据存储要达到低成本、低能耗、高可靠性目标,通常要用到冗余配置、分布化和云计算技术,在存储时要按照一定规则对数据进行分类,通过过滤和去重,减少存储量,同时加入便于日后检索的标签。 3)数据的管理 大数据管理的技术也层出不穷。在众多技术中,有6种数据管理技术普遍被关注,即分布式存储与计算、内存数据库技术、列式数据库技术、云数据库、非关系型的数据库、移动数据库技术。其中分布式存储与计算受关注度最高。上图是一个图书数据管理系统。 4)数据的分析 数据分析处理:有些行业的数据涉及上百个参数,其复杂性不仅体现在数据样本本身,更体现在多源异构、多实体和多空间之间的交互动态性,难以用传统的方法描述与度量,处理的复杂度很大,需要将高维图像等多媒体数据降维后度量与处理,利用上下文关联进行语义分析,从大量动态而且可能是模棱两可的数据中综合信息,并导出可理解的内容。大数据的处理类型很多,主要的处理模式可以分为流处理和批处理两种。批处理是先存储后处理,而流处理则是直接处理数据。挖掘的任务主要是关联分析、聚类分析、分类、预测、时序模式和偏差分析等。 5)大数据的价值:决策支持系统 大数据的神奇之处就是通过对过去和现在的数据进行分析,它能够精确预测未来;通过对组织内部的和外部的数据整合,它能够洞察事物之间的相关关系;通过对海量数据的挖掘,它能够代替人脑,承担起企业和社会管理的职责。 6)数据的使用 大数据有三层内涵:一是数据量巨大、来源多样和类型多样的数据集;二是新型的数据处理和分三是运用数据分析形成价值。大数据对科学研究、经济建设、社会发展和文化生活等各个领;析技术 域正在产生革命性的影响。大数据应用的关键,也是其必要条件,就在于?屔与经营的融合,当然,这里的经营的内涵可以非常广泛,小至一个零售门店的经营,大至一个城市的经营。 二、大数据基本架构 基于上述大数据的特征,通过传统IT技术存储和处理大数据成本高昂。一个企业要大力发展大数据应用首先需要解决两个问题:一是低成本、快速地对海量、多类别的数据进行抽取和存储;二是使用新的技术对数据进行分析和挖掘,为企业创造价值。因此,大数据的存储和处理与云计算技术密不可分,在当前的技

ucos-ii操作系统复习大纲

ucos-ii操作系统复习大纲 一.填空题 1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式【抢占式】多任务实时内核。 2.任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【最高优先级】的任务。 3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪 个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。 4.【任务级】的调度是由函数OSSched()完成的,而【中断级】的调度 是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是【OS_TASK_SW()】完成实际的调度;OSIntExt()内部调用的是【 OSCtxSw() 】实现调度。 5.任务切换其实很简单,由如下2步完成: (1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。 (2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。 6.任务的5种状态。 【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。 【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。 【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。 【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。

【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。 7.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。 8.当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。 9.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。 10.【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。 11.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【局部变量】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【保护】。 12.每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。 13.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。 14.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。 15. μC/OS-Ⅱ的参数配置文件名为【】。 16.删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被μC/OS-Ⅱ调用。 17.μC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。 18.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。 19. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。 20.μC/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在中将OS_SEM_EN开关量常数置成【1 】,这样μC/OS-II 才能支持信号量。 21. μC/OS-II中表示当前已经创建的任务数全局变量名为:【 OSTaskCtr 】。

系统架构分析

论系统功能架构设计院系 专业 学号 姓名 成绩

摘要 当今,以信息科学技术为先导的社会变革,全面推动着社会的发展,当代社会进入了以网络信息为中心的信息时代。建立以计算机技术、网络技术、现代数据库技术为基础的现代多层人事管理信息系统,不仅是建立现代化企业的需要,也是发展的需要。文章从J2EE技术出发,对Struts、Spring和Hibemate框架进行了分析。Struts是一个MVC模式的框它将业务代码与视图代码分离开,有效的优化了系统结构,提高了系统的扩展性。Spring是一种轻量级的容器,依赖注入动态的使系统各组件间达到松散结合,同时能够很好的兼容各种框架。Hibemate是一个对象/关系数据库映射工具,提供了Java类到数据表之间的映射,实现了对象与数据库关系之间的交互,使系统具有良好的性能和移植性。 关键词:架构、多层分级、struts、Spring、Hibemate

系统功能架构分析与设计 1.系统分层结构应用及MVC框架开发简介 我们在做着表面上看似是对于各种不同应用的开发,其实背后所对应的架 构设计都是相对稳定的。在一个好的架构下编程,不仅对于开发人员是一件赏 心悦目的事情,更重要的是软件能够表现出一个健康的姿态;而架构设计的不 合理,不仅让系统开发人员受苦受难,软件本身的生命周期更是受到严重威胁。 信息系统功能部分一般采用多层架构,是在MVC框架概念上发展而来的, 最适合B/S及C/S程序的模板。而B/S是随着Internet技巧的兴起,对C/S结构的一种变化或者改良的结构。在这种结构下,用户工作界面是通过WWW浏览 器来实现,极少部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓三层结构,即表现层、业务逻辑层、数据持久层。其中,表现层:包含代码、用户交互GUI、数据验证,这层用于向客户端用户提供GUI交互,它允许用 户在显示系统中输入和编辑数据,同时,系统提供数据验证功能。这样就大大简 化了客户端电脑载荷,减轻了系统保护与升级的成本和工作量,降低了用户的 总体成本。同时也被广泛地应用到工具软件中,成为应用程序的构成基础。MVC把系统的组成分解成模型、视图、控制三个核心组成,三者的分离使得一 个模型可以具有多个显示视图。MVC具有设计清晰,易于扩展,运用可分布的 特点,使得前台后台的数据控制和表现能力彼此分离,加快开发进程及产品推 向市场的时间。 2.SSH开发框架的引入 SSH为Struts+Spring+Hibemate的一个集成框架,是目前比较流行的一种Web应用程序开源框架。集成SSH框架的系统从职责上分为四层:表示层、业 务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、 可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础框架,充当MVC里的Controller层,在Struts框架的模型部分,利用Hibemate框架对持久层提供支持,业务层用Spring支持。具体做法是:用面 向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,

嵌入式实时操作系统UCOS 2优劣势分析

嵌入式实时操作系统ucos ii的优劣势分析 引言 早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所曰益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。这些商业内核性能优越,但价格昂贵,主要用于16位和32位处理器中,针对国内大部分用户使用的51系列8位单片机,可以选择免费的ucos ii。 ucos ii的特点 1.ucos ii是由Labrosse先生编写的一个开放式内核,最主要的特点就是源码公开。这一点对于用户来说可谓利弊各半,好处在于,一方面它是免费的,另一方面用户可以根据自己的需要对它进行修改。缺点在于它缺乏必要的支持,没有功能强大的软件包,用户通常需要自己编写驱动程序,特别是如果用户使用的是不太常用的单片机,还必须自己编写移植程序。 2.ucos ii是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU使用权。这个特点使得它的实时性比非占先式的内核要好。通常我们都是在中断服务程序中使高优先级任务进入就绪态(例如发信号),这样退出中断服务程序后,将进行任务切换,高优先级任务将被执行。拿51单片机为例,比较一下就可以发现这样做的好处。假如需要用中断方式采集一批数据并进行处理,在传统的编程方法中不能在中断服务程序中进行复杂的数据处理,因为这会使得关中断时间过长。所以经常采用的方法是置一标志位,然后退出中断。由于主程序是循环执行的,所以它总有机会检测到这一标志并转到数据处理程序中去。但是因为无法确定发生中断时程序到底执行到了什么地方,也就无法判断要经过多长时间数据处理程序才会执行,中断响应时间无法确定,系统的实时性不强。如果使用μC/OS-II的话,只要把数据处理程序的优先级设定得高一些,并在中断服务程序中使它进入就绪态,中断结束后数据处理程序就会被立即执行。这样可以把中断响应时间限制在一定的范围内。对于一些对中断响应时间有严格要求的系统,这是必不可少的。但应该指出的是如果数据处理程序简单,这样做就未必合适。因为ucos ii要求在中断服务程序末尾使用OSINTEXIT函数以判断是否进行任务切换,这需要花费一定的时间。 3.ucos ii和大家所熟知的Linux等分时操作系统不同,它不支持时间片轮转法。ucos ii是一个基于优先级的实时操作系统,每个任务的优先级必须不同,分析它的源码会发现,ucos ii把任务的优先级当做任务的标识来使用,如果优先级相同,任务将无法区分。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其他任务才可以被执行。所以它只能说是多任务,不能说是多进程,至少不是我们所熟悉的那种多进程。显而易见,如果只考虑实时性,它当然比分时系统好,它可以保证重要任务总是优先占有CPU。但是在系统中,重要任务毕竟是有限的,这就使得划分其他任务的优先权变成了一个让人费神的问题。另外,有些任务交替执行反而对用户更有利。例如,用单

系统架构设计师的岗位职责

系统架构设计师的岗位职责 系统架构设计师需要负责系统及相关产品需求分析及架构设计。以下是小编整理的系统架构设计师的岗位职责。 系统架构设计师的岗位职责1 职责: 1. 负责公司系统的架构设计、研发工作 2. 配合产品经理对公司产品以及公司基础研究项目进行技术需求分析,承担从业务向技术转换的桥梁作用,根据产品业务需求提出技术方案和系统设计 3. 负责制定系统的整体框架,编写软件架构设计文档。对系统框架相关技术和业务进行培训,指导开发人员开发并解决系统开发、运行中出现的各种问题 4. 主持和参与系统逻辑模型和物理模型设计,负责开发和维护统一的软件开发架构,保证软件模块的复用性 5. 参与各项目、各阶段的技术评审;特别是技术架构方面和软件复用方面

6. 参与部门研发技术方向规划,负责提供软件产品框架和技术路线;负责关键技术的预研与攻关, 解决项目开发或产品研发中的技术难题 7. 协助部门经理合理分配软件研发任务使项目团队高效率运作,确保技术架构得以推进和实施 岗位要求: 1. 本科及以上学历,计算机或相关专业毕业, 8年以上软件产品开发及架构设计经验 2. 具有丰富的大中型开发项目的总体规划、方案设计及技术队伍管理经验 3. 熟悉C/C++或JAVA等开发语言,并且实际开发工作不少于5年;熟悉常见的数据库系统,如MySQL、Oracle和MongoDB 等 4. 精通设计模式和开源的框架,有面向对象分析、设计、开发能力(OOA、OOD、OOP),精通UML,熟练使用Rational Rose 等工具进行设计开发 5. 对计算机系统、网络和安全、应用系统架构等有全面的认识,熟悉项目管理理论,并有实践基础

《智能制造系统架构映射及示例解析》

国家智能制造系统架构映射及示例解析 图11 智能制造系统架构各维度与智能制造标准体系结构映射 图11通过具体的映射图展示了智能制造系统架构三个维度与智能制造标准体系的映射关系。由于智能制造标准体系结构中A基础共性及C行业应用涉及到整个智能制造系统架构,映射图中对B关键技术进行了分别映射。 B关键技术中包括BA智能装备、BB智能工厂、BC智能服务、BD智能赋能技术、BE工业网络等五大类标准。其中BA智能装备主要对应生命周期维度的设计、生产和物流,

系统层级维度的设备和单元,以及智能特征维度中的资源要素;BB智能工厂主要对应生命周期维度的设计、生产和物流,系统层级维度的车间和企业,以及智能特征维度的资源要素和系统集成;BC智能服务主要对应生命周期维度的销售和服务,系统层级维度的协同,以及智能特征维度的新兴业态;BD智能赋能技术主要对应生命周期维度的全过程,系统层级维度的企业和协同,以及智能特征维度的所有环节;BE工业网络主要对应生命周期维度的全过程,系统层级维度的设备、单元、车间和企业,以及智能特征维度的互联互通和系统集成。 智能制造系统架构通过三个维度展示了智能制造的全貌。为更好的解读和理解系统架构,以计算机辅助设计(CAD)、工业机器人和工业网络为例,诠释智能制造重点领域在系统架构中所处的位置及其相关标准。 1.计算机辅助设计(CAD)

智能特征系统集成互联互通融合共享 图12a CAD 在智能制造系统架构中的位置 CAD 位于智能制造系统架构生命周期维度的设计环节、系统层级的企业层,以及智能特征维度的融合共享,如图12a 所示。已发布的CAD 标准主要包括: ● GB/T 18784-2002 CAD/CAM 数据质量 ● GB/T 18784.2-2005 CAD/CAM 数据质量保证方 法 ● GB/T 24734-2009 技术产品文件 数字化产品定义 数据通则

大数据 技术架构解析

大数据技术架构解析 作者:匿名出处:论坛2016-01-22 20:46 大数据数量庞大,格式多样化。大量数据由家庭、制造工厂和办公场所的各种设备、互联网事务交易、社交网络的活动、自动化传感器、移动设备以及科研仪器等生成。它的爆炸式增长已超出了传统IT基础架构的处理能力,给企业和社会带来严峻的数据管理问题。因此必须开发新的数据架构,围绕“数据收集、数据管理、数据分析、知识形成、智慧行动”的全过程,开发使用这些数据,释放出更多数据的隐藏价值。 一、大数据建设思路 1)数据的获得 大数据产生的根本原因在于感知式系统的广泛使用。随着技术的发展,人们已经有能力制造极其微小的带有处理功能的传感器,并开始将这些设备广泛的布置于社会的各个角落,通过这些设备来对整个社会的运转进行监控。这些设备会源源不断的产生新数据,这种数据的产生方式是自动的。因此在数据收集方面,要对来自网络包括物联网、社交网络和机构信息系统的数据附上时空标志,去伪存

真,尽可能收集异源甚至是异构的数据,必要时还可与历史数据对照,多角度验证数据的全面性和可信性。 2)数据的汇集和存储 数据只有不断流动和充分共享,才有生命力。应在各专用数据库建设的基础上,通过数据集成,实现各级各类信息系统的数据交换和数据共享。数据存储要达到低成本、低能耗、高可靠性目标,通常要用到冗余配置、分布化和云计算技术,在存储时要按照一定规则对数据进行分类,通过过滤和去重,减少存储量,同时加入便于日后检索的标签。 3)数据的管理

4)数据的分析

5)大数据的价值:决策支持系统

大数据的神奇之处就是通过对过去和现在的数据进行分析,它能够精确预测未来;通过对组织内部的和外部的数据整合,它能够洞察事物之间的相关关系;通过对海量数据的挖掘,它能够代替人脑,承担起企业和社会管理的职责。 6)数据的使用

嵌入式实时操作系统ucos期末考试题

一、名词解释: 1、OS:操作系统 2、MCU:微控制器 3、ISR:中断服务子程序 4、FIFO:先进先出 5、TCB:Task Control Block,任务控制块 6、API:应用程序接口 7、RTOS:实时操作系统 8、UART:通用异步收发传输器 9、MMU:内存管理单元 10、JTAG:边界调试接口 二、填空题 1、( 优先级抢占和时间片轮转 )是一种运行时间一到就剥夺进程处理器使用权的剥夺式调度。 2、实时系统的两个基本要求:( 逻辑或功能正确 )、时间正确。所谓时间正确是指 (实时系统的计算必须在预定的时间内完成)。 3、临界区是指( 处理时不可分割的代码、每个进程中访问临界资源的那段程序 ) 4、UCOS调用系统延时最小时间单位( 毫秒 ) 5、UCOS配置文件中OS_TICKS_PER_SEC的数值定义为32,含义是(时钟频率为32 hz) 6如果某一个任务不是必须的监控任务,我们一般采用( 动态内存管理 )的机制来创建该任务所需要的变量内存空间,要想能使用这种机制,必须首先将内存交给(操作系统)来统一管理 7、如果系统中某一个资源属于独占资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决 8、在UCOS中,优先级用一个数字表示,数字越大表示任务的优先级别越(低) 9、优先级调度的( 任务就绪表 )标志进程抢占处理器的权利大小。 10、(任务控制块)主要用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表。 11、临界区是指( 保证共享资源的完整性和可靠性的代码段 )。 12、可重入指的是(是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据)。 13、某事件周期不确定,持续时间较短,处理容忍度较长,通常我们采取在(任务就绪表)中发现该事件,在(任务调度)中处理该事件。 14、如果系统中有2个资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决。 15、在UCOS中,最低优先级自动赋给( 空闲任务 )这个系统任务。 16、对CPU资源进行分配的两种操作系统常见调度算法为__(任务级调度_)和(中断级调度)。 17、uC/OS中,主要依靠_(任务堆栈_)来保存任务工作环境。

系统架构设计师-案例分析知识点整理

系统规划:包括系统项目的提出预可行性分析;系统方案的制定、评价和改进;新旧系统的分析和比较;现有软件、硬件和数据资源的有效利用; 软件架构设计:XML技术;基于架构的软件开发过程;软件的质量属性;架构(模型)风格;特定领域软件架构;基于架构的软件开发方法;架构评估;软件产品线;系统演化 设计模式:设计模式概念;设计模式的组成;模式和软件架构;设计模式分类;设计模式实现; 系统设计:处理流程设计;人机界面设计;文件涉及;存储设计;数据库设计;网络应用系统的设计;系统运行环境的集成与设计;中间件;应用服务器;性能设计与性能评估;系统转换设计划; 软件系统建模:系统需求、建模的作用以及意义;定义问题(目标、功能、性能)与归结模型(静态结构模型、动态行为模型、物理模型);结构化系统建模;数据流图;面向对象系统建模;统一建模语言(UML);数据库建模;E-R图;逆向工程; 分布式系统设计:分布式通行协议的设计;基于对象的分布式系统设计;基于web的分布式系统设计;基于消息和协同的分布式系统设计;异构分布式系统的互操作性设计; 嵌入式系统设计:实时系统和嵌入式系统特征;实时任务调度和多任务设计;中断处理和异常处理;嵌入式系统的开发设计 系统的可靠性分析与设计:系统故障模型和可靠性模型;系统的可靠性分析与可靠度计算;提高系统可靠性的措施;系统的故障对策和系统的备份与恢复; 、 系统安全性和保密性设计:系统的访问控制技术;数据的完整性;数据与文件的加密;通信的安全性;系统的安全性设计; 1、概念类 系统规划 项目计划:包括范围计划、工作范围计划、活动定义、资源需求、资源计划、活动排序、

ucOSII实时操作系统共41页

面向二十一世纪的嵌入式系统设计技术 第五讲: ucOS/II 实时操作系统 RTOS(一):ucOS/II 2002 年 1 月任课教员:徐欣 主讲教员:习勇 国防科大电子科学与工程学院 嵌入式系统开放研究小组 博士 博士 1

What is uC/OS? u: Micro C:control uC/OS : 适合于小的、控制器的操作系统 小巧 公开源代码,详细的注解可剥夺实时内核 可移植性强多任务确定性 2002/112

美国人 The S t ory of uC/OS Jean Labrosse 1992 年编写的 商业软件的昂贵 应用面覆盖了诸多领域,如照相机、医疗器 械、音响设备、发动机控制、高速公路电话 系统、自动提款机等 1998 年uC/OS-II ,目前 的版本 uCOS-II 2002/11 uC/OS-II V2.51 3

嵌入式操作系统—uC/OS 概要 内核结构 - 任务以及调度机制 任务间通信 uC/OS 的移植 在PC 机上运行 uC/OS 2002/114

—uC/OS 任务task 嵌入式操作系统 典型的一个无限循环。 void mytask(void *pdata) for (;;) { do something; waiting; do something; 支持64 个任务,每个任务一个特定的优先级。优先级 越高,数字越小 系统占用了两个任务,空闲任务和统计任务。 2002/11 5

嵌入式操作系统—uC/OS 任务的数据结构—任务控制块 任务控制块 OS_tcb ,包括 任务堆栈指针,状 态,优先级,任务 表 位置,任务链表指针 等。 所有的任务控制块分为两条链表,空闲 链表和使用链表。 新任务TCB (1) TCB0 TCB1 next pre ( 2 ) ( 3 ) OSTCBFr eeList 图 4 .3 TCB的 双向 链表 结构 TCBn 空 2002/116

移动边缘计算的系统架构和关键技术分析

无线互联科技 Wireless Internet Technology No.13 July,2019 第13期 2019年7月 移动边缘计算的系统架构和关键技术分析 董春利",王莉1 (1.南京交通职业技术学院电子信息工程学院,江苏南京211188;2.上海剑曦信息科技有限公司,上海200051) 摘要:随着移动互联网和物联网应用的快速发展,传统的集中式云计算遇到了严峻的挑战,例如高延迟、低频谱效率和非自适应机器类型的通信。为了解决这些挑战,新技术正在推动将集中式云计算功能转移到网络边缘设备。移动边缘计算被认为是物联网和任务关键型、垂直解决方案的关键推动因素,被公认为是一种关键的架构概念和技术之一。文章讨论分析了移动边缘计算的系统架构和关键技术。 关键词:移动边缘计算;虚拟机;计算卸载;VM迁移 移动边缘计算(Mobile Edge Computing,MEC)被欧洲电信标准化协会(European Telecommunications Standards Institute,ETSI)定义为一种新技术,在移动网络边缘、无线接入网络内以及移动用户附近,提供IT服务环境和云计算能力ETSI发布了一份关于移动边缘计算的白皮书,移动边缘计算被认为是一种重要的新兴技术,成为下一代网络的重要组成部分。由于具有低延迟、近距离和高带宽等先进特性,以及实时洞察无线网络信息和位置感知功能,移动边缘计算为多个行业(如消费者、企业)提供了大量新的应用和服务。特别地,MEC被认为是智能城市中处理视频流服务有前景的解决方案。 来自监视设备的视频流在MEC服务器上进行本地处理和分析,从视频流中提取有意义的数据。可以将有价值的数据传输到应用服务器,以减少核心网络流量。增强现实(Augmented Reality,AR)移动应用在上行链路中的数据收集、边缘计算和下行链路中的数据传递方面,具有固有的协作属性。增强现实数据需要低延迟和髙速率的数据处理,以便根据用户的位置提供正确的信息。数据处理可以在本地MEC服务器上执行,而不是在集中式服务器上执行,以提供良好的用户体验。物联网在电信网络上生成额外的消息,要求网关聚合消息并确保低延迟和安全性。引入利用MEC收集,分类和分析物联网数据流的新架构,MEC服务器负责管理各种协议、消息分发和分析处理。MEC环境创造了一个新的价值链和充满活力的生态系统,从而为移动运营商、应用和内容提供商创造了新的机会。 1MEC的系统架构 ETSI描述的MEC参考架构使MEC应用程序能够实现为在MEC主机上运行的纯软件实体⑵。移动边缘平台提供运行MEC应用程序所需的基本环境和功能。MEC应用程序在虚拟化基础架构之上作为虚拟机(Virtual Machine,VM)运行,并且可以与移动边缘平台交互以执行与应用程序的生命周期相关的某些支持过程。此外,虚拟化基础设施包括一个执行由移动边缘平台接收的流量规则的数据平面,并路由在应用本地网络和外部网络之间的流量。MEC主机级管理包括移动边缘平台管理器和虚拟化基础架构管理器。前者管理应用程序的生命周期以及应用程序规则和要求,包括服务授权、流量规则、域名系统(Domain Name System, DNS)配置和解决冲突。后者负责分配、管理和发布虚拟化基础架构的可视化(计算、存储和网络)资源。 操作支持系统通过生命周期管理代理商或运营商的第三方客户,通过面向客户的服务门户接收用户应用程序的请求,操作支持系统决定是否授予请求。授权请求将转发给MEC协调器进行下一步处理。MEC协调器是核心功能,因为它根据部署的MEC主机、可用资源、可用MEC服务和拓扑,维护一个整体视图。出于性能、成本、可扩展性、运营商首选部署的原因,MEC支持不同的部署方案叫例如在蜂窝宏基站演进型Node B站点(Evolved Node B,eNodeB)、在3G无线网络控制器(Radio Network Controller,RNC)站点、在多个无线电接入技术小区聚合站点,和聚合点(其也可以位于核心网络的边缘,例如在分布式数据中心中),探讨了一个网络规划问题,该讨论决定了在可用站点中安装MEC 服务器的最佳位置,以便在安装成本和服务质量(Quality of Service,QoS)之间进行权衡。 2MEC的关键技术 MEC的关键技术包括计算卸载和移动性管理。 计算卸载是一个将资源密集型计算从移动设备迁移到资源丰富的附近基础设施的过程画。虽然移动设备受到计算能力、电池寿命和散热的限制,但是通过将能量消耗的应用程序计算卸载到MEC服务器,MEC可以在用户设备(User Equipment,UE)上运行新的复杂应用程序。计算卸载的一个重要部分是决定是否卸载、是否适用全部或部分卸载、卸载什么以及如何卸载。卸载决策取决于根据3个标准分类的应用程序模型。第1个标准是应用程序是否包含不能卸载的用户等不可卸载部分(例如用户输入、摄像或需要在UEs处 基金项目:南京交通职业技术学院高层次人才科研基金项目;项目编号:440105001o 作者简介:董春利(1964—),男,山东青岛人,教授,博士;研究方向:认知无线电网络,下一代无线泛在网络。 -131_

嵌入式实时操作系统ucos期末考试题复习过程

) 一、名词解释: 1、OS:操作系统 2、MCU:微控制器 3、ISR:中断服务子程序 4、FIFO:先进先出 5、TCB:Task Control Block,任务控制块 6、API:应用程序接口 7、RTOS:实时操作系统 # 8、UART:通用异步收发传输器 9、MMU:内存管理单元 10、JTAG:边界调试接口 二、填空题 1、( 优先级抢占和时间片轮转)是一种运行时间一到就剥夺进程处理器使用权的剥夺式调度。 2、实时系统的两个基本要求:( 逻辑或功能正确)、时间正确。所谓时间正确是指 (实时系统的计算必须在预定的时间内完成)。 3、临界区是指( 处理时不可分割的代码、每个进程中访问临界资源的那段程序) ` 4、UCOS调用系统延时最小时间单位( 毫秒) 5、UCOS配置文件中OS_TICKS_PER_SEC的数值定义为32,含义是(时钟频率为32 hz) 6如果某一个任务不是必须的监控任务,我们一般采用( 动态内存管理)的机制来创建该任务所需要的变量内存空间,要想能使用这种机制,必须首先将内存交给(操作系统)来统一管理 7、如果系统中某一个资源属于独占资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决 8、在UCOS中,优先级用一个数字表示,数字越大表示任务的优先级别越(低) 9、优先级调度的( 任务就绪表)标志进程抢占处理器的权利大小。 10、(任务控制块)主要用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表。 11、临界区是指( 保证共享资源的完整性和可靠性的代码段)。 ( 12、可重入指的是(是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据)。 13、某事件周期不确定,持续时间较短,处理容忍度较长,通常我们采取在(任务就绪表)中发现该事件,在(任务调度)中处理该事件。 14、如果系统中有2个资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决。 15、在UCOS中,最低优先级自动赋给( 空闲任务)这个系统任务。 16、对CPU资源进行分配的两种操作系统常见调度算法为__(任务级调度_)和(中断级调度)。 17、uC/OS中,主要依靠_(任务堆栈_)来保存任务工作环境。

嵌入式实时操作系统_uCOSII

uC/OS-II
北京邮电大学计算机学院 邝 坚 2011年10月
教材及参考文献
《嵌入式实时操作系统 uC/OS-II(第2 版)》,Jean https://www.sodocs.net/doc/9013160076.html,brosse, 邵贝贝, 北航出版 社, 2003年1月

uC/OS-II的主要特点
实时性可确定:绝大多数系统服务的执行时间具有可确定 性,不依赖于用户应用程序Task数目的多少。 多任务、独立栈:最多64个Task,基于优先级抢占调度方 式。每个Task有自身独立的堆栈。 可裁减性:系统最小可裁减到几K到十几K,这种裁减还可 以做到基于函数级。 可移植性:与CPU体系结构相关部分用汇编编写,其他功 能组件CPU无关。 可靠、稳定性:由整个系统设计来保证,市场验证。美国 联邦航空管理局(FAA)认证。 开源代码:内核约5500行C代码。 可固化:面向嵌入式应用。
系统功能
实时内核 任务管理 时间管理 信号量、互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 内存管理 …

Targets x86 68k PPC CPU32 i960 SPARC ARM MIPS XScale …
Typical development configuration
Ethernet
RS-232
Development Host
Target
Typical scenario:
1. Boot target. 4. Download object module. 2. Attach target server. 5. Test & Debug. 3. Edit & compile. 6. Return to 3 or 1 as necessary

智能配电系统架构分析及技术挑战 戴年俊

智能配电系统架构分析及技术挑战戴年俊 摘要:配电自动化可以加强电力供应的可靠性以及稳定性,从而为电力用户提 供更加优质的服务,进一步满足不断提升的用户要求,所以要加强配电自动化系 统的配电管理工作。文章对智能配电系统架构和技术挑战进行了研究分析,以供 参考。 关键词:智能配电系统;架构分析;技术挑战 1前言 近些年我国的经济得到了较大的发展,人们的生活水平也得到了较大的提升,对于电力能源的需求也在不断上涨。随着我国城市化进程的不断加快,相应的配 电工程建设得到了极大的推广。但是从目前情况来看,配电自动化系统中配电工 程的工作量比较大,施工周期比较长,施工复杂性比较高,所以在配电管理中比 较容易出现问题。这就需要相关管理人员不断提升自身的综合能力,完善相应的 制度,采取针对性的策略优化配电管理,这对于推动我国配电自动化系统的发展 具有非常重要的意义。 2智能配用电信息系统架构 2.1系统架构 为充分利用供电企业现有配电自动化系统、用电信息采集系统的软硬件资源,同时兼顾调度、运检和营销专业应用需求,构建采集设备层、通信信道层、数据 融合层、高级应用层四个层次的智能配用电系统结构。采集设备层包含站所终端(DTU)、馈线终端(FTU)、配变终端(TTU)、故障指示器、配网状 态监测装置、集中器及电能表等采集设备;通信信道层包含光纤通信、无线公网 通信、无线专网通信及电力线载波等通信设备;数据融合层包含前置采集服务器、SCADA服务器、数据库服务器、无线公网采集服务器及二次安防防护设备等;高级应用层在数据融合的基础上实现故障精确定位、实时线损分析、配网主动抢修、用户用电行为分析及负荷预测等功能模块。 2.2系统设计方案 自2009年国家电网公司第一批配电自动化试点至今,配电自动化系统已 在96个地市开展应用,但是配用电相关专业系统间信息集成度不高,数据挖掘 和深化应用不够,配网运行状态监测、故障隔离等基础功能应用不足,配电自动 化系统实用化应用水平有待提升。通过汲取“十二五”配电自动化建设应用的经验,从功能定位清晰、应用主体明确、数据平台统一等方面设计了跨生产控制大区与 管理信息大区的智能配用电一体化主站系统方案。基于信息安全防护和投资成本 的考虑,将“三遥”配电终端和少量“二遥”配电终端以光纤专网方式接入生产控制 大区,而将大量“二遥”配电终端、故障指示器、电能表等以无线公网方式接入管 理信息大区。生产控制大区主要服务于配电网调度与控制,进一步强化配电自动 化系统的数据采集与运行监控、图模管理、馈线自动化及拓扑分析等基本功能应用,从管理信息大区获取所需实时数据、历史数据、图模文件及单相接地故障定 位结果等信息,同时将实时数据、馈线自动化定位结果等信息推送至管理信息大区。管理信息大区主要服务于配用电运行状态管控,通过整合中配电网的数据信息,实现配电网单相接地故障分析、配用电设备管理、线路和设备重过载分析等 功能,进一步实现故障精确定位、实时线损分析、配电网主动抢修、用户用电行 为分析及负荷预测等高级应用功能。生产控制大区与管理信息大区基于配用电统 一数据支撑平台,通过协同管控机制实现权限、责任区、告警定义等的分区维护、

嵌入式实时操作系统ucosii课后答案

第一章 1.什么是操作系统?它应具备什么功能? 操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。 功能: 1.计算机硬件的封装和扩充; 2.计算机资源的管理,包括处理器管理、存储器存储空间管理、外部输入输出(I/O)设备管理、文件管理、网络和通信管理、提供用户接口。 2.简述嵌入式操作系统与普通操作系统的区别。 嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,简称嵌入式系统。嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 3.什么是实时系统?对实时系统有什么要求? 如果一个系统能及时响应外部事件的请求,并能在规定的时间内完成对事件的处理,这种系统称为实时系统。 对实时系统的两个基本要求: 1.实时系统的计算必须产生正确的结果,称为逻辑或功能正确。 2.实时系统的计算必须在预定的时间内完成,称为时间正确。 4.什么是可剥夺内核? 当一个进程正在被处理器所运行时,其他就绪进程可以按照事先规定的规定的规则,强行剥夺正在运行进程的处理器使用权,而使自己获得处理器使用权并得以运行。 5.计算:RM 等三种算法;实时进程的可调度性。 一个事件发生周期为T =200ms ,一般需要运行50ms 才完毕。试按RM 算法确定该进程的优先级别prio 。 答:如果取k=1,根据T=200ms=0.2S ,则 T k prio 1= 结果:prio=5。 假如有三个同时发生的周期型进程:进程1,进程2,进程3,周期分别为P1=70ms ,P2=80ms ,P3=30ms ,它们完成任务的时间分别为:C1=20ms ,C2=15ms ,C3=10ms 。试判断该进程是否为可调度的。 答: 807.0301080157020=++=ρ777 .0)12(3)12(3=-=-n n

uCOSII实时操作系统通信机制之内核分析

μC/OS-II通信机制之内核分析 摘要:本文主要着重对μC/OS-III通信机制的内核分析,研究μC/OS-II内核通信机制的实现方式及实现的技巧,同时分析其中不足之处。 1.引言 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 μC/OS-II这款操作系统内核简单易学,通过对其源代码的分析,可以加深我们对操作系统内核的理解,为学习linux等大型操作系统打下基础。 2.操作系统中任务间的通信机制 内核中多个任务之间不可避免的存在相互协同的关系,来完成一定的内核功能。这种协同最直观的就是任务间相互通信。。包括VxWorks 等所有的嵌入式操作系统一般都会提供许多任务间通信的方法,通常包括: (1)共享内存,数据的简单共享。 (2)信号量,基本的互斥和同步。 (3)消息队列和管道,同一CPU 内多任务间消息传递。 (4)Socket 和远程调用,任务间透明的网络通信。 (5)Signals,用于异常处理。 在μC/OS-II中设计了五种通讯机制,或者说是同步机制,分别是信号量(semaphore),互斥体(mutual exclusion semaphore),事件组(event flag),邮箱(message box)和队列(queue)。 3. uC/OS-II中通信机制实现的方式分析 在uC/OS-II中是如何通信机制呢?这几种通信机制有什么关系?或者说有什么共同点有什么不同点?在实现上有哪些步骤是相同的?下面将就这几个问题进行分析论述。 我们知道通信机制是发生在任务之间的,换句话说任务与通信机制存在着关联。在内核又是如何处理这种关联呢?通信机制具体来说是信号量,互斥量,邮箱,队列等。通信机制协调的关系一般是针对两个以上的任务,比如说当两个任务互斥的访问共享资源,就需要一个互斥量,这个互斥量就关联着这两个任务。同样的道理,其他通信机制也是关联着两个以上的任务。那么设计内核时就要考虑如何将他们的关系有效协调地统一管理起来。 在内核中是通过一个事件控制块来实现通信机制与任务的联系。这里所说的事件就是指任务间进行通信时传递信号的统称。这里其实是利用到了一种抽象的思想,即将各种通信机制的共同点抽象出来,于是内核就设计了一个事件控制块的数据结构,这个数据结构是所有通信机制都会用到的,这样的设计就节省了不少代码,因为有共同点意味着有重复代码。 既然知道了事件控制块是实现通信机制代码共享的关键,那么下面我们就来分析下它的数据结构。

相关主题