登录 注册
当前位置:主页 > 资源下载 > 50 > 在]中寻找到emc datadomain 2500存储设备的维护手册

在]中寻找到emc datadomain 2500存储设备的维护手册

  • 更新:2024-11-04 12:29:32
  • 大小:4.33MB
  • 推荐:★★★★★
  • 来源:网友上传分享
  • 类别:OS - 操作系统
  • 格式:PDF

资源介绍

为了启动任务,OSStartHighRdy()从任务控制块(OS_TCB)[程序清单L9.3(1)]中找到指向 堆栈的指针,然后运行POP DS [程序清单L9.3(2)], POP ES [程序清单L9.3(3)], POPA [程序 清单L9.3(4)], 和 IRET [程序清单L9.3(5)]指令。此处笔者将任务堆栈指针保存在任务控制块 的开头,这样使得堆栈指针的存取在汇编语言中更容易操作。 当执行了IRET指令后,CPU会从(SS:SP)指向的堆栈中恢复各个寄存器的值并执行中断前的指 令。SS:SP+4指向传递给任务的参数pdata。 程序清单L 9.3 OSStartHighRdy(). _OSStartHighRdy PROC FAR MOV AX, SEG _OSTCBHighRdy ; 载入 DS MOV DS, AX ; LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr (1) MOV SS, ES:[BX+2] ; MOV SP, ES:[BX+0] ; ; POP DS ; 恢复任务环境 (2) POP ES ; (3) POPA ; (4) ; IRET ; 运行任务 (5) _OSStartHighRdy ENDP 9.04.02 OSCtxSw() OSCtxSw()是一个任务级的任务切换函数(在任务中调用,区别于在中断程序中调用的 OSIntCtxSw())。在80x86系统上,它通过执行一条软中断的指令来实现任务切换。软中断向量 指向OSCtxSw()。在µC/OS-II中,如果任务调用了某个函数,而该函数的执行结果可能造成系统 任务重新调度(例如试图唤醒了一个优先级更高的任务),则在函数的末尾会调用OSSched(), 如果OSSched()判断需要进行任务调度,会找到该任务控制块OS_TCB的地址,并将该地址拷贝到 OSTCBHighRdy,然后通过宏OS_TASK_SW()执行软中断进行任务切换。注意到在此过程中,变量 OSTCBCur始终包含一个指向当前运行任务OS_TCB的指针。程序清单L9.4为OSCtxSw()的代码。 图F9.4是任务被挂起或被唤醒时的堆栈结构。在80x86处理器上,任务调用OS_TASK_SW()执 行软中断指令后[图F9.4/程序清单L9.4(1)],先向堆栈中压入返回地址(段地址和偏移量), 然后是状态字寄存器SW。紧接着用PUSHA [图F9.4/程序清单L9.4(2)], PUSH ES [图F9.4/程序 清单L9.4(3)],和 PUSH DS [图F9.4/程序清单L9.4(4)]保存任务运行环境。最后用OSCtxSw()在 任务OS_TCB中保存SS和SP寄存器。 任务环境保存完后,将调用用户定义的对外接口函数OSTaskSwHook()[程序清单L9.4(6)]。 请注意,此时 OSTCBCur指向当前任务 OS_TCB, OSTCBHighRdy指向新任务的 OS_TCB。在 OSTaskSwHook()中,用户可以访问这两个任务的OS_TCB。如果不使用对外接口函数,请在头文 件中把相应的开关选项关闭,加快任务切换的速度。