搜索
bottom↓
回复: 16

有关51操作系统的问题

[复制链接]

出0入0汤圆

发表于 2013-2-5 14:06:32 | 显示全部楼层 |阅读模式
我用汇编写了51操作系统,是最多八个任务的基于四个优先级的占先式调度,同优先级时就基于时间片运行,高优先级的时间片比低优先级的长;
任务上下文占了IDATA区的80H~0FFH空间,每个任务16B,保存的是A,B,R0~R7,RAM的DATA区内存申请标记,PCL,PCH,DPL,DPH,PSW。
任务延时时间范围是1~63749ms,延时时间在DPTR中,定时器延时且使任务基于时间片切换。
出现的问题是系统开销太大和子函数的数目限制,留给任务运行时间少,不知有没有相同功能的系统代码给我参考优化一下自己的代码。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-2-11 18:04:03 | 显示全部楼层
厉害呀,我UCOS还没用明白呢。

出0入0汤圆

发表于 2013-2-11 18:05:26 | 显示全部楼层
加油,你是哥的偶像,我调TFT屏幕程序,调了半个月,无果,等等“”“”“”“”“”“”“”“”

出0入0汤圆

发表于 2013-2-11 18:12:14 | 显示全部楼层
51么,要么上rtx51tny,要么裸奔。什么优先级的太占用系统资源了。

出0入0汤圆

发表于 2013-2-11 18:30:54 | 显示全部楼层
要学会妥协才能生存。
1. 你做这东西的目的是什么、用来干什么?
2. 基于该前提,你现在碰到了什么问题?
3. 你碰到的问题与你之前的目的有没有关系,是否非解决不可?

出0入0汤圆

 楼主| 发表于 2013-3-2 21:18:46 | 显示全部楼层
barryliu 发表于 2013-2-11 18:30
要学会妥协才能生存。
1. 你做这东西的目的是什么、用来干什么?
2. 基于该前提,你现在碰到了什么问题?

;A,B,DPL,DPH,R0~R7,RWDATAW,PCL,PCH,PSW;0~7:RWPCB
?OSDATA0 SEGMENT DATA
?OSDATA1 SEGMENT DATA
?OSDATA2 SEGMENT DATA
?OSDATA3 SEGMENT DATA
?OSDATA4 SEGMENT DATA
?OSDATA5 SEGMENT DATA
?OSDATA6 SEGMENT DATA
?OSDATA7 SEGMENT DATA
?OSDATA8 SEGMENT DATA
?OSDATA9 SEGMENT DATA
?OSDATAA SEGMENT DATA
?OSDATAB SEGMENT DATA
?OSDATAC SEGMENT DATA
?OSDATAD SEGMENT DATA
?OSDATAE SEGMENT DATA
?OSDATAF SEGMENT DATA
        PUBLIC DATANCW
        PUBLIC RWDATAW
        PUBLIC CKFSHC
        PUBLIC CKFSJSHSL
        PUBLIC CKJSHC
        PUBLIC YS1MS
        PUBLIC YS250MS
        PUBLIC SJPJSW
        PUBLIC RWYSS
        PUBLIC RWYSL
        PUBLIC RWW
        PUBLIC RWH
        PUBLIC ZSW
        PUBLIC YXJH
        PUBLIC YXJL
        PUBLIC RWLXBJ
        PUBLIC RWLXCD
?BITDATA SEGMENT DATA BITADDRESSABLE
        PUBLIC SZJS

        PUBLIC SZJSW
        PUBLIC SZJSWD
        PUBLIC XTKXW
        PUBLIC YSBZW
        PUBLIC RWQHBZW
ISEG AT 80H
DS 80H
DSEG AT 28H
DS 40H
        RSEG ?OSDATA0
RWDATAW:DS 1;任务DATA内存位
DATANCW:DS 1;DATA内存分配标记位
        RSEG ?OSDATA1
CKFSHC:DS 4;串口发送缓存
        RSEG ?OSDATA2
CKFSJSHSL:DS 1;串口发送接收互斥量
        RSEG ?OSDATA3
CKJSHC:DS 8;串口接收缓存
        RSEG ?OSDATA4
