正常模式:直行时间显示数码管显示60。此时南北段直行通行(绿灯)、东西段禁止(红灯)60s,倒计时到3s时,黄灯亮,提醒人们注意了。然后是东西段通行(绿灯),南北段禁行(红灯),一直循环下去。
繁忙模式:南北段、东西段的通行时间改为30s,其它与正常模式类似。
特殊模式:特殊模式红灯全亮,倒计时20s,到最后3秒黄灯闪3次后并转入正常模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar i,a;
uint counter,ge,shi,temp;
sbit A_0=P0^3; //南北红
sbit A_1=P0^4; //南北黄
sbit A_2=P0^5; //南北绿
sbit B_0=P0^0; // 东西红
sbit B_1=P0^1; // 东西黄
sbit B_2=P0^2; // 东西绿
sbit WE1=P3^1; // 十位位选
sbit WE2=P3^0; // 个位位
sbit number=P1^5; // 正常模式开
sbit busy=P1^6; // 繁忙模式开
sbit special=P1^7; // 特殊模式开
sbit number1=P1^0; // 正常指示灯
sbit busy1=P1^1; // 繁忙指示灯
sbit special1=P1^2; // 特殊指示灯
sfr WDT=0xe1; // 看门狗特殊存放器设置
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(uint time); //延时函数声明
void initial(); //初始化函数声明
void status1(); // 状态1函数声明
void status2(); // 状态2函数声明
//显示函数
void display(){
P0=table[shi];
WE1=0;delay(1);
WE1=1;
P0=0xff;//delay(1);
P0=table[ge];
WE2=0;delay(1);
WE2=1;}
//主函数
void main(){ //if(on==0){
//大循环
WDT=0x34;
initial();
while(1){
counter=temp;
status1();
// WDT=0x37;
counter=temp;
status2();
// WDT=0x37;
}}
//初始化函数
void initial(){
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1;
TR0=1;
EX0=1;
IT0=1; //边沿触发
temp=60;
a=0;
}
//状态函数1
void status1(){
A_1=1;B_1=1;
while(counter){
if(temp==60){
number1=0;busy1=1;special1=1;}
else{ if(temp==30){
number1=1;busy1=0;special1=1;}
else{if(temp==20){
number1=1;busy1=1;special1=0;} }
}
display();
if(a==1){
A_0=0;A_2=1;
B_0=0;B_2=1;}
else {
A_0=0;A_2=1; // 东西行,南北断
B_0=1;B_2=0;} //东西断,南北行
if(counter==3){
if(i<=10){
B_1=0;
A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==2){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==1){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(a==1&counter==0){temp=60;a=0;}
}
}
//状态函数1
void status2(){
A_1=1;B_1=1;
while(counter){
if(temp==60){
number1=0;busy1=1;special1=1;}
else{ if(temp==30){
number1=1;busy1=0;special1=1;}
else{if(temp==20){
number1=1;busy1=1;special1=0;} }
}
display();
if(a==1){
A_0=0;A_2=1;
B_0=0;B_2=1;}
else {
A_0=1;A_2=0; // 东西行,南北断
B_0=0;B_2=1;} //东西断,南北行
if(counter==3){
if(i<=10){
B_1=0;
A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==2){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==1){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(a==1&counter==0){temp=60;a=0;}
}
}
//延时函数
void delay(uint time){
uint a;
for(;time>0;time--)
for(a=10;a>0;a--);
}
//定时器中断0
void timer() interrupt 1{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20){
counter--;
WDT=0x34;
i=0;
shi=counter/10;
ge=counter%10;}}
//外部中断0
void EXTR0() interrupt 0 {
if(number==0){
temp=60;}
if(busy==0){
temp=30;}
if(special==0){
temp=20;
counter=temp;
number1=1;busy1=1;special1=0;
a=1;
}
}
可以参考一下这个
https://ask.csdn.net/questions/7935269/54184160?spm=1001.2014.3001.5504
代码看起来没啥问题 现在是有什么问题吗
北京航空航天大学计算机学院-2020春操作系统课程
题目作者为北航计算机学院操作系统课程组,答案为博主原创。水平有限,无法保证作答正确性,如有错误敬请批评指正。部分作答源自百度谷歌等其他资料,如有侵权联系删除
1 一个线程是否会被时钟中断剥夺CPU使用权?请分线程实现类型讨论。
用户级线程不会被时钟中断剥夺CPU使用权。用户级线程在用户空间通过库函数实现,无需内核支持也不参与内核的调度,由用户程序自行调用、调度和维护。用户级线程不受内核时钟中断的影响,但如果其所在的进程时间片用完,自然整个进程的所有线程都会让出CPU。
内核级线程由内核调度和维护,是可以被时钟中断单独剥夺CPU使用权的。
对于混合线程实现方式,用户级线程和内核级线程之间有映射关系,一个线程是否会被时钟剥夺CPU使用权取决于其由哪一方控制。不论是Many-to-One, One-to-One, 还是Many-to-Many,其映射中内核级线程是可以被时钟中断剥夺CPU使用权的,而用户级线程的情况取决于其所映射的内核级线程,一旦内核级线程被剥夺CPU使用权,其所映射的用户级线程都将让出CPU。如果一个内核级线程映射多个用户级线程,其用户级线程不可单独被时钟中断剥夺CPU使用权;如果一个内核级线程只映射了一个用户级线程,那么中断掉内核级线程也就相当于中断掉了对应的用户级线程。
2 一个软实时系统中有4个周期性进程,其周期分别为:50、100、200、250,每次CPU运行时长分别为:35、20、10、x,求使得这些进程可调度的最大x取值。
若使用静态调度算法,RMS已被证明是静态最优调度算法,其推导了,当任务集满足 ∑i=1nCi/Ti≤n(2n−1)\sum_{i=1}^n C_i/T_i \leq n(\sqrt[n]2-1)∑i=1nCi/Ti≤n(n2−1) 时一定可调度,在题目所述情况下有4个进程,不等式右侧为 4×(24−1)=0.756828464 \times (\sqrt[4]2-1)=0.756828464×(42−1)=0.75682846 ,将4个进程的运行时间和周期代入不等式左侧,得到 35/50+20/100+10/200+x/250≤0.7568284635/50+20/100+10/200+x/250 \leq 0.7568284635/50+20/100+10/200+x/250≤0.75682846 ,发现 xxx 必须是负数,说明上述条件得任务集是静态不可调度的。
若使用动态的调度算法,只需要任务集满足 ∑i=1nCi/Ti≤1\sum_{i=1}^n C_i/T_i \leq1∑i=1nCi/Ti≤1 即可调度。 35/50+20/100+10/200+x/250≤135/50+20/100+10/200+x/250 \leq 135/50+20/100+10/200+x/250≤1 ,得到 x≤12.5x \leq 12.5x≤12.5 。
3 有五个进程P1、P2、P3、P4、P5,它们同时依次进入就绪队列,它们的优先数和需要的处理器时间如下表。
进程 | 处理器时间 | 优先级(数小优先级高) |
---|---|---|
P1 | 10 | 3 |
P2 | 1 | 1 |
P3 | 2 | 3 |
P4 | 1 | 4 |
P5 | 5 | 2 |
忽略进行调度等所花费的时间,回答下列问题:
四种调度算法下五个进程的执行顺序如下图所示:
先来先服务:
进程 | 周转时间 | 等待时间 | 执行时间 |
---|---|---|---|
P1 | 10 | 0 | 10 |
P2 | 11 | 10 | 1 |
P3 | 13 | 11 | 2 |
P4 | 14 | 13 | 1 |
P5 | 19 | 14 | 5 |
先来先服务的平均周转时间:(10+11+13+14+19)÷5=13.4(10+11+13+14+19)\div5=13.4(10+11+13+14+19)÷5=13.4
短作业优先:
进程 | 周转时间 | 等待时间 | 执行时间 |
---|---|---|---|
P1 | 19 | 9 | 10 |
P2 | 1 | 0 | 1 |
P3 | 4 | 2 | 2 |
P4 | 2 | 1 | 1 |
P5 | 9 | 14 | 5 |
短作业优先的平均周转时间:(19+1+4+2+9)÷5=7(19+1+4+2+9)\div5=7(19+1+4+2+9)÷5=7
非抢占式优先数:
进程 | 周转时间 | 等待时间 | 执行时间 |
---|---|---|---|
P1 | 16 | 6 | 10 |
P2 | 1 | 0 | 1 |
P3 | 18 | 16 | 2 |
P4 | 19 | 18 | 1 |
P5 | 6 | 1 | 5 |
非抢占式优先数的平均周转时间:(16+1+18+19+6)÷5=12(16+1+18+19+6)\div5=12(16+1+18+19+6)÷5=12
时间片轮转(时间片为2):
进程 | 周转时间 | 等待时间 | 执行时间 |
---|---|---|---|
P1 | 19 | 9 | 10 |
P2 | 3 | 2 | 1 |
P3 | 5 | 3 | 2 |
P4 | 6 | 5 | 1 |
P5 | 15 | 10 | 5 |
时间片轮转(时间片为2)的平均周转时间:(19+3+5+6+15)÷5=9.6(19+3+5+6+15)\div5=9.6(19+3+5+6+15)÷5=9.6