完成了你们看吧!
2 d9 O, k2 t3 [! ]
. J/ ~. W8 s' ]$ F' F#include " q: l: Y# Y B
#include * g0 ^( H6 t. l% H+ I
#include
4 }, F$ K/ k0 A0 r#define GET_INDOS 0x34
! }% }* I0 {: e/ ^9 e#define GET_CRIT_ERR 0x5d06+ y0 t( o6 l5 S2 C( C3 `
#define FINISHED 0
, J |- y) a+ Z9 ?#define RUNNING 1
* Y: w4 r1 L; h& L4 J( B& g5 q8 |* S#define READY 2
4 Q+ S7 d2 U- k# h( X0 d#define BLOCKED 3
" P! v6 X+ [6 C4 w( T; Y( z#define Ntcb 8
, t! V. E' m$ F2 d8 [#define TL 16 B7 ?# e: P5 v
struct tcb{/ S# `) I; T P ^0 b M
unsigned int * stack;/*堆栈的起始地址*/) @5 \) ~( d' ?% \0 U
unsigned ss; /*堆栈段址*/
3 F f( x! w1 |; d; d- \ unsigned sp; /*堆栈指针址*/: L( l! b% ^0 W* o, _5 m
char state; /*进程状态*/
) C' ?6 V( P2 @+ U char name[10];/*线程的外部标识符*/
# n! U7 u* z- z }tcb[Ntcb]; /* 系统允许最多的任务数 *// S; a1 y4 \8 Y: Q& l
int timecount=0;
/ J- ]- j, O6 \; `+ P# hchar far *indos_ptr=0;
* f; U7 W9 u3 G$ l3 Z7 L& A8 Tchar far *crit_err_ptr=0;. v2 B8 J& T; b* ?4 r
int num=0,current=0,i;- O# k1 `0 ]& K6 d/ J* s( c9 K4 y
void over();/ O) w* l8 N4 C. y1 n* G5 ?
typedef int (far*codeptr)(void);
8 j0 U4 Q( @: {& N$ _* u; Bint create(char *name ,codeptr code ,int stacklen)% x7 E _! k7 m: w/ `
{$ V5 E, P( Y L$ x
unsigned int * s;. [" l' m9 @, R& Z2 s a
num++;
6 L! o% n; m1 J/ g7 f- rtcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));* ?8 E6 C8 S+ [
tcb[num].state = READY;& e3 P: F% y g9 t+ G9 K: Z
strcpy( tcb[num].name ,name);
9 u: m1 a. b' t tcb[num].ss = FP_SEG(tcb[num].stack);- ~4 U. i$ ^5 M5 T) L: O |
tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);0 r/ }# x, u2 h
*(tcb[num].stack+stacklen-1) = FP_SEG(over);0 ?6 ?* A! _7 x4 _2 z
*(tcb[num].stack+stacklen-2) = FP_OFF(over);
$ C j h) k& R6 I' Z( ~ *(tcb[num].stack+stacklen-3) = 0x200;
: m" f- ^+ n l2 y5 y *(tcb[num].stack+stacklen-4) = FP_SEG(code);4 T- P5 c' i& h+ F) h
*(tcb[num].stack+stacklen-5) = FP_OFF(code);/ a$ s' a' K# S9 _! Y
*(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);6 c5 o+ I& G1 J3 b/ Y. w. J9 u
*(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);
/ y) ]9 H% f# o3 Z* i return num;
0 Z. L7 C# g" W4 Z. c4 n0 n; P2 m} ;4 r2 j6 ]$ E! B, G3 n9 }
void interrupt (* old_int8)(void); 6 A6 R5 G; R; ]2 f5 @: q2 [$ s
void interrupt new_int8(void)
0 I, G4 M) O4 b% x3 |" r A5 z{2 L, I+ P: Y9 J/ f5 B0 s
(*old_int8)();
& {. c) N- C: C% Q" h4 ?2 l timecount++;, M: ~! ]$ I/ [5 ?1 `1 Q' z
if(timecount>=TL);
0 [6 k- \+ u6 w. [, S8 D! l: b( D if(!DosBusy())
* {( R. K) \3 B1 s: m' \: v {% m* t: Z8 ~. A; h Q5 L
disable();8 w$ A8 x, S4 h- ]0 H
tcb[current].ss=_SS;" Z; |% |' [- C" R# H
tcb[current].sp=_SP;* y% U- h6 S9 W& ?8 b& S' [
if(tcb[current].state==RUNNING)0 A1 |' \2 N1 T+ y G
tcb[current].state=READY;- [7 o* s) e7 ]) g8 \' x p
current=3-current;
. D$ ^& E4 a7 M/ n l3 @& |if(tcb[current].state==READY)
3 \, `/ n, M [/ I0 u{ _SS=tcb[current].ss;
d, C+ J2 j) c2 u( U _SP=tcb[current].sp;& b5 {6 d$ r7 a3 v K
tcb[current].state=RUNNING;
7 E t, v3 n$ r& c. y, n timecount=0;' K; c j6 {) V6 R9 {3 e
enable();
8 R2 S1 F* ]9 R: f}
+ m2 `( \7 e/ u: n$ m5 b2 x}0 j1 U8 @+ ~2 `
};* A0 [% z% _, e# p7 n. h3 h- Z% T
void tcb_state()
1 g4 Q5 h/ p! N! f1 r# _/ I' t- |{) _1 i" y! {9 s5 c6 k3 N' C4 B7 u
int i;) T9 n& U0 b4 f W- Z
for(i=1;i<=num;i++), f) h" g. D7 M5 t
printf("Thread %s is %d ",tcb.name,tcb.state);1 M! b0 l4 d% D6 ~+ u8 W; B) O
};- p6 H8 a7 h1 V
int all_finished()/ t" i7 @! P! V/ t2 q/ R% r
{
. q* x: C* t, W* }1 R/ m int i; k1 A! P& {* W! x
for(i=1;i<=num;i++); O8 E8 [4 O5 G6 V
if (tcb.state!=FINISHED)2 D: t) ^3 \/ u: [0 c
return 0;8 U& p o& n1 D& q
return 1;4 L' Y0 ]$ d9 u' o9 }+ ?0 l4 {
; Z& `6 l' L3 A2 D! _
};
* J& |( T6 u/ v G/ p5 z0 evoid interrupt swtch(void)
3 r/ O( m2 \# o) w( M. T{
a) q& ~5 G- F( `" E* k5 J4 dint i;- Y; t6 t: X7 l+ S1 ]- N& F
disable();
9 b8 i9 N% z5 C# V+ q+ X# i tcb[current].ss=_SS;
Q4 D7 X- [5 `( c" d) l& ?2 h tcb[current].sp=_SP;0 {9 |1 n! N6 L" ]5 ^, ~' y
if(tcb[current].state==RUNNING)
6 c0 u) @- l7 ^2 S+ D tcb[current].state=READY;
" o& A% r; R+ e4 k3 y" k6 X for( i= current+1 ; i <= num;i++)' y7 G t2 C8 a( t
{ if(tcb.state == READY )
5 o- p2 h% i, Y6 S3 }% O" q goto excute;$ q, }5 Y% L: N+ I8 `0 j
}
. K- H, b* r+ ^ z& t for( i = 1 ; i <= current ; i++)
: X2 Q5 `1 F1 P+ Q$ P! P5 c { if(tcb.state == READY); V- v4 |4 d0 b2 U* y% F. f/ g
goto excute;
/ V) U3 M8 {0 R5 k' h5 _! d }: @# o6 f+ d7 h/ |$ D2 c
i = 0 ;
7 U! o) d" N; E5 N, T( u excute:
: b$ x$ q1 T, v$ y _SS = tcb.ss;- F4 k) t1 O; J# [# n3 v D! R
_SP = tcb.sp;# M+ ~! v9 A q$ D- ]3 `" H
tcb.state = RUNNING;9 f" y0 H. }; l! Q( R6 P- v* r
current = i;6 [) `$ {8 J o' _( b3 n
enable();; |( R4 W- j! u. [4 Q6 [
}8 T3 E7 p) c7 Z
/*-------------------------------------------------------------------------*/
1 k! K5 H6 d" [8 _5 V, n! Avoid over()+ ^1 [' f3 b6 q1 r
{ E& M1 Y9 R# m4 U% D6 z1 |
int i=current;
$ c F* E, ]2 N! D9 V /*strcpy(tcb[current].name,'\0');*/
6 w. u/ M/ V5 K, }- q3 ~ tcb[current].state=FINISHED;
" ^% j& p: n( E1 Y4 S( [ swtch();
0 v+ `8 d( k9 |, l5 G3 R6 Q free(tcb.stack);' N5 n, ]" q7 X; B, `
};
% D9 z2 J5 {4 B0 I. ] R& U/*---------------------------------------------------*/
! N' b. y/ ]- P% \: Hvoid InitInDos(void)
0 E% n5 `) l5 t/ ?$ E K{
4 g: ]( n/ L2 } union REGS regs;
: f! l- ]! Y2 m9 ? struct SREGS segregs;1 f- ]5 [* O, L2 v* Q; L7 R j M
/* get the address to INDOS flag*/" G+ O7 l$ \ M; @4 A
regs.h.ah=GET_INDOS;
( w) ?' j, d! I! I B2 ^ intdosx(®s,®s,&segregs);) A8 F$ y% Q" f+ z8 r/ Q- Y
indos_ptr=MK_FP(segregs.es,regs.x.bx);
5 R4 d6 f" T( o# \- g /*get the address to CRIT_ERR flag*/
7 _# J: i# ]) o s I1 n5 F4 A if(_osmajor<3)2 ]+ ~ n6 ^3 b8 R
crit_err_ptr=indos_ptr+1;2 |$ b% B- y! m5 n& v( `/ E
else if (_osmajor==3&&_osminor==0)* \. a3 u' @# S3 B2 I. F
crit_err_ptr=indos_ptr-1;
* a- @6 L9 F8 _0 [3 p* P else5 y* y k/ q- H) M, @
{4 h9 h4 q ?# P- G1 B2 O, b8 @
regs.x.ax=GET_CRIT_ERR;; {8 Y& q' m I7 Q
intdosx(®s,®s,&segregs);
* y6 k" I$ @. i- e) z8 a( R2 n crit_err_ptr=MK_FP(segregs.ds,regs.x.si);
; \. p, ~/ W# [( h$ X1 M7 w }
# N" i8 T* }0 Q* P};0 ]. r9 j6 v' [
int DosBusy(void)
8 p4 O0 i5 U4 f, l{3 o4 s6 [2 ~4 a6 p
if(indos_ptr&&crit_err_ptr)7 p9 b( E4 A. z6 K* y3 d: G: `
return(*indos_ptr&&*crit_err_ptr);
4 k7 F3 W9 A7 S }+ ? else2 l# h- H3 L }. }3 G0 b1 @
return( -1);/ e" l4 B+ S! `! g) e3 y
};& d. M) p; X# j' c2 }' H
void f1(void)0 Q5 _1 m: h8 I0 b5 n0 u
{
/ s' f; H; @" `% I/ |4 Q& P int i,j,k;! ~' V: P5 d) T' a+ ]$ u3 K2 o
for(i=0;i<40;i++)
: N+ H! J; {9 t$ N1 f8 J$ l {- z& x: _1 z: |: z
putchar('a');
5 D7 x7 f: i& E' t$ |
) I9 ^% @; m3 ]# v$ @ for(j=0;j<1000;j++); U4 y9 ^" z/ e" q% m: ^
for(k=0;k<100;k++)
+ x! f8 {4 X; T0 M3 I1 p% y ;
! @# J& b/ f0 E" Q4 N }; X& }6 M5 N" O5 l- I
};8 S( }! O' [9 y) B- v
void f2(void)
. H9 W5 u1 C' W( B{
- a0 E+ [9 W1 a5 O+ M: [: N I int i,j,k;+ c$ L: l. E1 O
for(i=0;i<30;i++); O z" f; b- m- K6 Q& E& N* ^$ Z
{
. O0 y( D! [+ O' w# Z0 v putchar('b');
, [# l! U* }4 N* v4 [( _! u for(j=0;j<1000;j++)( m6 R% `$ F8 ?# F* y2 V
for(k=0;k<50;k++)
. f( x! D* j6 W5 I ;
6 z6 Y& M! w" L7 E4 X, a }: D4 j- C1 L9 [3 V+ e( n: J N, A
};
# m1 }) U$ F7 ]* Z1 }3 Q, [( |/*------------------------------------------*/) J G% m7 N' K& G% j2 A
main()4 x; f* Z$ Q& U! _, B( A1 D& a
{
s5 l; u; y8 P- D" _# q v InitInDos();
# B9 O( F9 s# O6 t0 V; E% A old_int8=getvect(8);4 j: i1 }0 ?; B K
strcpy(tcb[0].name,"main");
- \& h: X% b; S, K7 z# L! h) h tcb[0].state=RUNNING;
* ^' f l6 @' n+ L* L- W current=0;7 W$ @# _' L! c! n
create("f1",(codeptr) f1,1024);* g5 |) M& A$ H5 m6 U" U
create("f2",(codeptr) f2,1024);
% M, x1 p) q4 N( F tcb_state(); g! A6 A- q+ v$ ?6 z
setvect(8,new_int8);6 W' w9 h5 g# W+ e* Z3 i! I* ^7 D
swtch();. p {4 o9 n" i9 N6 {, Z6 J
while(!all_finished());; ^: ?+ G( P8 I2 v% j
strcpy(tcb[0].name,'\0');7 {" t. y/ A% k$ Z2 c9 p) D9 @
tcb[0].state=FINISHED;8 M8 H" y6 d" K) \ o; s
setvect(8,old_int8);
* a4 [2 U% {& c: v8 n F. B" | tcb_state();
) r( e( v, O$ v5 n$ t8 d% ?0 v printf("\n Multi_task system terminanted.\n");
4 f% ~" g# S0 A# c& z}; |