YS1MS:DS 1;延时1毫秒计数位
        RSEG ?OSDATA5
YS250MS:DS 1;延时150毫秒计数位
        RSEG ?OSDATA6
SJPJSW:DS 1;时间片计数位:ms
        RSEG ?OSDATA7
RWYSS:DS 1;延时位短
        RSEG ?OSDATA8
RWYSL:DS 1;延时位长
        RSEG ?OSDATA9
RWW:DS 1;有任务位
        RSEG ?OSDATAA
RWH:DS 1;任务号
        RSEG ?OSDATAB
ZSW:DS 1;阻塞位;0:阻塞;1:可运行
        RSEG ?OSDATAC
YXJH:DS 1;优先级高
        RSEG ?OSDATAD
YXJL:DS 1;优先级低
        RSEG ?OSDATAE
RWLXBJ:DS 1;同级任务轮询比较
        RSEG ?OSDATAF
RWLXCD:DS 1;同级任务轮询存底
        RSEG ?BITDATA
XTZT:DS 1;系统状态        ;切换任务标志位,延时标志位,系统空闲位,- 时钟计数
SZJS EQU XTZT;时钟计数
SZJSW BIT XTZT.3;时钟计数位
SZJSWD BIT XTZT.2;时钟计数位
XTKXW BIT XTZT.5;代表系统空闲
YSBZW BIT XTZT.6;延时标志位:1代表有小于250ms的系统延时
RWQHBZW BIT XTZT.7;切换任务标志位:为1代表系统出错过
END

出0入0汤圆

 楼主| 发表于 2013-3-2 21:19:40 | 显示全部楼层
EXTRN DATA(RWH,ZSW,YXJH,YXJL,SJPJSW,RWLXCD,RWLXBJ,RWDATAW)
EXTRN BIT(RWQHBZW,XTKXW)
EXTRN CODE(XTKXRW)
?OS_RWQH SEGMENT CODE
PUBLIC OS_RWQH
PUBLIC OS_BFQH
RSEG ?OS_RWQH
USING 2;0-->2-->0
OS_XTCW:;系统切换任务错误执行代码
        MOV A,R0
        MOV PSW,R1
        SETB RWQHBZW
        SETB EA
        RETI
OS_RWQH:;保存任务上下文到对应任务ID的地方
        CLR EA
        MOV AR1,PSW
        MOV PSW,#10H;改为通用寄存器组2
OS_BFQH:
        MOV R0,A
        MOV A,SP
        CJNE A,#15H,OS_XTCW
        CLR RWQHBZW
        JBC XTKXW,OS_RWQHD
        MOV A,RWH
        ANL A,#0F0H;保存RWH高三位的任务TCB到IDATA空间
        XCH A,R0;把对应任务得到的起始地址传给R0
BCTCB MACRO BCZ;保存任务上下文到对应任务堆栈中
        INC R0
        MOV @R0,BCZ
ENDM
        MOV @R0,A                ;A
        BCTCB B                        ;B
        BCTCB DPL                ;DPL
        BCTCB DPH                ;DPH
        BCTCB 0                        ;R0
        BCTCB 1                        ;R1
        BCTCB 2                        ;R2
        BCTCB 3                        ;R3
        BCTCB 4                        ;R4
        BCTCB 5                        ;R5
        BCTCB 6                        ;R6
        BCTCB 7                        ;R7
        BCTCB RWDATAW        ;任务DATA内存位
        BCTCB AR4                ;PCL
        BCTCB AR5                ;PCH
        BCTCB AR1                ;PSW
OS_RWQHD:;选择出优先级最高的任务准备基于时间片运行;不同级别任务时间片不同
        MOV A,ZSW
        JZ XTRW;全部堵塞跳转
        XCH A,RWH
        SWAP A
        ANL A,#0FH
        MOV R0,A;给任务号给R0,准备同一级别任务基于时间片运行
        XCH A,RWH
        ANL A,YXJH;准备选择最高优先级的任务运行
        JZ YXJHRW
        ANL A,YXJL
        JZ YXJ2
MACRO_YXJ MACRO SJP
LOCAL D1,D2
        CJNE A,RWLXBJ,D1;有些任务状态改变则刷新任务列表
        MOV A,RWLXCD
