曲径通幽论坛

标题: PC_DOSSaveReturn() & PC_DOSReturn() [打印本页]

作者: beyes    时间: 2009-4-14 01:41
标题: PC_DOSSaveReturn() & PC_DOSReturn()
一、作用
PC_DOSSaveReturn() 保存当前的 DOS 环境,可以使用户返回到没有运行 uC/OS-II 之前的环境。
PC_DOSReturn() 调用此函数就是确定要返回 DOS 了。
二、PC_DOSSaveReturn() 代码:
void PC_DOSSaveReturn (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif  


    PC_ExitFlag  = FALSE;                                  /*还不想退出到 DOS 环境 */
    OSTickDOSCtr =     1;                                  /*初始化 DOS tick 计数器*/
    PC_TickISR   = PC_VectGet(VECT_TICK);    /*取得 MS-DOS's tick 向量并保存在PC_TickISR*/
  
    PC_VectSet(VECT_DOS_CHAIN, PC_TickISR);      /*存 MS-DOS's tick 到0x81号中断向量处*/
  
    setjmp(PC_JumpBuf);       /*设定恢复点,PC_JumpBuf 保存此时的上下文*/
    if (PC_ExitFlag == TRUE) {                             /*是否要返回 DOS */
        OS_ENTER_CRITICAL();
        PC_SetTickRate(18);                                /*恢复 DOS 默认的节拍频率18.2 Hz*/
        OS_EXIT_CRITICAL();
        PC_VectSet(VECT_TICK, PC_TickISR);    /*还原 DOS's tick 向量*/
        PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);  /*清屏*/
        exit(0);                                           /* Return to DOS */
    }
}
PC_DOSReturn() 代码
void PC_DOSReturn (void)
{
    PC_ExitFlag = TRUE;                                    /*要返回 DOS 了*/
    longjmp(PC_JumpBuf, 1);                                /*跳回还原点处(由 segjmp 指定)*/
三、setjmp()longjmp()
setjmp() 和 longjmp() 提供了一种在函数间跳转的手段,使用时要包含 <setjmp.h> 头文件。
setjmp() 实际上是一个宏函数,原型为:

int setjmp( jmp_buf envbuf ); 
setjmp() 在缓冲区 envbuf 中保存了系统堆栈的内容,以提供 longjmp() 以后使用。
单独调用 setjmp() 时,返回值为 0 。但以后在调用 longjmp() 后,longjmp() 会把一个值(非零值)传递给 setjmp.
longjmp() 的原型为:

void longjmp( jmp_buf envbuf, int status ); 
setjmp()相当于给程序设置了一个还原点,而 longjmp() 则是返回到这个还原点处。但是在 longjmp() 返回去时,还给 setjmp() 带去了一个返回值( 参数中的status--不允许为 0),这个返回值取代了原来返回的 0 值。
函数 longjmp() 最常用于在一个错误发生时,从一组深层嵌套的实用程序中返回。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2