找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7648|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)匯編版的多任務(wù)實(shí)時(shí)操作系統(tǒng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70941 發(fā)表于 2015-3-21 05:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51多任務(wù)實(shí)時(shí)操作系統(tǒng)—匯編:
   哈哈!今天發(fā)現(xiàn)用單片機(jī)處理多任務(wù)事件(多任務(wù)同時(shí)進(jìn)行)的方法了!用單片機(jī)定時(shí)器中斷進(jìn)行任務(wù)的調(diào)度,定時(shí)的時(shí)間就是每項(xiàng)任務(wù)的一次可執(zhí)行時(shí)間,每中斷一次就切換一個(gè)任務(wù),調(diào)度方法是定時(shí)器中斷時(shí)保存上一任務(wù)的斷點(diǎn)(出棧保存),跳到下一個(gè)任務(wù)(地址入棧,中斷返回)。每個(gè)任務(wù)都必須是一個(gè)死循環(huán),因?yàn)樗仟?dú)立的!當(dāng)然單片機(jī)不可能真正做到多任務(wù)同時(shí)進(jìn)行,這個(gè)方法只是把各個(gè)任務(wù)拼接起來每個(gè)任務(wù)分配一定的時(shí)間!因?yàn)閱纹瑱C(jī)的速度快,所以在一定意義上說這些任務(wù)是同時(shí)進(jìn)行的!單片機(jī)的速度越快越好!這個(gè)方法的缺陷是軟件延時(shí)很難計(jì)算,誤差大.

    一個(gè)CPU是不可能同時(shí)處理多條指令的,只能是一條一條的順序執(zhí)行。如果我們需要同時(shí)執(zhí)行多個(gè)任務(wù),但又不能等一個(gè)任務(wù)執(zhí)行完了再執(zhí)行下一個(gè)任務(wù),有的任務(wù)還需要等待一個(gè)信號觸發(fā)才能往下執(zhí)行,信號遲遲未來那就什么也做不了了��!操作系統(tǒng)的出現(xiàn),就是為了解決這一問題的。它的功能就是能讓CPU“同時(shí)”處理多個(gè)任務(wù),當(dāng)然不是真正的同時(shí),它只是把這些任務(wù)的分成不同的時(shí)間段來處理,每個(gè)任務(wù)只執(zhí)行很短的的時(shí)間(只執(zhí)行一部分指令),然后保存斷點(diǎn)就切換到下一個(gè)任務(wù)的指令去執(zhí)行,同樣只執(zhí)行很短的的時(shí)間(只執(zhí)行一部分指令),再保存斷點(diǎn)切換任務(wù)。等所有的任務(wù)都執(zhí)行一次后再回來從斷點(diǎn)處繼續(xù)執(zhí)行,時(shí)間到,再保存斷點(diǎn)切換任務(wù),如此反復(fù)。因?yàn)镃PU的頻率高,所以完成一次循環(huán)的時(shí)間極短,51單片機(jī)的頻率一般40MHz以內(nèi),所需時(shí)間是ms、us級的,電腦的主頻是GHz級別的,那更不用說,這樣短的時(shí)間對于我們來說就是同時(shí)的。

    學(xué)過C51的大都知道RTX51,它是單片機(jī)實(shí)時(shí)多任務(wù)系統(tǒng),是kill51自帶的,但是還有很多匯編愛好者不能使用它,因?yàn)樗荂語言的。為此本人設(shè)計(jì)了兩個(gè)個(gè)簡單的匯編語言版的多任務(wù)實(shí)時(shí)系統(tǒng),專為匯編愛好者提供一個(gè)參考。高手勿噴!
    本程序使用定時(shí)器中斷的方法產(chǎn)生時(shí)間輪片,每個(gè)任務(wù)分配在一個(gè)時(shí)間輪片上。如果一個(gè)時(shí)間輪片(定時(shí)器的時(shí)間)是250us,那每個(gè)任務(wù)執(zhí)行一次的時(shí)間就是250us(因?yàn)?/font>任務(wù)切換的時(shí)間極短,所以里省略了);有4個(gè)任務(wù)要執(zhí)行,那么系統(tǒng)完成一次循環(huán)的時(shí)間是250*4=1000us=1ms。即先執(zhí)行任務(wù)一250us,然后保存任務(wù)一的斷點(diǎn),切換到任務(wù)二執(zhí)行250us,再保存任務(wù)二的斷點(diǎn),切換到任務(wù)三執(zhí)行250us,接著保存任務(wù)三的斷點(diǎn),切換到任務(wù)四執(zhí)行250us,保存任務(wù)四的斷點(diǎn),再次切到任務(wù)一斷點(diǎn)處繼續(xù)往下執(zhí)行250us,再保存再切換到下一個(gè)任務(wù)的斷點(diǎn)處執(zhí)行,照此循環(huán)。所以這些任務(wù)并不是同1us內(nèi)完成的,而是同1ms內(nèi)完成的,當(dāng)然更是同時(shí)同分同秒完成的。
程序只是個(gè)演示程序,功能的開發(fā)看個(gè)人要求而定!
輕量四任務(wù)實(shí)時(shí)系統(tǒng)

ORG 0000H
RW1_SP  DATA  20H;任務(wù)堆棧指針位置寄存器
RW2_SP  DATA  21H
RW3_SP  DATA  22H
RW4_SP  DATA  23H

ORG 0000H
AJMP MAIN
ORG 000BH
LJMP RWQHCX
ORG0076H   
;================任務(wù)切換程序===========================================

RWQHCX:
JNB   RS0,LOOP3
JNB   RS1,LOOP4
;==============任務(wù)4現(xiàn)場保護(hù)
PUSH  ACC        ;需注意與任務(wù)4現(xiàn)場還原對應(yīng)
PUSH  B
PUSH  PSW
MOV   RW4_SP,SP  ;保存任務(wù)4的堆棧指針位置
;==============任務(wù)1現(xiàn)場還原
MOV   SP,RW1_SP  ;取任務(wù)1的堆棧指針位置,任務(wù)1使用寄存器0組
POP  PSW          ;需注意與任務(wù)1現(xiàn)場保護(hù)對應(yīng)
POP  B
POP  ACC
RETI
LOOP2:
;==============任務(wù)1現(xiàn)場保護(hù)
PUSH  ACC        ;需注意與任務(wù)1現(xiàn)場還原對應(yīng)
PUSH  B
PUSH  PSW
MOV   RW1_SP,SP  ;保存任務(wù)1的堆棧指針位置
;==============任務(wù)2現(xiàn)場還原
MOV   SP,RW2_SP  ;取任務(wù)2的堆棧指針位置,任務(wù)2使用寄存器1組
POP  PSW          ;需注意與任務(wù)2現(xiàn)場保護(hù)對應(yīng)
POP  B
POP  ACC
RETI
LOOP3:
JNB   RS1,LOOP2
;==============任務(wù)2現(xiàn)場保護(hù)
PUSH  ACC        ;需注意與任務(wù)2現(xiàn)場還原對應(yīng)
PUSH  B
PUSH  PSW
MOV   RW2_SP,SP  ;保存任務(wù)2的堆棧指針位置
;==============任務(wù)3現(xiàn)場還原
MOV   SP,RW3_SP  ;取任務(wù)3的堆棧指針位置,任務(wù)3使用寄存器2組
POP  PSW           ;需注意與任務(wù)3現(xiàn)場保護(hù)對應(yīng)
POP  B
POP  ACC
RETI
LOOP4:
;==============任務(wù)3現(xiàn)場保護(hù)
PUSH  ACC        ;需注意與任務(wù)3現(xiàn)場還原對應(yīng)
PUSH  B
PUSH  PSW
MOV   RW3_SP,SP  ;保存任務(wù)4的堆棧指針位置
;==============任務(wù)4現(xiàn)場還原
MOV  SP,RW4_SP  ;取任務(wù)4的堆棧指針位置,任務(wù)4使用寄存器3組
POP  PSW         ;需注意與任務(wù)4現(xiàn)場保護(hù)對應(yīng)
POP  B
POP  ACC
RETI


;========任務(wù)一程序===============================
RW1_KS:             ;任務(wù)一入口(初始化)
CLR   RS0
CLR   RS1
;你的初始化程序
;========任務(wù)一程序===============================
RW1_MAIN:           ;任務(wù)一主程序
;你的程序
LJMP  RW1_MAIN
============任務(wù)一END===================================

