什么单片机可以时一时序执行多路分支程序吗
答案:4 悬赏:80 手机版
解决时间 2021-02-17 17:54
- 提问者网友:不要迷恋哥
- 2021-02-16 22:37
什么单片机可以时一时序执行多路分支程序吗
最佳答案
- 五星知识达人网友:不如潦草
- 2021-02-17 00:11
;可以用进程切换来完成
;进程切换演示程序
;我的第二个操作系统
;作者:杨江杰
;华南农业大学2010届机化2班
;qq 1192322386
;芯片:AT89S52
;文件名:switchprocess.asm
;R0未使用
;R1作为进程栈指针切换时的地址指针
i DATA 0002H
j DATA 0003H
t DATA 0004H
;R5作为当前进程指示,表示当前正在运行的进程
;R6未用
;R7未用
;0008H未用
;0009H未用
;#005AH是栈指针数组的基址
ORG 0000H;复位操作后的程序入口
JMP main
ORG 0003H;外部中断0入口地址
JMP outint0
ORG 000BH;T0中断入口地址
JMP timer0
ORG 0013H;外部中断1入口地址
JMP outint1
ORG 001BH;T1中断入口地址
JMP timer1
ORG 0023H;串行I/O中断入口地址
JMP scom
ORG 002BH;T2中断入口地址
JMP timer2
ORG 0030H
main:
;经过实践,栈深至少要达到10
;开始制造7个进程的运行环境,第8个进程就是main本身,到时跳转到led0
MOV SP,#13H;13是栈基址减1
MOV A,#LOW led1
PUSH ACC
MOV A,#HIGH led1
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005BH,SP
MOV SP,#1DH
MOV A,#LOW led2
PUSH ACC
MOV A,#HIGH led2
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005CH,SP
MOV SP,#27H
MOV A,#LOW led3
PUSH ACC
MOV A,#HIGH led3
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005DH,SP
MOV SP,#31H
MOV A,#LOW led4
PUSH ACC
MOV A,#HIGH led4
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005EH,SP
MOV SP,#3BH
MOV A,#LOW led5
PUSH ACC
MOV A,#HIGH led5
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005FH,SP
MOV SP,#45H
MOV A,#LOW led6
PUSH ACC
MOV A,#HIGH led6
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 0060H,SP
MOV SP,#4FH
MOV A,#LOW led7
PUSH ACC
MOV A,#HIGH led7
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 0061H,SP
;成功制造7个进程的运行环境
;恢复0号进程的栈指针
MOV SP,#09H
;设定当前的进程号
MOV R5,#00H
;开始启动timer0中断
MOV TH0,#00H
MOV TL0,#00H
MOV IP,#02H
MOV TMOD,#01H
MOV IE,#82H
MOV TCON,#10H
;成功启动timer0中断,定时器正在运转
;直接进入led0进程
led0:
CPL P0.0
MOV t,#1H
CALL delay
JMP led0
led1:
CPL P0.1
MOV t,#2H
CALL delay
JMP led1
led2:
CPL P0.2
MOV t,#3H
CALL delay
JMP led2
led3:
CPL P0.3
MOV t,#4H
CALL delay
JMP led3
led4:
CPL P0.4
MOV t,#5H
CALL delay
JMP led4
led5:
CPL P0.5
MOV t,#6H
CALL delay
JMP led5
led6:
CPL P0.6
MOV t,#7H
CALL delay
JMP led6
led7:
CPL P0.7
MOV t,#8H
CALL delay
JMP led7
;延时程序,从最外层开始编写,然后嵌入内层语句
delay:
MOV i,#0FFH
outcycle:
MOV j,#0FFH
in_cycle:
DJNZ j,in_cycle
DJNZ i,outcycle
DJNZ t,delay
RET
;结束延时
outint0:
RETI
timer0:
;关闭中断
CLR EA
;开始保护运行环境
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
;成功保护运行环境
;开始切换栈指针
MOV A,#005AH
ADD A,R5
MOV R1,A
MOV @R1,SP
INC R5
INC R1
CJNE R5,#0008H,endsetR5
MOV R5,#0000H
MOV R1,#005AH
endsetR5:
MOV SP,@R1
;栈指针切换成功
;开始恢复运行环境
POP B
POP ACC
POP PSW
POP t
POP j
POP i
;成功恢复运行环境
;再次启动定时器
SETB TCON.4
;开启中断
SETB EA
RETI
outint1:
RETI
timer1:
RETI
scom:
RETI
timer2:
RETI
END
;进程切换演示程序
;我的第二个操作系统
;作者:杨江杰
;华南农业大学2010届机化2班
;qq 1192322386
;芯片:AT89S52
;文件名:switchprocess.asm
;R0未使用
;R1作为进程栈指针切换时的地址指针
i DATA 0002H
j DATA 0003H
t DATA 0004H
;R5作为当前进程指示,表示当前正在运行的进程
;R6未用
;R7未用
;0008H未用
;0009H未用
;#005AH是栈指针数组的基址
ORG 0000H;复位操作后的程序入口
JMP main
ORG 0003H;外部中断0入口地址
JMP outint0
ORG 000BH;T0中断入口地址
JMP timer0
ORG 0013H;外部中断1入口地址
JMP outint1
ORG 001BH;T1中断入口地址
JMP timer1
ORG 0023H;串行I/O中断入口地址
JMP scom
ORG 002BH;T2中断入口地址
JMP timer2
ORG 0030H
main:
;经过实践,栈深至少要达到10
;开始制造7个进程的运行环境,第8个进程就是main本身,到时跳转到led0
MOV SP,#13H;13是栈基址减1
MOV A,#LOW led1
PUSH ACC
MOV A,#HIGH led1
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005BH,SP
MOV SP,#1DH
MOV A,#LOW led2
PUSH ACC
MOV A,#HIGH led2
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005CH,SP
MOV SP,#27H
MOV A,#LOW led3
PUSH ACC
MOV A,#HIGH led3
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005DH,SP
MOV SP,#31H
MOV A,#LOW led4
PUSH ACC
MOV A,#HIGH led4
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005EH,SP
MOV SP,#3BH
MOV A,#LOW led5
PUSH ACC
MOV A,#HIGH led5
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 005FH,SP
MOV SP,#45H
MOV A,#LOW led6
PUSH ACC
MOV A,#HIGH led6
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 0060H,SP
MOV SP,#4FH
MOV A,#LOW led7
PUSH ACC
MOV A,#HIGH led7
PUSH ACC
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
MOV 0061H,SP
;成功制造7个进程的运行环境
;恢复0号进程的栈指针
MOV SP,#09H
;设定当前的进程号
MOV R5,#00H
;开始启动timer0中断
MOV TH0,#00H
MOV TL0,#00H
MOV IP,#02H
MOV TMOD,#01H
MOV IE,#82H
MOV TCON,#10H
;成功启动timer0中断,定时器正在运转
;直接进入led0进程
led0:
CPL P0.0
MOV t,#1H
CALL delay
JMP led0
led1:
CPL P0.1
MOV t,#2H
CALL delay
JMP led1
led2:
CPL P0.2
MOV t,#3H
CALL delay
JMP led2
led3:
CPL P0.3
MOV t,#4H
CALL delay
JMP led3
led4:
CPL P0.4
MOV t,#5H
CALL delay
JMP led4
led5:
CPL P0.5
MOV t,#6H
CALL delay
JMP led5
led6:
CPL P0.6
MOV t,#7H
CALL delay
JMP led6
led7:
CPL P0.7
MOV t,#8H
CALL delay
JMP led7
;延时程序,从最外层开始编写,然后嵌入内层语句
delay:
MOV i,#0FFH
outcycle:
MOV j,#0FFH
in_cycle:
DJNZ j,in_cycle
DJNZ i,outcycle
DJNZ t,delay
RET
;结束延时
outint0:
RETI
timer0:
;关闭中断
CLR EA
;开始保护运行环境
PUSH i
PUSH j
PUSH t
PUSH PSW
PUSH ACC
PUSH B
;成功保护运行环境
;开始切换栈指针
MOV A,#005AH
ADD A,R5
MOV R1,A
MOV @R1,SP
INC R5
INC R1
CJNE R5,#0008H,endsetR5
MOV R5,#0000H
MOV R1,#005AH
endsetR5:
MOV SP,@R1
;栈指针切换成功
;开始恢复运行环境
POP B
POP ACC
POP PSW
POP t
POP j
POP i
;成功恢复运行环境
;再次启动定时器
SETB TCON.4
;开启中断
SETB EA
RETI
outint1:
RETI
timer1:
RETI
scom:
RETI
timer2:
RETI
END
全部回答
- 1楼网友:痴妹与他
- 2021-02-17 03:05
你这个不算完全的并发,可以的。
将P1.0,P1.1,P1.2分别过非门后再过三输入与门,与门输出端连接到单片机的INT0或者INT1,一旦该中断输入发生中断,在中断程序中马上判断P1.0、P1.1、P1.2状态,根据这3个口状态来调用相应的处理程序。
这个倒是用不着多任务操作系统,虽然51上可以用这个东西。
只是要小心P1口那几位的状态改变的相关原因,不然一不小心就载中断里了。
将P1.0,P1.1,P1.2分别过非门后再过三输入与门,与门输出端连接到单片机的INT0或者INT1,一旦该中断输入发生中断,在中断程序中马上判断P1.0、P1.1、P1.2状态,根据这3个口状态来调用相应的处理程序。
这个倒是用不着多任务操作系统,虽然51上可以用这个东西。
只是要小心P1口那几位的状态改变的相关原因,不然一不小心就载中断里了。
- 2楼网友:摆渡翁
- 2021-02-17 01:07
真正的并发执行是不可能的,除非你用多核处理器
程序并发执行其实是操作系统的功劳,包括你的电脑能够同时执行多个任务,靠的就是XP
并发执行只是宏观上看起来是的,实际上CPU内部还是每一个周期执行一条指令。操作系统都有一个系统时钟,对于51来说,这个周期可以选择20ms左右,当然也可以是别的值,视你的任务而定。首先,系统建立多个任务,每个系统周期到来的时刻,都触发一次任务间切换,CPU保存当前任务信息而转去执行另一个任务;也可以在系统周期还没到的时候,由当前执行的任务主动触发一次任务切换;任务之间能够进行通信,比如某个任务要等到另外一个任务发个信息之后才执行,那么这个任务在执行之前,CPU可以执行别的任务(如果没有操作系统的话,一般做法就是CPU不停检测某个标志,这时CPU实际上是在空转!!!)
操作系统的核心功能就是调度任务,使CPU利用率达到最高,比如我们的很多程序里面都有延时,这种延时基本上是软件延时,CPU就在那里干耗着,操作系统里面也有延时程序,只不过这个延时是用定时器实现的,在A任务延时的时候CPU能够去执行B任务,系统在每次系统周期来到的时候检测任务A延时时间是否达到,如果到了就转去执行任务A,可以看出如果系统周期是20ms,那么任务延时设置成20msk肯定不能只能真正延时20ms
建议你看看RTX51-tiny 实时操作系统,一个为51量身定做的操作系统,非常适合51单片机,百度文库里面有中文使用说明
程序并发执行其实是操作系统的功劳,包括你的电脑能够同时执行多个任务,靠的就是XP
并发执行只是宏观上看起来是的,实际上CPU内部还是每一个周期执行一条指令。操作系统都有一个系统时钟,对于51来说,这个周期可以选择20ms左右,当然也可以是别的值,视你的任务而定。首先,系统建立多个任务,每个系统周期到来的时刻,都触发一次任务间切换,CPU保存当前任务信息而转去执行另一个任务;也可以在系统周期还没到的时候,由当前执行的任务主动触发一次任务切换;任务之间能够进行通信,比如某个任务要等到另外一个任务发个信息之后才执行,那么这个任务在执行之前,CPU可以执行别的任务(如果没有操作系统的话,一般做法就是CPU不停检测某个标志,这时CPU实际上是在空转!!!)
操作系统的核心功能就是调度任务,使CPU利用率达到最高,比如我们的很多程序里面都有延时,这种延时基本上是软件延时,CPU就在那里干耗着,操作系统里面也有延时程序,只不过这个延时是用定时器实现的,在A任务延时的时候CPU能够去执行B任务,系统在每次系统周期来到的时候检测任务A延时时间是否达到,如果到了就转去执行任务A,可以看出如果系统周期是20ms,那么任务延时设置成20msk肯定不能只能真正延时20ms
建议你看看RTX51-tiny 实时操作系统,一个为51量身定做的操作系统,非常适合51单片机,百度文库里面有中文使用说明
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