单片机汇编版的多任务实时操作系统.docx_第1页
单片机汇编版的多任务实时操作系统.docx_第2页
单片机汇编版的多任务实时操作系统.docx_第3页
单片机汇编版的多任务实时操作系统.docx_第4页
单片机汇编版的多任务实时操作系统.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 0000HRW1_SP DATA20H;任务堆栈指针位置寄存器RW2_SP DATA21HRW3_SP DATA22HRW4_SP DATA23HORG 0000HAJMP MAINORG 000BHLJMP RWQHCXORG0076H ;=任务切换程序=RWQHCX:JNB RS0,LOOP3JNB RS1,LOOP4;=任务4现场保护PUSH ACC;需注意与任务4现场还原对应PUSH BPUSH PSWMOV RW4_SP,SP;保存任务4的堆栈指针位置;=任务2现场还原MOV SP,RW1_SP;取任务1的堆栈指针位置,任务1使用寄存器0组POP PSW;需注意与任务1现场保护对应POP BPOP ACCRETILOOP2:;=任务1现场保护PUSH ACC;需注意与任务1现场还原对应PUSH BPUSH PSWMOV RW1_SP,SP;保存任务1的堆栈指针位置;=任务3现场还原MOV SP,RW2_SP;取任务2的堆栈指针位置,任务2使用寄存器1组POP PSW;需注意与任务2现场保护对应POP BPOP ACCRETILOOP3:JNB RS1,LOOP2;=任务2现场保护PUSH ACC;需注意与任务2现场还原对应PUSH BPUSH PSWMOV RW2_SP,SP;保存任务2的堆栈指针位置;=任务4现场还原MOV SP,RW3_SP;取任务3的堆栈指针位置,任务3使用寄存器2组POP PSW;需注意与任务3现场保护对应POP BPOP ACCRETILOOP4:;=任务3现场保护PUSH ACC;需注意与任务3现场还原对应PUSH BPUSH PSWMOV RW3_SP,SP;保存任务4的堆栈指针位置;=任务1现场还原MOV SP,RW4_SP;取任务4的堆栈指针位置,任务4使用寄存器3组POP PSW;需注意与任务4现场保护对应POP BPOP ACCRETI;=任务一程序=RW1_KS: ;任务一入口(初始化)CLR RS0CLR RS1;你的初始化程序;=任务一程序=RW1_MAIN: ;任务一主程序;你的程序LJMP RW1_MAIN=任务一END=;=任务二程序=RW2_KS: ;任务二入口(初始化)CLR RS0SETB RS1;你的初始化程序RW2_MAIN: ;任务二主程序;你的程序LJMP RW2_MAIN=任务二END=;=任务三程序=RW3_KS: ;任务三入口(初始化)SETB RS0CLR RS1;你的初始化程序RW3_MAIN: ;任务三主程序;你的程序LJMP RW3_MAIN=任务三END=;=任务四程序=RW4_KS: ;任务四入口(初始化)SETB RS0SETB RS1;你的初始化程序RW4_MAIN: ;任务四主程序;你的程序LJMP RW4_MAIN=任务四END=初始化程序=MAIN:MOV SP,#09FH;取任务2堆栈指针开始位置MOV DPTR,#RW2_KSPUSH DPLPUSH DPHMOV RW2_SP,#0A4H;任务2堆栈指针寄存器初值=09FH+2+任务2现场保护入栈数MOV SP,#0BFH;取任务3堆栈指针开始位置MOV DPTR,#RW3_KSPUSH DPLPUSH DPHMOV RW3_SP,#0C4H;任务3堆栈指针寄存器初值=0BFH+2+任务3现场保护入栈数MOV SP,#0DFH;取任务4堆栈指针开始位置MOV DPTR,#RW4_KSPUSH DPLPUSH DPHMOV RW4_SP,#0E4H;任务4堆栈指针寄存器初值=0DFH+2+任务4现场保护入栈数MOV SP,#7FH;取任务1堆栈指针开始位置SETB EA;开启维持个任务调度的定时器SETB ET0MOV TMOD,#02HSETB TR0LJMP RW1_KSEND要求不严谨的20任务系统此程序结构很空洞,使用请自己注意ORG 0000HRWJSQ data7FHRWJSQ1 data7EHORG 0000HAJMP MAINORG 000BHLJMP RWDDORG 0076HRWDD: ;任务调度程序MOV R0,RWJSQ ;取任务地址寄存器地址POP ACCMOV R0,A;保存当前任务断点INC R0POP ACCMOV R0,AINC R0MOV A,R0CJNEA,RWJSQ1,LOOP2;所有需要进行的任务是否进行完MOV R0,#216;任务地址寄存器起始地址LOOP2:INC R0MOV A,R0;取另一个任务断点PUSH ACCDEC R0MOV A,R0PUSH ACCMOV 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,#RW1LCALL DZSZMOV DPTR,#RW2LCALL DZSZMOV DPTR,#RW3LCALL DZSZMOV DPTR,#RW4LCALL DZSZMOV DPTR,#RW5LCALL DZSZMOV DPTR,#RW6LCALL DZSZMOV DPTR,#RW7LCALL DZSZMOV DPTR,#RW8LCALL DZSZMOV DPTR,#RW9LCALL DZSZMOV DPTR,#RW10LCALL DZSZMOV DPTR,#RW11LCALL DZSZMOV DPTR,#RW12LCALL DZSZMOV DPTR,#RW13LCALL DZSZMOV DPTR,#RW14LCALL DZSZMOV DPTR,#RW15LCALL DZSZMOV DPTR,#RW16LCALL DZSZMOV DPTR,#RW17LCALL DZSZMOV DPTR,#RW18LCALL DZSZMOV DPTR,#RW19LCALL DZSZMOV DPTR,#RW20LCALL DZSZSETB EA;开启维持个任务调度的定时器SETB ET0MOV TMOD,#02H ;MOV TH0,#6;定时器初值设置SETB TR0LJMP RW1 ;跳到第一个任务DZSZ:MOV R0,DPHINC R0MOV R0,DPLINC R0RETRW1: ;计数任务一JB P1.0,$JNB P1.0,$INC R7LJMP RW1;死循环RW2: ;计数任务二JB P1.1,$JNB P1.1,$DEC R7LJMP RW2;死循环RW3: ;计数任务三MOV R4,#0CJNE R4,#250,$ ;准确延时演示,延时时间=250*任务数*定时器时间,CPL P1.5LJMP RW3;死循环RW4: ;计数任务四MOV R6,#255;非准确延时,时间较难计算BBB:MOV R5,#255DJNZ R5,$DJNZ R6,BBBCPL P1.6LJMP RW4;死循环RW5: ;计数任务五JB P2.7,$JNB P2.7,$CPL P1.7LJMP RW5;死循环RW6: ;计数任务六JB P1.2,$JNB P1.2,$CPL P2.2LJMP RW6;死循环RW7: ;计数任务七LJMP RW7;死循环RW8: ;计数任务八LJMP RW8;死循环RW9: ;计数任务九LJMP RW9;死循环RW10: ;计数任务十LJMP RW10;死循环RW11: ;计数任务十一LJMP RW11;死循环RW12: ;计数任务十二LJMP RW12;死循环RW13: ;计数任务十三CPL P0.0LJMP RW13;死循环RW14: ;计数任务十四CPL P0.1L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论