;========任務(wù)二程序===============================
RW2_KS:             ;任務(wù)二入口(初始化)
CLR   RS0
SETB  RS1
;你的初始化程序
RW2_MAIN:           ;任務(wù)二主程序
;你的程序
LJMP  RW2_MAIN
============任務(wù)二END===================================


;========任務(wù)三程序===============================
RW3_KS:             ;任務(wù)三入口(初始化)
SETB  RS0
CLR   RS1
;你的初始化程序
RW3_MAIN:           ;任務(wù)三主程序
;你的程序
LJMP  RW3_MAIN
============任務(wù)三END===================================

;========任務(wù)四程序===============================
RW4_KS:             ;任務(wù)四入口(初始化)
SETB  RS0
SETB  RS1
;你的初始化程序
RW4_MAIN:           ;任務(wù)四主程序
;你的程序
LJMP  RW4_MAIN
============任務(wù)四END===================================


===============初始化程序==================================

MAIN:
MOV   SP,#09FH;取任務(wù)2堆棧指針開始位置
MOV   DPTR,#RW2_KS
PUSH  DPL
PUSH  DPH
MOV   RW2_SP,#0A4H;任務(wù)2堆棧指針寄存器初值=09FH+2+任務(wù)2現(xiàn)場保護(hù)入棧數(shù)
MOV   SP,#0BFH;取任務(wù)3堆棧指針開始位置
MOV   DPTR,#RW3_KS
PUSH  DPL
PUSH  DPH
MOV   RW3_SP,#0C4H;任務(wù)3堆棧指針寄存器初值=0BFH+2+任務(wù)3現(xiàn)場保護(hù)入棧數(shù)
MOV   SP,#0DFH;取任務(wù)4堆棧指針開始位置
MOV   DPTR,#RW4_KS
PUSH  DPL
PUSH  DPH
MOV   RW4_SP,#0E4H;任務(wù)4堆棧指針寄存器初值=0DFH+2+任務(wù)4現(xiàn)場保護(hù)入棧數(shù)

MOV   SP,#7FH;取任務(wù)1堆棧指針開始位置
SETB  EA    ;開啟維持個(gè)任務(wù)調(diào)度的定時(shí)器
SETB  ET0
MOV   TMOD,#02H
SETB  TR0

LJMP   RW1_KS

END

要求不嚴(yán)謹(jǐn)?shù)?0任務(wù)系統(tǒng)

此程序結(jié)構(gòu)很空洞,使用請自己注意



ORG 0000H
RWJSQ    data 7FH
RWJSQ1   data 7EH

