📄 process.h
字号:
/****************************************************************************
*****************************************************************************
文件名称: PROCESS.H
模块名称: 进程管理模块
模块作用: 对系统进程和用户进程的管理
编写者一: 陈俭(AP0006301)
编写者二:
编写日期:
完成日期:
程序行数: 620
*****************************************************************************
*****************************************************************************/
/****************************************************************************
模块名称: 进程管理模块
函 数 名: PROCESS_SCHEDUL
功 能: 实现进程调用算法,从就绪队列中选择一个进程,并将CPU分配给该进程
入口参数: 无
出口参数: TRUE
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-3
完成日期: 2003-10-4
*****************************************************************************/
M_PROCESS_SCHEDULE()
{
/* 存在就绪的系统进程,,系统进程优先权最高,应该优先于用户进程而调用它 */
if(SYSTEM_READY_QUEUE->p_tick > 0)
{
RUNNING_QUEUE->p_next = SYSTEM_READY_QUEUE->p_next;
RUNNING_QUEUE->p_tick++;
SYSTEM_READY_QUEUE->p_next = SYSTEM_READY_QUEUE->p_next->p_next;
SYSTEM_READY_QUEUE->p_tick--;
RUNNING_QUEUE->p_next->p_status = Running;
M_G_DISPLAY_SYSTEM_PROCESS();
}
/* 如果存在用户级就绪进程,,则调用该进程 */
else if(READY_QUEUE->p_tick > 0)
{
RUNNING_QUEUE->p_next = READY_QUEUE->p_next;
RUNNING_QUEUE->p_tick++;
READY_QUEUE->p_next = READY_QUEUE->p_next->p_next;
READY_QUEUE->p_tick--;
RUNNING_QUEUE->p_next->p_next = NULL;
M_G_MOVE_JOB_FROM_READY_QUEUE_TO_CPU();
}
/* 如果不存在用户级就绪进程,则调悬挂进程 */
else
{
RUNNING_QUEUE->p_next = P_PROCESS_SUPERWAIT;
RUNNING_QUEUE->p_tick = 1;
RUNNING_QUEUE->p_next->p_status = Running;
M_G_DISPLAY_SYSTEM_PROCESS();
}
M_G_DISPLAY_READY_QUEUE();
return(TRUE);
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: SUPERWAIT
功 能: 系统悬挂进程,当CPU空闲时,调用该进程
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
void SUPERWAIT()
{
int flag = FALSE;
/* 当没有发生中断时一直循环*/
while(flag == FALSE)
{
/* 系统时间计数加1*/
M_CLOCK();
/* 在图形方式下刷新显示CPU及中断参数的值*/
G_DISPLAY_CPU();
/* 判断是否发生中断 */
flag = CHECK_INTERRUPT();
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: RESTORE_PROCESS
功 能: 进程的现场恢复
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
void RESTORE_PROCESS()
{
/* 恢复通用寄存器 */
R = RUNNING_QUEUE->p_next->p_r;
/* 恢复状态寄存器 */
C = RUNNING_QUEUE->p_next->p_c;
/* 恢复计数器的值 */
PC = RUNNING_QUEUE->p_next->p_pc;
/* 恢复运行时间片*/
TIME = RUNNING_QUEUE->p_next->p_tick;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: RUN_VCS
功 能: 执行用户程序指令
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
int RUN_VCS()
{
int flag;
flag = FALSE;
/* 当没有发生中断时一直循环*/
while(flag == FALSE)
{
/* 执行一条VCS指令 */
VCS();
/* 系统时间计数加1*/
M_CLOCK();
/* 在图形方式下刷新显示CPU及中断参数的值*/
G_DISPLAY_CPU();
/* 判断是否发生中断 */
flag = CHECK_INTERRUPT();
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: SAVE_PROCESS
功 能: 进程数据的现场保护
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-5
完成日期: 2003-10-5
*****************************************************************************/
void SAVE_PROCESS()
{
/* 保存通用寄存器的值 */
RUNNING_QUEUE->p_next->p_r = R;
/* 保存状态寄存器 */
RUNNING_QUEUE->p_next->p_c = C;
/* 保存指令计数器 */
RUNNING_QUEUE->p_next->p_pc = PC;
/* 保存进程时间片 */
RUNNING_QUEUE->p_next->p_tick = TIME;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: PROCESS_KILL
功 能: 从内存中销毁一个进程
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-5
完成日期: 2003-10-5
*****************************************************************************/
void PROCESS_KILL()
{
/* 释放进程控制块结点*/
free(RUNNING_QUEUE->p_next);
/* 运行队列进程数减1*/
RUNNING_QUEUE->p_next = NULL;
RUNNING_QUEUE->p_tick--;
/* 在文本方式下显示内存占用情况 */
DISPLAY_MEMORY();
/* 延时处理*/
delay(DELAY_TIME*10);
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: VCS
功 能: 执行一条指令操作
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-11
完成日期: 2003-10-11
*****************************************************************************/
int VCS()
{
int temp_pc,vcs_result;
char buf[5];
/* 取得当前指令计数器的值,并将PC加1 */
temp_pc = GET_PC();
/* 如果temp_pc>=0表示没有越界 */
if(temp_pc >= 0 )
{
/* 将逻辑地址转换成内存的物理地址 */
temp_pc = LOGIC_TO_REAL_ADDRESS(temp_pc);
/* 取当前指令 */
GET_ONE_INSTRUCTION(temp_pc,&buf[0]);
/* 执行当前指令 */
EXECUTE_INSTRUCTION(&buf[0]);
/* 将当前指令内容存为全局变量CURRENT_INSTRUCTION中,它将显示在CPU参数表中 */
strcpy(CURRENT_INSTRUCTION,buf);
/* 在文本方式下显示CPU参数*/
DISPLAY_CPU();
ACTIVE_WINDOW(1);
}
else
{
/* 如果PC越界,置程序越界中断 */
SET_PI_INTERRUPT(PI1);
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: GET_PC
功 能: 获得当前PC的值,并PC++
入口参数: 无
出口参数: PC的值
调用关系: 被VCS调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-11
完成日期: 2003-10-11
*****************************************************************************/
int GET_PC()
{
/* 如果PC没有越界 */
if(PC < RUNNING_QUEUE->p_next->p_length )
/* 返回PC的值,并且PC+1 */
return(PC++);
else
/* 如果越界,返回FALSE */
return(FALSE);
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: COLOR
功 能: 模拟系统时间功能
入口参数: 无
出口参数: 无
调用关系: 被VCS调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-11
完成日期: 2003-10-11
*****************************************************************************/
M_CLOCK()
{
int i;
if(DISPLAY_BY_STEP == FALSE)
delay(DELAY_TIME*25);
DEAL_INPUT_KEY();
/* 检查通道状态 */
for(i=0;i<3;i++)
{
if(CHST[i].status == 'B')
{
/* 如果通道忙,则为通道计时 */
CHST[i].time--;
if(CHST[i].time <= 0)
SET_IOI_INTERRUPT(i+1);
}
}
/* 系统时间加1个单位时间 */
RTIME++;
if(RUNNING_QUEUE->p_next != NULL && RUNNING_QUEUE->p_next->p_id < 0)
{
/* 系统进程 */
if(RUNNING_QUEUE->p_next->p_id == SYSTEM_SUPERWAIT)
{
SUPERWAIT_TIME++;
/* 闲逛进程 */
}
else
{
KERNEL_TIME++;
/* 核心进程 */
}
}
else
{
/* 用户进程 */
USER_TIME++;
if(READY_QUEUE->p_tick == 0)
{
/* 现在系统中只存在一个用户进程 */
/* 进程已运行时间数加1*/
RUNNING_QUEUE->p_next->p_running_time++;
/* 如果进程使用的时间数大于用户程序中的估计时间数,则估计时间不足,发出中断 */
if(RUNNING_QUEUE->p_next->p_running_time > atoi(RUNNING_QUEUE->p_next->p_runtime))
{
SET_PI_INTERRUPT(PI7);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -