下面是处理进程的算法形式描述:
处理进程( )
{
根据当前运行路径,找到该进程所用的有关内部数据,恢复状态;
取当前顺序语句;
if (不含WAIT语句) //此处解决不含WAITE语句的进程的激活问题。
{
if (敏感信号发生更新) 激活该进程; //注意:激活后的当前执行语句即是第一条语句。
else return(NORMAL); //没有激活,无任何动作,退出。
}
while (当前顺序语句 != NULL ) //当前顺序语句==NULL表示已经执行了进程中最后一条语句。
{
switch (语句类型)
{
case WAIT语句:
//处理WAIT语句有两种情况:第一种是在进程激活状态下,及执行进程中的语句时遇到了WAIT语句,
第二种情况是在进程因为WAIT语句而挂起的情况下,需要判断是否要激活,其中对WAIT FOR语句的判断是在处理延时等待事件时判断的,并给进程设置了一个特殊的状态等时就绪状态,进入本算法是直接激活。
switch (进程状态)
{
case 激活状态:
改进程激活态为挂起状态; //因为此处是在执行顺序语句时遇到了WAIT语句,所以一定要挂起。
if (有WAIT FOR子句) 设置延时等待事件;
记录当前语句,作为下次激活时的入口;
return (SUSPENDED); //遇到WAIT FOR语句时,则设置延时等待事件,然后返回,返回标志为SUSPENDED(挂起)。其他WAIT语句则要到每个时刻进行
break;
case 等时就绪状态: // 在信号更新、处理延时等待事件时设置,表示原来设的等待时间现在已经到时,现在应该进行进程计算。等时就绪状态是专为延时等待事件设置,时间到了后无论其他等待条件是否成立,一定要激活进程,进行进程计算。
设进程状态为激活状态; //激活状态表示,本次应该进行计算。注意:该case语句无RETURN语句,即接着执行下一个循环(即VHDL的下一条语句)。
break;
case 挂起状态: //在挂起状态下,WAIT语句一定是当前要执行的第一条语句,此处判断挂起条件是否满足。
if (WAIT ON信号、WAIT UNTIL条件满足 )
{
设进程状态为激活状态; //激活后即进行后续语句的计算
if (WAIT FOR 子句) 删除该语句的延时等待事件;
}
else return(NORMAL); // 未被激活,不进行进程计算,直接退出。
break;
}
break;
case 其它顺序语句:
执行语句;
安排信号事件;
break;
}
取下一个顺序语句;
if (下一个顺序语句 != NULL )
当前顺序语句 = 下一条顺序语句; //后面接着执行下一条语句。
else if (有 WAIT语句)
当前顺序语句 = 第一条顺序语句; //注意:在有WAIT语句的进程中执行到最后一条语句后,要返回第一条语句接着执行,而不是结束。结束条件是直到遇到下一个WAIT语句,才使进程挂起。
else // 已到最后一句,且无WAIT语句。
{
记录第一条语句,作为下次激活时的入口; //对于无WAIT语句的进程,相当于在最后一条语句后加以跳WAIT
ON语句。激活这样的进程是在本算法钱不进行的。此处将进程挂起返回。
return(SUSPENDED);
}
}
进程执行语句的复杂性表现在激活或挂起的处理上,请读者按照进程的概念和WAIT语句的语义,弄懂进程的执行过程,再弄懂该程序是如何实现这样的执行过程的。
|