再看3 处代码: 在uCOS_II.H 中有如下定义: OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];//定义指向任务控制块的指针数//组,且每个优先级在同一时刻只对应一个任务 OS_EXT INT8U OSPrioCur;//用于保存目前任务的优先级 OS_EXT INT32U OSCtxSwCtr;//32 位无符号全局整型变量,作为任务切换计数器 OS_EXT OS_TCB *OSTCBHighRdy;//指向最高优先级任务任务控制块的指针 if (OSPrioHighRdy != OSPrioCur) //就绪态任务中的最高优先级已不是目前任务的优先级,则进行中断级的任务//切换 { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; //将最高优先级任务控制块指针指向当前优先级最高的任务的任务控制块 OSCtxSwCtr++;//任务切换计数器加 1 OSIntCtxSw();//调用中断级任务切换函数 } 此段代码体现出了可剥夺型实时操作系统内核的特点. OSIntCtxSw()在80x86 上的移植代码,此代码在OS_CPU_A.ASM 中,代码如下: _OSIntCtxSw PROC FAR ; CALL FAR PTR _OSTaskSwHook ; 调用 OSTaskSwHook()函数,此函数在 ;OS_CPU_C.C 中只是个空函数,留给用户 ;在代码移植时自定义 ; MOV AX, SEG _OSTCBCur ;由于发生了段转移,恢复刚才(当前任务)数 MOV DS, AX; 据段 ; MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ;AH=_OSTCBHighRdy+3 ;AL=_OSTCBHighRdy+2 MOV DX, WORD PTR DS:_OSTCBHighRdy ;DH=_OSTCBHighRdy+1 ;DL=_OSTCBHighRdy MOV WORD PTR DS:_OSTCBCur+2, AX ;_OSTCBCur+3=AH ;_OSTCBCur+2=AL MOV WORD PTR DS:_OSTCBCur, DX ;_OSTCBCur+1=DH ;_OSTCBCur=DL ;OSTCBCur=OSTCBHighRdy MOV AL, BYTE PTR DS:_OSPrioHighRdy ; MOV BYTE PTR DS:_OSPrioCur, AL;OSPrioCur= OSPrioHighRdy ; LES BX, DWORD PTR DS:_OSTCBHighRdy ;取址指令 MOV SS, ES:[BX+2] ; MOV SP, ES:[BX] ; ;SS:SP=OSTCBHighRdy->OSTCBStkPtr POP DS ;DS 出栈 POP ES ;ES 出栈 POPA ;CPU 其余寄存器出栈 ; IRET ; 中断返回 ; _OSIntCtxSw ENDP 以上汇编代码在移植时根据处理器不同要作修改 四.在ISR 中通知任务做事的理解(以OSSemPost()为例) 在理解OSSemPost(),先要理解事件,如下是事件的数据结构: typedef struct { INT8U OSEventType;//事件类型,这里是OS_EVENT_TYPE_SEM 即信号量 INT8U OSEventGrp; //等待任务所在的组 IN...