曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7568|回复: 0
打印 上一主题 下一主题

PC_DOSSaveReturn() & PC_DOSReturn()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 01:41:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、作用
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() 最常用于在一个错误发生时,从一组深层嵌套的实用程序中返回。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 07:46 , Processed in 0.061016 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表