学过C51的大都知道RTX51,它是单片机实时多任务系统,是kill51自带的,但是还有很多汇编爱好者不能使用它,因为它是C语言的。为此本人设计了两个个简单的汇编语言版的多任务实时系统,专为汇编爱好者提供一个参考。高手勿喷!
本程序使用定时器中断的方法产生时间轮片,每个任务分配在一个时间轮片上。如果一个时间轮片(定时器的时间)是250us,那每个任务执行一次的时间就是250us(因为任务切换的时间极短,所以里省略了);有4个任务要执行,那么系统完成一次循环的时间是250*4=1000us=1ms。即先执行任务一250us,然后保存任务一的断点,切换到任务二执行250us,再保存任务二的断点,切换到任务三执行250us,接着保存任务三的断点,切换到任务四执行250us,保存任务四的断点,再次切到任务一断点处继续往下执行250us,再保存再切换到下一个任务的断点处执行,照此循环。所以这些任务并不是同1us内完成的,而是同1ms内完成的,当然更是同时同分同秒完成的。
程序只是个演示程序,功能的开发看个人要求而定! 轻量四任务实时系统
ORG 0000H
RW1_SP DATA 20H;任务堆栈指针位置寄存器
RW2_SP DATA 21H
RW3_SP DATA 22H
RW4_SP DATA 23H
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP RWQHCX
ORG0076H
;================任务切换程序===========================================
RWQHCX:
JNB RS0,LOOP3
JNB RS1,LOOP4
;==============任务4现场保护
PUSH ACC ;需注意与任务4现场还原对应
PUSH B
PUSH PSW
MOV RW4_SP,SP ;保存任务4的堆栈指针位置
;==============任务1现场还原
MOV SP,RW1_SP ;取任务1的堆栈指针位置,任务1使用寄存器0组
POP PSW ;需注意与任务1现场保护对应
POP B
POP ACC
RETI
LOOP2:
;==============任务1现场保护
PUSH ACC ;需注意与任务1现场还原对应
PUSH B
PUSH PSW
MOV RW1_SP,SP ;保存任务1的堆栈指针位置
;==============任务2现场还原
MOV SP,RW2_SP ;取任务2的堆栈指针位置,任务2使用寄存器1组
POP PSW ;需注意与任务2现场保护对应
POP B
POP ACC
RETI
LOOP3:
JNB RS1,LOOP2
;==============任务2现场保护
PUSH ACC ;需注意与任务2现场还原对应
PUSH B
PUSH PSW
MOV RW2_SP,SP ;保存任务2的堆栈指针位置
;==============任务3现场还原
MOV SP,RW3_SP ;取任务3的堆栈指针位置,任务3使用寄存器2组
POP PSW ;需注意与任务3现场保护对应
POP B
POP ACC
RETI
LOOP4:
;==============任务3现场保护
PUSH ACC ;需注意与任务3现场还原对应
PUSH B
PUSH PSW
MOV RW3_SP,SP ;保存任务4的堆栈指针位置
;==============任务4现场还原
MOV SP,RW4_SP ;取任务4的堆栈指针位置,任务4使用寄存器3组
POP PSW ;需注意与任务4现场保护对应
POP B
POP ACC
RETI