D2:        INC R0
        RR A
        JNB ACC.7,D2;找出本次运行的任务ID
        MOV SJPJSW,#SJP
        SJMP RWQHD2
D1:        MOV RWLXBJ,A
        MOV R0,#0FFH
        SJMP D2
ENDM
YXJ3:;11;低优先级
        MACRO_YXJ 10
YXJ2:;10;中优先级
        MOV A,ZSW
        ANL A,YXJH
        MACRO_YXJ 20
XTRW:;空闲任务,没就绪的任务则运行这个
        MOV R4,#LOW(XTKXRW)
        MOV R5,#HIGH(XTKXRW)
        SETB XTKXW
        MOV A,R0
        MOV PSW,R1
        SETB EA
        RETI
YXJHRW:
        MOV A,ZSW
        ANL A,YXJL
        JZ YXJ0
YXJ1:;01;高优先级
        MACRO_YXJ 40
YXJ0:;00;实时
        MOV A,ZSW
        MACRO_YXJ 80
RWQHD2:
        MOV RWLXCD,A;保存轮询底;即任务运行任务指针
        MOV A,R0
        ANL A,#07H
        SWAP A
        ORL A,#80H;构造本次运行任务的堆栈地址
        ORL RWH,A;保存任务号
        MOV R0,A
DCTCB MACRO DCZ;恢复任务上下文返回运行
        INC R0
        MOV DCZ,@R0
ENDM
        MOV A,@R0        ;A
        DCTCB B                ;B
        DCTCB DPL        ;DPL
        DCTCB DPH        ;DPH
        DCTCB 0                ;R0
        DCTCB 1                ;R1
        DCTCB 2                ;R2
        DCTCB 3                ;R3
        DCTCB 4                ;R4
        DCTCB 5                ;R5
        DCTCB 6                ;R6
        DCTCB 7                ;R7
        DCTCB RWDATAW;任务DATA内存位
        DCTCB AR4        ;PCL
        DCTCB AR5        ;PCH
        DCTCB PSW        ;PSW
        SETB EA
        RETI
        END

出0入0汤圆

 楼主| 发表于 2013-3-2 21:21:43 | 显示全部楼层
今天刚开网,不懂英文,就贴切换任务这部分,

出0入0汤圆

 楼主| 发表于 2013-3-2 21:24:19 | 显示全部楼层
上是8OS的部分,下是4OS的

出0入0汤圆

 楼主| 发表于 2013-3-2 21:24:58 | 显示全部楼层
        USING 3
        USING 2
        USING 1
?OSDATA0 SEGMENT DATA
ISEG AT 0C0H
        PUBLIC RWQSDZ
RWQSDZ:DS 30H;30H=12B*4 ~PSW,A,B;任务起始堆栈
        PUBLIC RWBLQS
RWBLQS:DS 10H;10H:DPL,DPH,SP,保留;任务变量起始

        RSEG ?OSDATA0
        PUBLIC YS250MS
YS250MS:DS 1;延时250毫秒计数位
        PUBLIC YS1MS
YS1MS:DS 1;延时1毫秒计数位
        PUBLIC MIAO
MIAO:DS 1;
        PUBLIC RWYSL_RWYSS
RWYSL_RWYSS:DS 1;延时位长_延时位短

?BITDATA SEGMENT DATA BITADDRESSABLE
        RSEG ?BITDATA
XTZT:DS 1;切换任务标志位,-,系统空闲位,- 阻塞位
        PUBLIC ZSW
ZSW EQU XTZT;时钟计数
        PUBLIC XTKXW
XTKXW BIT XTZT.5;代表系统空闲
        PUBLIC RWQHBZW
RWQHBZW BIT XTZT.7;切换任务标志位
        END

出0入0汤圆

 楼主| 发表于 2013-3-2 22:35:05 | 显示全部楼层
