初學時期寫的**,比較亂,希望對閱讀本文的讀者有所幫助。
**是撇開了效率問題,為了方便理解任務切換過程,故都盡可能的使用了c實現的,而非彙編。
main.c
#include#include#define uint unsigned int
#define uchar unsigned char
#define tasknumsize 3
#define ramsize 255
uchar idata wait[tasknumsize+2];
uchar taskrdy=0xff,curtask,nxttask;
uchar intnestnum,curtaskisidle,intretbit=0;
void intctxsw(uchar f);
void waitdly(uint dly);
extern void retiins();
extern void popins();
void delay(uint z)
void taska() }}
void taskb()
*/
p2=0;
if(i++>0x0f) i=0;
p2=p2|i;
waitdly(30);
if(temp++>0x0f) temp=0;
p2=p2|(temp<<4);
waitdly(30); }}
void taskc() }}
void inittimer0()
void * const func[tasknumsize]=;
uchar idata *stk[tasknumsize+1];
void initstarttask()
}main()
void idletask() }
void intctxsw(uchar f)
if(nxttaskcurtask)
sp=(uchar)sp1-1;
temp=stk[curtask+1]-(uchar idata *)svsp-1;
for(i=curtask+1;i>curtask))
return;
else
retiins();
} else
else
return;
} }curtaskisidle=1;
*((uchar idata *)++sp)=(uint)idletask%256;
*((uchar idata *)++sp)=(uint)idletask/256;
ea=1;
if(f) retiins();
}void waitdly(uint dly)
}void tick() }}
void intexitsw()
void enterint()
void timer0() interrupt 1
int.s
name ex_asm
?pr?retiins?ex segment code
?pr?popins?ex segment code
public retiins
public popins
rseg ?pr?retiins?ex
retiins:
mov a,#(-2)
add a,sp
mov sp,a
reti
rseg ?pr?popins?ex
popins:
mov a,#(-2)
add a,sp
mov sp,a
pop 7
pop 6
pop 5
pop 4
pop 3
pop 2
pop 1
pop 0
pop psw
pop dpl
pop dph
pop b
pop acc
retend
51nod 1103 N的倍數 (抽屜原理)
乙個長度為n的陣列a,從a中選出若干個數,使得這些數的和是n的倍數。例如 n 8,陣列a包括 2 5 6 3 18 7 11 19,可以選2 6,因為2 6 8,是8的倍數。input 第1行 1個數n,n為陣列的長度,同時也是要求的倍數。2 n 50000 第2 n 1行 陣列a的元素。0 a i...
51nod 1103 N的倍數 抽屜原理
原題鏈結 1103 n的倍數 ural 1302 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個長度為n的陣列a,從a中選出若干個數,使得這些數的和是n的倍數。例如 n 8,陣列a包括 2 5 6 3 18 7 11 19,可以選2 6,因為2 6 8,是8...
51nod1103 抽屜原理 N的倍數
我感覺這種題就是思維。給定n個數,要求取多少個,他們的和為n的倍數。維護字首和。取模有可加性 如果mod等於0,那就從頭到尾輸出。否則的話,n個數的mod 範圍在1 n 1之間,肯定有兩個數的mod一樣,那他們的差值就是結果。n個數,可以再多,但是如果和為x的倍數,這個大於n,那麼就不行了。incl...