|
一、作用
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() 最常用于在一个错误发生时,从一组深层嵌套的实用程序中返回。 |
|