EXTRN DATA(ZSW)
EXTRN IDATA(RWQSDZ,RWBLQS)
EXTRN BIT(RWQHBZW,XTKXW)
EXTRN CODE(XTKXRW)
?OS_RWQH SEGMENT CODE
PUBLIC OS_RWQH
RSEG ?OS_RWQH
OS_RWQH:
        CLR EA
        JBC XTKXW,OS_BFQH
        PUSH PSW
        PUSH ACC
        PUSH B
        MOV A,PSW
        RR A
        ANL A,#0CH
        ADD A,#RWBLQS
        XCH A,R0
        MOV @R0,DPL
        INC R0
        MOV @R0,DPH
        INC R0
        MOV @R0,SP
        MOV B,A
OS_BFQH:
        MOV A,ZSW
        ANL A,#0FH
        JZ XTRW
        MOV R0,#0FFH
        INC R0
        RRC A
        JNC $-2
        MOV A,R0
        RL A
        RL A
        ADD A,#RWBLQS
        MOV R0,A
        MOV DPL,@R0
        INC R0
        MOV DPH,@R0
        INC R0
        MOV SP,@R0
        MOV R0,B
        POP B
        POP ACC
        POP PSW
        SETB EA
        RETI

XTRW:;空闲任务,没就绪的任务则运行这个
        SETB XTKXW
        MOV A,#LOW(XTKXRW)
        PUSH ACC
        MOV A,#HIGH(XTKXRW)
        PUSH ACC
        SETB EA
        RETI
        END

出0入0汤圆

 楼主| 发表于 2013-3-2 22:36:34 | 显示全部楼层
EXTRN DATA(YS250MS,YS1MS,RWYSL_RWYSS,MIAO,ZSW)
EXTRN IDATA(RWBLQS)
EXTRN BIT(RWQHBZW)
EXTRN CODE(OS_RWQH)
?YSHS SEGMENT CODE
PUBLIC YSHS
RSEG ?YSHS
YSHS:
        PUSH ACC
        PUSH PSW
        MOV A,R0
        PUSH ACC
        MOV R0,#8
        INC DPTR
        MOV A,DPH
        JNZ D
        MOV A,DPL
        CJNE A,YS250MS,$+3
        JC RWYSD3
D:
        MOV A,YS250MS
        CPL A
        ADD A,#251
        ADD A,DPL
        MOV DPL,A
        CLR A
        ADDC A,DPH
RWYSD:
        CLR C
        XCH A,DPL
        RLC A
        XCH A,DPL
        RLC A
        MOV F0,C
        ADD A,#6
        JB F0,RWYSD1
        JNC RWYSD2
RWYSD1:
        ADD A,#6
        INC DPL
RWYSD2:
        ADD A,#250
        DJNZ R0,RWYSD;DPTR/250=DPL————A
        XCH A,DPL
        MOV DPH,A
RWYSD3:
        MOV A,PSW
        RL A
        SWAP A
        ANL A,#3
        INC A
        MOV R0,A
        MOV A,#80H
        RL A
        DJNZ R0,$-1
        MOV R0,A
        CLR EA
        CPL A
        ANL ZSW,A
        MOV A,DPL
        JZ $+5
        MOV A,R0
        ORL RWYSL_RWYSS,A
        MOV A,DPH
        JZ $+6
        MOV A,R0
        SWAP A
        ORL RWYSL_RWYSS,A
        POP ACC
        MOV R0,A
        POP PSW
        POP ACC
        LJMP OS_RWQH

?TIMEYS SEGMENT CODE
PUBLIC TIMEYS
RSEG ?TIMEYS
TIMEYS:
        DJNZ YS250MS,TIMEYSD
        INC MIAO
        MOV YS250MS,#250
        PUSH ACC
        MOV A,RWYSL_RWYSS
        SWAP A
        ANL A,#0FH
        JNZ $+5
        POP ACC
        RETI

        XCH A,R0
        PUSH ACC
        MOV A,R0

        JNB ACC.0,D5
        MOV R0,#RWBLQS+1
        XCH A,@R0
        DEC A
        JNZ $+16
        MOV A,RWYSL_RWYSS
        JB ACC.0,$+8
        ORL ZSW,#01H
        SETB RWQHBZW
        ANL RWYSL_RWYSS,#0EFH
        CLR A
        XCH A,@R0