ORG 0000H
AJMP MAIN
ORG 000BH
LJMP RWDD
ORG 0076H     
RWDD:         ;任務(wù)調(diào)度程序
MOV  R0,RWJSQ ;取任務(wù)地址寄存器地址
POP  ACC   
MOV  @R0,A   ;保存當(dāng)前任務(wù)斷點(diǎn)
INC  R0
POP  ACC
MOV  @R0,A
INC  R0
MOV  A,R0
CJNEA,RWJSQ1,LOOP2;所有需要進(jìn)行的任務(wù)是否進(jìn)行完
MOV  R0,#216     ;任務(wù)地址寄存器起始地址
LOOP2:
INC  R0
MOV  A,@R0   ;取另一個(gè)任務(wù)斷點(diǎn)
PUSH ACC
DEC  R0
MOV  A,@R0
PUSH ACC
MOV  RWJSQ,R0 ;保存任務(wù)地址寄存器地址
CJNER0,#220,XXX  ;220是任務(wù)三的地址寄存器地址
INC  R4      ;延時(shí)基數(shù)
XXX:
RETI          ;前去執(zhí)行新任務(wù)
MAIN:
MOV RWJSQ,#216 ;任務(wù)地址寄存器起始地址(最多20個(gè)任務(wù),需40個(gè)寄存器)
MOV RWJSQ1,#0;任務(wù)地址寄存器地址的最后一個(gè)地址加一(取值218-0)
MOVR0,RWJSQ   ;取各個(gè)任務(wù)的地址
MOV DPTR,#RW1
LCALL DZSZ
MOV DPTR,#RW2
LCALL DZSZ
MOV DPTR,#RW3
LCALL DZSZ
MOV DPTR,#RW4
LCALL DZSZ
MOV DPTR,#RW5
LCALL DZSZ
MOV DPTR,#RW6
LCALL DZSZ
MOV DPTR,#RW7
LCALL DZSZ
MOV DPTR,#RW8
LCALL DZSZ
MOV DPTR,#RW9
LCALL DZSZ
MOV DPTR,#RW10
LCALL DZSZ
MOV DPTR,#RW11
LCALL DZSZ
MOV DPTR,#RW12
LCALL DZSZ
MOV DPTR,#RW13
LCALL DZSZ
MOV DPTR,#RW14
LCALL DZSZ
MOV DPTR,#RW15
LCALL DZSZ
MOV DPTR,#RW16
LCALL DZSZ
MOV DPTR,#RW17
LCALL DZSZ
MOV DPTR,#RW18
LCALL DZSZ
MOV DPTR,#RW19
LCALL DZSZ
MOV DPTR,#RW20
LCALL DZSZ
SETB  EA    ;開啟維持個(gè)任務(wù)調(diào)度的定時(shí)器
SETB  ET0
MOV   TMOD,#02H ;
MOV   TH0,#6;定時(shí)器初值設(shè)置
SETB  TR0
LJMP  RW1   ;跳到第一個(gè)任務(wù)
DZSZ:
MOV @R0,DPH
INC R0
MOV @R0,DPL
INC R0
RET
RW1:             ;計(jì)數(shù)任務(wù)一
JB     P1.0,$
JNB    P1.0,$
INC    R7
LJMP   RW1     ;死循環(huán)
RW2:             ;計(jì)數(shù)任務(wù)二
JB     P1.1,$
JNB    P1.1,$
DEC    R7
LJMP   RW2     ;死循環(huán)
RW3:             ;計(jì)數(shù)任務(wù)三
MOV    R4,#0
CJNE   R4,#250,$ ;準(zhǔn)確延時(shí)演示,延時(shí)時(shí)間=250*任務(wù)數(shù)*定時(shí)器時(shí)間,
CPL    P1.5
LJMP   RW3     ;死循環(huán)
RW4:             ;計(jì)數(shù)任務(wù)四
MOV    R6,#255 ;非準(zhǔn)確延時(shí),時(shí)間較難計(jì)算
BBB:
MOV    R5,#255
DJNZ   R5,$
DJNZ   R6,BBB
CPL    P1.6
LJMP   RW4     ;死循環(huán)
RW5:             ;計(jì)數(shù)任務(wù)五
JB     P2.7,$
JNB    P2.7,$
CPL    P1.7
LJMP   RW5     ;死循環(huán)
RW6:            ;計(jì)數(shù)任務(wù)六
JB     P1.2,$
JNB    P1.2,$
CPL    P2.2
LJMP   RW6     ;死循環(huán)

RW7:             ;計(jì)數(shù)任務(wù)七
LJMP   RW7     ;死循環(huán)

RW8:             ;計(jì)數(shù)任務(wù)八
LJMP   RW8     ;死循環(huán)

RW9:             ;計(jì)數(shù)任務(wù)九
LJMP   RW9     ;死循環(huán)

RW10:             ;計(jì)數(shù)任務(wù)十
LJMP   RW10     ;死循環(huán)

RW11:             ;計(jì)數(shù)任務(wù)十一

LJMP   RW11     ;死循環(huán)

RW12:             ;計(jì)數(shù)任務(wù)十二
LJMP   RW12     ;死循環(huán)

RW13:             ;計(jì)數(shù)任務(wù)十三
CPL P0.0
LJMP   RW13     ;死循環(huán)

RW14:             ;計(jì)數(shù)任務(wù)十四
CPL P0.1
LJMP   RW14     ;死循環(huán)

RW15:             ;計(jì)數(shù)任務(wù)十五
CPL P0.2
LJMP   RW15     ;死循環(huán)

RW16:             ;計(jì)數(shù)任務(wù)十六
CPL P0.3
LJMP   RW16     ;死循環(huán)

RW17:             ;計(jì)數(shù)任務(wù)十七
CPL P0.4
LJMP   RW17     ;死循環(huán)

RW18:             ;計(jì)數(shù)任務(wù)十八
CPL P0.5
LJMP   RW18     ;死循環(huán)

RW19:             ;計(jì)數(shù)任務(wù)十九
CPL P0.6
LJMP   RW19     ;死循環(huán)

RW20:             ;計(jì)數(shù)任務(wù)二十
CPL P0.7
LJMP   RW20     ;死循環(huán)

END




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表