學過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