D5:
        JNB ACC.1,D6
        MOV R0,#RWBLQS+5
        XCH A,@R0
        DEC A
        JNZ $+16
        MOV A,RWYSL_RWYSS
        JB ACC.1,$+8
        ORL ZSW,#02H
        SETB RWQHBZW
        ANL RWYSL_RWYSS,#0DFH
        CLR A
        XCH A,@R0
D6:
        JNB ACC.2,D7
        MOV R0,#RWBLQS+9
        XCH A,@R0
        DEC A
        JNZ $+16
        MOV A,RWYSL_RWYSS
        JB ACC.2,$+8
        ORL ZSW,#04H
        SETB RWQHBZW
        ANL RWYSL_RWYSS,#0BFH
        CLR A
        XCH A,@R0
D7:
        JNB ACC.3,D4
        MOV R0,#RWBLQS+13
        XCH A,@R0
        DEC A
        JNZ $+16
        MOV A,RWYSL_RWYSS
        JB ACC.3,$+8
        ORL ZSW,#08H
        SETB RWQHBZW
        ANL RWYSL_RWYSS,#07FH
        CLR A
        XCH A,@R0

TIMEYSD:
        PUSH ACC
        MOV A,RWYSL_RWYSS
        SWAP A
        CPL A
        ANL A,RWYSL_RWYSS
        ANL A,#0FH
        JNZ $+5
        POP ACC
        RETI
        XCH A,R0
        PUSH ACC
        MOV A,R0

        JNB ACC.0,D1
        MOV R0,#RWBLQS
        XCH A,@R0
        DEC A
        JNZ $+10
        SETB RWQHBZW
        ORL ZSW,#01H
        ANL RWYSL_RWYSS,#0FEH
        XCH A,@R0
D1:
        JNB ACC.1,D2
        MOV R0,#RWBLQS+4
        XCH A,@R0
        DEC A
        JNZ $+10
        SETB RWQHBZW
        ORL ZSW,#02H
        ANL RWYSL_RWYSS,#0FDH
        XCH A,@R0
D2:
        JNB ACC.2,D3
        MOV R0,#RWBLQS+8
        XCH A,@R0
        DEC A
        JNZ $+10
        SETB RWQHBZW
        ORL ZSW,#04H
        ANL RWYSL_RWYSS,#0FBH
        XCH A,@R0
D3:
        JNB ACC.3,D4
        MOV R0,#RWBLQS+12
        XCH A,@R0
        DEC A
        JNZ $+10
        SETB RWQHBZW
        ORL ZSW,#08H
        ANL RWYSL_RWYSS,#0F7H
        XCH A,@R0
D4:
        POP ACC
        MOV R0,A
        POP ACC
        JBC RWQHBZW,$+4
        RETI
        LJMP OS_RWQH
        END

出0入0汤圆

 楼主| 发表于 2013-3-2 22:43:45 | 显示全部楼层
EXTRN IDATA(RWQSDZ,RWBLQS)
EXTRN DATA(ZSW)
RWDZSD EQU 12;任务堆栈深度
;A:任务槽DPTR:任务地址
?RWCJ SEGMENT CODE
PUBLIC RWCJ
RSEG ?RWCJ
RWCJ:
        PUSH ACC
        INC A
        MOV R0,A
        MOV A,#80H
        RL A
        DJNZ R0,$-1
        ORL ZSW,A
        POP ACC
        INC SP
        MOV B,#RWDZSD
        MUL AB
        ADD A,#RWQSDZ
        MOV R0,A
        MOV @R0,DPL
        INC R0
        MOV @R0,DPH
        INC R0
        POP ACC
        SWAP A
        RR A
        MOV @R0,A
        RR A
        ADD A,#RWBLQS+2
        XCH A,R0
        INC A
        INC A
        MOV @R0,A
        RET
        END

出0入0汤圆

发表于 2014-9-13 14:59:13 | 显示全部楼层
谢谢楼主 拿回去好好的研究

出0入0汤圆

发表于 2014-9-13 15:00:47 | 显示全部楼层

厉害呀,我UCOS还没用明白呢。

出0入0汤圆

发表于 2014-9-30 11:26:07 | 显示全部楼层
斯郭依           

出0入0汤圆

发表于 2020-10-2 10:55:06 | 显示全部楼层
51最大的问题就是内存太小,运行操作系统比较困难。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 00:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表