51单片机多任务系统设计汇编Word格式文档下载.docx
《51单片机多任务系统设计汇编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机多任务系统设计汇编Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
23H
AJMPMAIN
ORG000BH
LJMPRWQHCX
ORG0076H
;
================任务切换程序===========================================
RWQHCX:
JNB
RS0,LOOP3
RS1,LOOP4
==============任务4现场保护
PUSH
ACC
需注意与任务4现场还原对应
B
PSW
MOV
RW4_SP,SP
保存任务4的堆栈指针位置
==============任务2现场还原
SP,RW1_SP
取任务1的堆栈指针位置,任务1使用寄存器0组
POP
PSW
需注意与任务1现场保护对应
ACC
RETI
LOOP2:
==============任务1现场保护
需注意与任务1现场还原对应
RW1_SP,SP
保存任务1的堆栈指针位置
==============任务3现场还原
SP,RW2_SP
取任务2的堆栈指针位置,任务2使用寄存器1组
需注意与任务2现场保护对应
LOOP3:
RS1,LOOP2
==============任务2现场保护
需注意与任务2现场还原对应
RW2_SP,SP
保存任务2的堆栈指针位置
==============任务4现场还原
SP,RW3_SP
取任务3的堆栈指针位置,任务3使用寄存器2组
需注意与任务3现场保护对应
LOOP4:
==============任务3现场保护
需注意与任务3现场还原对应
RW3_SP,SP
==============任务1现场还原
SP,RW4_SP
取任务4的堆栈指针位置,任务4使用寄存器3组
需注意与任务4现场保护对应
========任务一程序===============================
RW1_KS:
;
任务一入口(初始化)
CLR
RS0
CLR
RS1
你的初始化程序
RW1_MAIN:
任务一主程序
你的程序
LJMP
RW1_MAIN
============任务一END===================================
========任务二程序===============================
RW2_KS:
任务二入口(初始化)
SETB
RW2_MAIN:
任务二主程序
RW2_MAIN
============任务二END===================================
========任务三程序===============================
RW3_KS:
任务三入口(初始化)
RW3_MAIN:
任务三主程序
RW3_MAIN
============任务三END===================================
========任务四程序===============================
RW4_KS:
任务四入口(初始化)
RW4_MAIN:
任务四主程序
RW4_MAIN
============任务四END===================================
===============初始化程序==================================
MAIN:
SP,#09FH;
取任务2堆栈指针开始位置
DPTR,#RW2_KS
DPL
DPH
RW2_SP,#0A4H;
任务2堆栈指针寄存器初值=09FH+2+任务2现场保护入栈数
SP,#0BFH;
取任务3堆栈指针开始位置
DPTR,#RW3_KS
RW3_SP,#0C4H;
任务3堆栈指针寄存器初值=0BFH+2+任务3现场保护入栈数
SP,#0DFH;
取任务4堆栈指针开始位置
DPTR,#RW4_KS
RW4_SP,#0E4H;
任务4堆栈指针寄存器初值=0DFH+2+任务4现场保护入栈数
SP,#7FH;
取任务1堆栈指针开始位置
EA
开启维持个任务调度的定时器
ET0
TMOD,#02H
TR0
LJMP
RW1_KS
END
要求不严谨的20任务系统
此程序结构很空洞,使用请自己注意
RWJSQ
data
7FH
RWJSQ1
7EH
LJMPRWDD
ORG0076H
RWDD:
任务调度程序
R0,RWJSQ;
取任务地址寄存器地址
@R0,A
保存当前任务断点
INC
R0
@R0,A
A,R0
CJNEA,RWJSQ1,LOOP2;
所有需要进行的任务是否进行完
R0,#216
任务地址寄存器起始地址
A,@R0
取另一个任务断点
PUSHACC
DEC
A,@R0
RWJSQ,R0;
保存任务地址寄存器地址
CJNER0,#220,XXX
220是任务三的地址寄存器地址
R4
延时基数
XXX:
RETI
前去执行新任务
MOVRWJSQ,#216;
任务地址寄存器起始地址(最多20个任务,需40个寄存器)
MOVRWJSQ1,#0;
任务地址寄存器地址的最后一个地址加一(取值218-0)
MOVR0,RWJSQ
取各个任务的地址
MOVDPTR,#RW1
LCALLDZSZ
MOVDPTR,#RW2
MOVDPTR,#RW3
MOVDPTR,#RW4
MOVDPTR,#RW5
MOVDPTR,#RW6
MOVDPTR,#RW7
MOVDPTR,#RW8
MOVDPTR,#RW9
MOVDPTR,#RW10
MOVDPTR,#RW11
MOVDPTR,#RW12
MOVDPTR,#RW13
MOVDPTR,#RW14
MOVDPTR,#RW15
MOVDPTR,#RW16
MOVDPTR,#RW17
MOVDPTR,#RW18
MOVDPTR,#RW19
MOVDPTR,#RW20
TMOD,#02H;
TH0,#6;
定时器初值设置
RW1
跳到第一个任务
DZSZ:
MOV@R0,DPH
INCR0
MOV@R0,DPL
RET
RW1:
计数任务一
JB
P1.0,$
R7
死循环
RW2:
计数任务二
P1.1,$
RW2
RW3:
计数任务三
R4,#0
CJNE
R4,#250,$;
准确延时演示,延时时间=250*任务数*定时器时间,
CPL
P1.5
RW3
RW4:
计数任务四
R6,#255
非准确延时,时间较难计算
BBB:
R5,#255
DJNZ
R5,$
R6,BBB
P1.6
RW4
RW5:
计数任务五
P2.7,$
P1.7
RW5
RW6:
计数任务六
P1.2,$
P2.2
RW6
RW7:
计数任务七
RW7
RW8:
计数任务八
RW8
RW9:
计数任务九
RW9
RW10:
计数任务十
RW10
RW11:
计数任务十一
RW11
RW12:
计数任务十二
RW12
RW13:
计数任务十三
CPLP0.0
RW13
RW14:
计数任务十四
CPLP0.1
RW14
RW15:
计数任务十五
CPLP0.2
RW15
RW16:
计数任务十六
CPLP0.3
RW16
RW17:
计数任务十七
CPLP0.4
RW17
RW18:
计数任务十八
CPLP0.5
RW18
RW19:
计数任务十九
CPLP0.6
RW19
RW20:
计数任务二十
CPLP0.7
RW20