久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7463|回復: 0
打印 上一主題 下一主題
收起左側

51單片機匯編版的多任務實時操作系統

[復制鏈接]
跳轉到指定樓層
樓主
ID:70941 發表于 2015-3-21 05:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51多任務實時操作系統—匯編:
   哈哈!今天發現用單片機處理多任務事件(多任務同時進行)的方法了!用單片機定時器中斷進行任務的調度,定時的時間就是每項任務的一次可執行時間,每中斷一次就切換一個任務,調度方法是定時器中斷時保存上一任務的斷點(出棧保存),跳到下一個任務(地址入棧,中斷返回)。每個任務都必須是一個死循環,因為它是獨立的!當然單片機不可能真正做到多任務同時進行,這個方法只是把各個任務拼接起來每個任務分配一定的時間!因為單片機的速度快,所以在一定意義上說這些任務是同時進行的!單片機的速度越快越好!這個方法的缺陷是軟件延時很難計算,誤差大.

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

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


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

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


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

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


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

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

MOV   SP,#7FH;取任務1堆棧指針開始位置
SETB  EA    ;開啟維持個任務調度的定時器
SETB  ET0
MOV   TMOD,#02H
SETB  TR0

LJMP   RW1_KS

END

要求不嚴謹的20任務系統

此程序結構很空洞,使用請自己注意



ORG 0000H
RWJSQ    data 7FH
RWJSQ1   data 7EH

ORG 0000H
AJMP MAIN
ORG 000BH
LJMP RWDD
ORG 0076H     
RWDD:         ;任務調度程序
MOV  R0,RWJSQ ;取任務地址寄存器地址
POP  ACC   
MOV  @R0,A   ;保存當前任務斷點
INC  R0
POP  ACC
MOV  @R0,A
INC  R0
MOV  A,R0
CJNEA,RWJSQ1,LOOP2;所有需要進行的任務是否進行完
MOV  R0,#216     ;任務地址寄存器起始地址
LOOP2:
INC  R0
MOV  A,@R0   ;取另一個任務斷點
PUSH ACC
DEC  R0
MOV  A,@R0
PUSH ACC
MOV  RWJSQ,R0 ;保存任務地址寄存器地址
CJNER0,#220,XXX  ;220是任務三的地址寄存器地址
INC  R4      ;延時基數
XXX:
RETI          ;前去執行新任務
MAIN:
MOV RWJSQ,#216 ;任務地址寄存器起始地址(最多20個任務,需40個寄存器)
MOV RWJSQ1,#0;任務地址寄存器地址的最后一個地址加一(取值218-0)
MOVR0,RWJSQ   ;取各個任務的地址
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    ;開啟維持個任務調度的定時器
SETB  ET0
MOV   TMOD,#02H ;
MOV   TH0,#6;定時器初值設置
SETB  TR0
LJMP  RW1   ;跳到第一個任務
DZSZ:
MOV @R0,DPH
INC R0
MOV @R0,DPL
INC R0
RET
RW1:             ;計數任務一
JB     P1.0,$
JNB    P1.0,$
INC    R7
LJMP   RW1     ;死循環
RW2:             ;計數任務二
JB     P1.1,$
JNB    P1.1,$
DEC    R7
LJMP   RW2     ;死循環
RW3:             ;計數任務三
MOV    R4,#0
CJNE   R4,#250,$ ;準確延時演示,延時時間=250*任務數*定時器時間,
CPL    P1.5
LJMP   RW3     ;死循環
RW4:             ;計數任務四
MOV    R6,#255 ;非準確延時,時間較難計算
BBB:
MOV    R5,#255
DJNZ   R5,$
DJNZ   R6,BBB
CPL    P1.6
LJMP   RW4     ;死循環
RW5:             ;計數任務五
JB     P2.7,$
JNB    P2.7,$
CPL    P1.7
LJMP   RW5     ;死循環
RW6:            ;計數任務六
JB     P1.2,$
JNB    P1.2,$
CPL    P2.2
LJMP   RW6     ;死循環

RW7:             ;計數任務七
LJMP   RW7     ;死循環

RW8:             ;計數任務八
LJMP   RW8     ;死循環

RW9:             ;計數任務九
LJMP   RW9     ;死循環

RW10:             ;計數任務十
LJMP   RW10     ;死循環

RW11:             ;計數任務十一

LJMP   RW11     ;死循環

RW12:             ;計數任務十二
LJMP   RW12     ;死循環

RW13:             ;計數任務十三
CPL P0.0
LJMP   RW13     ;死循環

RW14:             ;計數任務十四
CPL P0.1
LJMP   RW14     ;死循環

RW15:             ;計數任務十五
CPL P0.2
LJMP   RW15     ;死循環

RW16:             ;計數任務十六
CPL P0.3
LJMP   RW16     ;死循環

RW17:             ;計數任務十七
CPL P0.4
LJMP   RW17     ;死循環

RW18:             ;計數任務十八
CPL P0.5
LJMP   RW18     ;死循環

RW19:             ;計數任務十九
CPL P0.6
LJMP   RW19     ;死循環

RW20:             ;計數任務二十
CPL P0.7
LJMP   RW20     ;死循環

END




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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.se91| 中文字幕久久精品 | 美女日批免费视频 | 国产91丝袜在线播放 | 亚洲国产精品自拍 | 欧美视频一区二区三区 | 综合网伊人 | 夜夜爽99久久国产综合精品女不卡 | 又黄又色 | 国产资源在线视频 | 99热这里都是精品 | 亚洲三级在线观看 | av手机在线播放 | 日本亚洲一区 | 成人午夜电影在线观看 | 国产精品视频在线播放 | 久久久久一区二区三区四区 | 国产一区二区在线免费视频 | 久久综合久久综合久久综合 | 天堂国产 | 国产夜恋视频在线观看 | 成人在线视频网站 | 精品国产一区二区三区性色av | 精品久久久久久久久久 | 午夜男人的天堂 | 中文字幕国产精品 | 美女一区 | 国产高清视频一区 | 中文字幕在线观看一区二区 | 国产精品久久福利 | 久久久久国产精品午夜一区 | 日本黄色大片免费 | 国产视频一区二区 | 日韩av福利在线观看 | 91性高湖久久久久久久久_久久99 | 日韩精品一区二区不卡 | 久久久婷婷| 中文字幕第一页在线 | 国产精品久久久久久久久动漫 | 羞羞视频免费观看入口 | av手机在线播放 |