迷你RTOS第二版改进版开源——带简单通信功能,不容错过哦 - 侃单片机 - 21IC电子...
来源:百度文库 编辑:神马文学网 时间:2024/04/30 02:17:05
主题:迷你RTOS第二版改进版开源——带简单通信功能,不容错过哦
(声明一下,我写的RTOS结构紧凑,只是针对小容量的51MCU,因为内存小,空间小,采用了汇编写,大容量的MCU,当然可以用C来写)
(os_mini_short_v1.2,所需内存30B,代码空间400B
这是我写的第二版本的RTOS,与第一版本的不同,(都是基于抢占式调度,优先级高的线运行,不支持同一优先级)此版本,每个任务拥有自己独立的堆栈空间,同时中断堆栈与任务堆栈分离,这样有效的利用空间,每个任务定义的空间可以不相等,切换速度很快,直接改变SP,所以只需几十US的时间就可以保证任务切换完成,我为了满足需要,中断堆栈的大小以及任务的堆栈都可以根据需要改动,同时在任务简单通信中,可以采用宏代换类似于inline函数,以空间换取时间,或者直接调用通信函数,以时间换取空间,这几点都比RTXTINY,好,它不支持优先级调度,而我的支持,但唯一最大的缺点还是,只是汇编,不过可以改写成C的,主要是让学习汇编的读者了解一下,同时学习好的编程思想--模块化编程,个人经验不足,仍有不足之处,望大家包涵,一下为代码:
测试条件AT89C2051,RAM:128,ROM:2K,F:12MHZ
以下有该代码的测试图:
大家可以看一下,稍后,我上传附件,或者留邮箱我发送邮箱中
;*******************************Macro Assembler Start******************************************
REG_CLR MACRO DATA_START,DATA_END
CLR A
MOV R0,#DATA_END
MOV R1,#(DATA_END-DATA_START)
REPEAT_CLR:
MOV @R0,A
DEC R0
DJNZ R1,REPEAT_CLR
ENDM
TIME_INITIAL MACRO SYSTEM_TIME
MOV TL0,#((65536-SYSTEM_TIME) MOD 256)
MOV TH0,#((65536-SYSTEM_TIME)/ 256)
ENDM
TIME_MODEL_SET MACRO
MOV TMOD,#01H;
SETB EA
SETB ET0
SETB TR0
ENDM
TIME_CORRECT MACRO SYS_TIME ;the task time correct automaticlly ;
MOV A,#((65536-SYS_TIME+7) MOD 256) ;default worth is 5ms
CLR TR0
ADD A,TL0
MOV TL0,A
MOV A,TH0
ADDC A,#((65536-SYS_TIME+7 )/256)
MOV TH0,A
SETB TR0
ENDM
TASK_REG_INITIAL MACRO
DEC A
MOV SP,A ;sp points to the stack of the idle task
MOV TASK_RD_INDEX,#03FH ;all tasks are inserted to the task_ready_squeue
MOV TASK_CURRENT_ID,#05H;start with the task idle who have the lowest priority
MOV TASK_POSITION,#~TASK_POSITION_ID
MOV TASK_TIMEOUT,#TASK_TIMEOUT_SET ;
SETB REAL_TASK ;indicate that there is a task running
ENDM
TASK_STACK_INITIAL MACRO
MOV STACK_BACK_L,#LOW(TASK_SWITCH_FUC)
MOV STACK_BACK_H,#HIGH(TASK_SWITCH_FUC)
MOV R0,#TASK_STACK_START
MOV A,R0
ADD A,#06H
MOV TASK0_SP,A
MOV A,R0
MOV @R0,#LOW(TASK0)
INC R0
MOV @R0,#HIGH(TASK0)
ADD A,#TASK0_FREE_SPACE
ENDM
TASK_CREATE MACRO TASK_FREE_SPACE,ADDRESS,LOCALSP,REG_INI,REG0,REG1,REG2
MOV R0,A
ADD A,#06H
MOV LOCALSP,A
MOV A,R0
MOV @R0,#LOW(ADDRESS)
INC R0
MOV @R0,#HIGH(ADDRESS)
ADD A,#TASK_FREE_SPACE
IF REG_INI <>0
INC R0 ;ignore ACC
INC R0
MOV @R0,REG0
INC R0
MOV @R0,REG1
INC R0
MOV @R0,REG2
ENDIF
ENDM
SEND_SIGNAL MACRO ID,FLAG,CONTROL
IF CONTROL <> 0
SETB FLAG
MOV A,ID&_DELAY
JNZ END_&ID
SETB ID&_READY
END_&ID:
NOP
ELSE
SETB FLAG
SETB ID&_READY
ENDIF
ENDM
GET_SIGNAL MACRO ID,FLAG,SUSPEND_SIGNAL
JBC FLAG,DP&ID
IF SUSPEND_SIGNAL ==0
SETB C
ENDIF
IF SUSPEND_SIGNAL <> 0
CLR EA
CLR REAL_TASK
SETB TASK_SUSPEND
ACALL TASK_SWITCH_FUC
ENDIF
DP&ID:
NOP
ENDM
TASK_GIVEUP MACRO
CLR EA
CLR REAL_TASK
ACALL TASK_SWITCH_FUC
ENDM
TASK_SUSPENDSET MACRO
CLR EA
CLR REAL_TASK
SETB TASK_SUSPEND
ACALL TASK_SWITCH_FUC
ENDM
TASK_DELAYSET MACRO ID,TIME
MOV ID&_DELAY,TIME
SETB TASK_SUSPEND
ENDM
这是变量部分,以及常量部分,学习大师的方法,采用DS命令,大家学汇编的话,以后不要再用EQU或者DATA,直接命名变量,这样修改起来很麻烦,采用DS命令修改方便同时写起来轻松:
;**********************************************************************************
DSEG AT 30H ;30H-47H ;桑德菲杰
TASK0_DELAY: DS 1
TASK1_DELAY: DS 1
TASK2_DELAY: DS 1
TASK3_DELAY: DS 1
TASK4_DELAY: DS 1
TASK5_DELAY: DS 1
TASK_TIMEOUT: DS 1
TASK_CURRENT_ID: DS 1
TASK0_SP: DS 1
TASK1_SP: DS 1
TASK2_SP: DS 1
TASK3_SP: DS 1
TASK4_SP: DS 1
TASK5_SP: DS 1
TASK_STACK: DS 1
TASK_POSITION: DS 1
STACK_BACK_L: DS 1
STACK_BACK_H: DS 1
DSEG AT 48H
TASK_STACK_SPACE: DS 48 ;48H-77H
INT_STACK: DS 6 ;78H-7FH
BSEG AT 00H
TASK0_READY: DBIT 1
TASK1_READY: DBIT 1
TASK2_READY: DBIT 1
TASK3_READY: DBIT 1
TASK4_READY: DBIT 1
TASK5_READY: DBIT 1
TASK_TIMEOUT_F: DBIT 1
BSEG AT 08H
TASK_SUSPEND: DBIT 1
W_SIGNAL: DBIT 1
CK_STATE: DBIT 1
REAL_TASK: DBIT 1
;*******************************TASK_FLAG*****************************************************
FL4: DBIT 1
;********************************const var****************************************************
ON EQU 1
OFF EQU 0
TASK_MAX_NUM EQU 6
TASK_READY_NUM EQU TASK_MAX_NUM-1
TASK_POSITION_ID EQU 20H;00100000B TASK5
TASK_RD_INDEX EQU 20H
TASK0_FREE_SPACE EQU 7 ;BACKADDRESS0 BACKADDRESS1 PSW R0 R1 R2 ACC ,5+4=9
TASK1_FREE_SPACE EQU 7
TASK2_FREE_SPACE EQU 9
TASK3_FREE_SPACE EQU 7
TASK4_FREE_SPACE EQU 9
TASK5_FREE_SPACE EQU 9
TASK_STACK_START EQU TASK_STACK_SPACE
TASK_SP_POINTER EQU TASK0_SP
SYS_TIME EQU 5000
TASK_TIMEOUT_SET EQU 2; set task time out
TASK0_P EQU 01H
TASK1_P EQU 02H
TASK2_P EQU 04H
TASK3_P EQU 08H
TASK4_P EQU 10H
TASK5_P EQU 20H
TASK6_P EQU 40H
TIMEOUT_P EQU 80H
TASK0_ID EQU 00H
TASK1_ID EQU 01H
TASK2_ID EQU 02H
TASK3_ID EQU 03H
TASK4_ID EQU 04H
TASK5_ID EQU 05H
TASK6_ID EQU 06H
;*****************************************************************************************
LED0 BIT P2.0
LED1 BIT P2.1
LED2 BIT P2.2
LED3 BIT P2.3
LED4 BIT P2.4
LED5 BIT P2.5
LED6 BIT P2.6
LED7 BIT P2.7
;********************************MAIN_PROCESS_START****************************************
CSEG AT 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 0030H
START:
;*******************************SYSTEM_INITIAL******************************************
REG_CLR 1FH,7FH;
TASK_STACK_INITIAL;
TASK_CREATE TASK1_FREE_SPACE,TASK1,TASK1_SP,OFF
TASK_CREATE TASK2_FREE_SPACE,TASK2,TASK2_SP,OFF
TASK_CREATE TASK3_FREE_SPACE,TASK3,TASK3_SP,OFF
TASK_CREATE TASK4_FREE_SPACE,TASK4,TASK4_SP,OFF
TASK_REG_INITIAL
TIME_INITIAL SYS_TIME
TIME_MODEL_SET
;*******************************SYSTEM_INITIAL*****************************************
;********************************TASK_INITIAL******************************************
;put task_initial
;***********************************************************************************
AJMP TASK5 ;start at the lowest priority task which is idle task
TASK0:
CPL LED0
TASK_DELAYSET TASK0,#200
TASK_GIVEUP
SJMP TASK0
TASK1:
CPL LED1
TASK_DELAYSET TASK1,#100
TASK_GIVEUP
SJMP TASK1
TASK2:
CPL LED2
MOV R7,#TASK4_ID
MOV R5,#TASK4_P
ACALL SEND_SIGNAL_FUC
TASK_DELAYSET TASK2,#120
TASK_GIVEUP
SJMP TASK2
TASK3:
CPL LED3
TASK_DELAYSET TASK3,#50
TASK_GIVEUP
SJMP TASK3
TASK4:
CPL LED4
SETB W_SIGNAL
CLR EA
ACALL TASK_WAIT_FUC
JUPD:
SJMP TASK4
TASK5:
CPL LED5
SJMP TASK5
;********************************************************************************
; Prototype : TIME0
; Description: TIME0 Interrupt Function using 0 and
; switch to its own stack when function start,
; check all the delay time of all tasks and set
; the flag when delay==0 or timeout ==0
; Input Parameter:None
; Return :None(Back to task switch function or interrupt position of current task)
; Create Data :2010-10-1
; Revision History:2010-10-11
;********************************************************************************
TIME0:
PUSH ACC
MOV A,#(INT_STACK-1)
XCH A,SP
MOV TASK_STACK,A
PUSH PSW
PUSH 00H
PUSH 01H
PUSH 02H
TIME_CORRECT 5000;
;----------------------
PUSH TASK_RD_INDEX
MOV R2,#07H
MOV R1,#TASK0_DELAY
MOV R0,#01H
RE_CHECK_DELAY:
MOV A,@R1
JZ CHECK_NEXT
DEC @R1
MOV A,@R1
JNZ CHECK_NEXT
MOV A,R0
ORL TASK_RD_INDEX,A
CHECK_NEXT:
INC R1
XCH A,R0
RL A
XCH A,R0
DJNZ R2,RE_CHECK_DELAY
POP ACC
;--------------------------
POP 02H
POP 01H
POP 00H
POP PSW
XRL A,TASK_RD_INDEX
JZ INT_END
CPL LED7;---------------------
XCH A,TASK_STACK
MOV SP,A
POP ACC
PUSH STACK_BACK_L
PUSH STACK_BACK_H
RETI
INT_END:
XCH A,TASK_STACK
MOV SP,A
POP ACC
RETI
;***************************************************************************************
; Prototype:TASK_SWITCH_FUC
; Description:Check whether there is a task in task_ready_queue,
; if the task with the highest priority is in task_ready_queue,
; it will be inserted to task_current_id,meanwhile,the current
; task will be saved,and change the sp to the next task''s stack
; Input Parameter:None
; Return :None(Back to current task or next task)
; Create Data:2010-10-1
; Revision History:2010-10-11
;***************************************************************************************
TASK_SWITCH_FUC:
MOV TASK_TIMEOUT,#TASK_TIMEOUT_SET
PUSH PSW
PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC
;------------------TASK_INDEX_MODULE_START----------------------
JNB TASK_TIMEOUT_F,RD_INDEX
CLR REAL_TASK
CLR TASK_TIMEOUT_F
RD_INDEX:
MOV A,TASK_RD_INDEX
JZ TASK_SWITCH_END;-------------????
MOV A,TASK_RD_INDEX;R3=TASK_INDEX-------R4=TASK_TEMP_ID
MOV R2,#06H ;number
MOV R1,#00H ;task_id
MOV R0,#0FEH ;task_id_flag cpl
RE_CHECK:
RRC A
JNC NEXT_CHECK
MOV A,R0
ANL TASK_RD_INDEX,A
SJMP TASK_INDEX_END;return R1 with ready task_id
NEXT_CHECK:
XCH A,R0
RL A
XCH A,R0
INC R1
DJNZ R2,RE_CHECK
TASK_INDEX_END:
JNB REAL_TASK,HIGH_PRIO
CLR C
MOV A,R1
SUBB A,TASK_CURRENT_ID
JC HIGH_PRIO
LOW_PRIO:
MOV A,R0
CPL A
ORL TASK_RD_INDEX,A ;recover the index flag
SJMP TASK_SWITCH_END
HIGH_PRIO:
JBC TASK_SUSPEND,NEXT_JUP
MOV A,TASK_POSITION
CPL A
ORL TASK_RD_INDEX,A ;the current task is inserted to the ready_squeue
NEXT_JUP:
MOV A,TASK_CURRENT_ID
MOV TASK_CURRENT_ID,R1
MOV TASK_POSITION,R0
NOP
ADD A,#TASK_SP_POINTER
XCH A,R0
MOV @R0,SP
MOV A,R1
ADD A,#TASK_SP_POINTER
XCH A,R0
MOV SP,@R0
TASK_SWITCH_END:
SETB REAL_TASK
POP ACC
POP 02H
POP 01H
POP 00H
POP PSW
SETB EA
RET
;**************************************************************************************
; Prototype :TASK_WAIT_FUC
; Input Parameter :Ticks(R7),W_SIGNAL
; Description :If W_SIGAL==1,then the current task will suspend because of signal
; If W_SIGAL==0,then the current task will suspend because of delay time
; Return :R7(FFH|No Change)
; Create Data :2010-10-12
; Revision History:2010-10-13
;**************************************************************************************
TASK_WAIT_FUC:
PUSH ACC
JBC W_SIGNAL,WAIT_SIGNAL
MOV A,R7;(Ticks:1--255)
JNZ NO_ERRO_0
CPL A
MOV R7,A
POP ACC
RET
NO_ERRO_0:
PUSH 00H
MOV R0,#TASK0_DELAY
XCH A,R0
ADD A,#TASK_CURRENT_ID
XCH A,R0
MOV @R0,A
POP 00H
WAIT_SIGNAL:
POP ACC
SETB TASK_SUSPEND
PUSH STACK_BACK_L
PUSH STACK_BACK_H
RET ;Back to TASK_SWITCH_FUC
;**************************************************************************************
; Prototype : SEND_SIGNAL_FUC
; Input Parameter :R7(Task_ID),R5(Task_ready_position),CK_STATE(Check_state)
; Description :If CK_STATE==1,then check whether task&id_delay is zero
; Return :R7(FFH:Erro|00H|Nochange)
; Create Data : 2010-10-12
; Revision History: 2010-10-12
;**************************************************************************************
SEND_SIGNAL_FUC:
PUSH ACC
PUSH 00H
MOV R0,#TASK0_DELAY
MOV A,R0
ADD A,R7
XCH A,R0
MOV A,@R0
JNB CK_STATE,STATE_ZERO
JZ STATE_ZERO
POP 00H
POP ACC
RET
STATE_ZERO:
MOV A,R5
ORL TASK_RD_INDEX,A
MOV @R0,00H
POP 00H
POP ACC
RET
END
测试条件RAM:128B,ROM:2K,F:12MHZ:
初始化部分,花费时间461US,运行到TASK5即空闲任务,并运行到切换部分
下载 (71.8 KB)
2010-10-18 22:25
由TASK5切换到TASK0,运行状态为522US,任务切换花费时间仅为
522US-461US=61US,即几十US就可以完成任务切换任务
下载 (49.37 KB)
2010-10-18 22:29
2010-10-18 22:31
下载 (65.85 KB)
2010-10-18 22:32
任务切换完,运行状态为600US,切换时间为600US-533US=67US,与上次的
时间相接近
下载 (60.83 KB)
2010-10-18 22:34
下载 (57.7 KB)
2010-10-18 22:36
帖子: 181
积分: 645
专家等级:
结贴率88%
迷你RTOS第二版改进版开源——带简单通信功能,不容错过哦 RTOS, 通信, 开源, 功能, 改进 本帖最后由 singleywy 于 2010-10-19 12:10 编辑(声明一下,我写的RTOS结构紧凑,只是针对小容量的51MCU,因为内存小,空间小,采用了汇编写,大容量的MCU,当然可以用C来写)
(os_mini_short_v1.2,所需内存30B,代码空间400B
这是我写的第二版本的RTOS,与第一版本的不同,(都是基于抢占式调度,优先级高的线运行,不支持同一优先级)此版本,每个任务拥有自己独立的堆栈空间,同时中断堆栈与任务堆栈分离,这样有效的利用空间,每个任务定义的空间可以不相等,切换速度很快,直接改变SP,所以只需几十US的时间就可以保证任务切换完成,我为了满足需要,中断堆栈的大小以及任务的堆栈都可以根据需要改动,同时在任务简单通信中,可以采用宏代换类似于inline函数,以空间换取时间,或者直接调用通信函数,以时间换取空间,这几点都比RTXTINY,好,它不支持优先级调度,而我的支持,但唯一最大的缺点还是,只是汇编,不过可以改写成C的,主要是让学习汇编的读者了解一下,同时学习好的编程思想--模块化编程,个人经验不足,仍有不足之处,望大家包涵,一下为代码:
测试条件AT89C2051,RAM:128,ROM:2K,F:12MHZ
以下有该代码的测试图:
大家可以看一下,稍后,我上传附件,或者留邮箱我发送邮箱中
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:05 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 2楼: 宏部分,宏为以后的修改非常方便,望学习汇编的好好学习这一方法;*******************************Macro Assembler Start******************************************
REG_CLR MACRO DATA_START,DATA_END
CLR A
MOV R0,#DATA_END
MOV R1,#(DATA_END-DATA_START)
REPEAT_CLR:
MOV @R0,A
DEC R0
DJNZ R1,REPEAT_CLR
ENDM
TIME_INITIAL MACRO SYSTEM_TIME
MOV TL0,#((65536-SYSTEM_TIME) MOD 256)
MOV TH0,#((65536-SYSTEM_TIME)/ 256)
ENDM
TIME_MODEL_SET MACRO
MOV TMOD,#01H;
SETB EA
SETB ET0
SETB TR0
ENDM
TIME_CORRECT MACRO SYS_TIME ;the task time correct automaticlly ;
MOV A,#((65536-SYS_TIME+7) MOD 256) ;default worth is 5ms
CLR TR0
ADD A,TL0
MOV TL0,A
MOV A,TH0
ADDC A,#((65536-SYS_TIME+7 )/256)
MOV TH0,A
SETB TR0
ENDM
TASK_REG_INITIAL MACRO
DEC A
MOV SP,A ;sp points to the stack of the idle task
MOV TASK_RD_INDEX,#03FH ;all tasks are inserted to the task_ready_squeue
MOV TASK_CURRENT_ID,#05H;start with the task idle who have the lowest priority
MOV TASK_POSITION,#~TASK_POSITION_ID
MOV TASK_TIMEOUT,#TASK_TIMEOUT_SET ;
SETB REAL_TASK ;indicate that there is a task running
ENDM
TASK_STACK_INITIAL MACRO
MOV STACK_BACK_L,#LOW(TASK_SWITCH_FUC)
MOV STACK_BACK_H,#HIGH(TASK_SWITCH_FUC)
MOV R0,#TASK_STACK_START
MOV A,R0
ADD A,#06H
MOV TASK0_SP,A
MOV A,R0
MOV @R0,#LOW(TASK0)
INC R0
MOV @R0,#HIGH(TASK0)
ADD A,#TASK0_FREE_SPACE
ENDM
TASK_CREATE MACRO TASK_FREE_SPACE,ADDRESS,LOCALSP,REG_INI,REG0,REG1,REG2
MOV R0,A
ADD A,#06H
MOV LOCALSP,A
MOV A,R0
MOV @R0,#LOW(ADDRESS)
INC R0
MOV @R0,#HIGH(ADDRESS)
ADD A,#TASK_FREE_SPACE
IF REG_INI <>0
INC R0 ;ignore ACC
INC R0
MOV @R0,REG0
INC R0
MOV @R0,REG1
INC R0
MOV @R0,REG2
ENDIF
ENDM
SEND_SIGNAL MACRO ID,FLAG,CONTROL
IF CONTROL <> 0
SETB FLAG
MOV A,ID&_DELAY
JNZ END_&ID
SETB ID&_READY
END_&ID:
NOP
ELSE
SETB FLAG
SETB ID&_READY
ENDIF
ENDM
GET_SIGNAL MACRO ID,FLAG,SUSPEND_SIGNAL
JBC FLAG,DP&ID
IF SUSPEND_SIGNAL ==0
SETB C
ENDIF
IF SUSPEND_SIGNAL <> 0
CLR EA
CLR REAL_TASK
SETB TASK_SUSPEND
ACALL TASK_SWITCH_FUC
ENDIF
DP&ID:
NOP
ENDM
TASK_GIVEUP MACRO
CLR EA
CLR REAL_TASK
ACALL TASK_SWITCH_FUC
ENDM
TASK_SUSPENDSET MACRO
CLR EA
CLR REAL_TASK
SETB TASK_SUSPEND
ACALL TASK_SWITCH_FUC
ENDM
TASK_DELAYSET MACRO ID,TIME
MOV ID&_DELAY,TIME
SETB TASK_SUSPEND
ENDM
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:08 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 3楼: 本帖最后由 singleywy 于 2010-10-19 12:05 编辑这是变量部分,以及常量部分,学习大师的方法,采用DS命令,大家学汇编的话,以后不要再用EQU或者DATA,直接命名变量,这样修改起来很麻烦,采用DS命令修改方便同时写起来轻松:
;**********************************************************************************
DSEG AT 30H ;30H-47H ;桑德菲杰
TASK0_DELAY: DS 1
TASK1_DELAY: DS 1
TASK2_DELAY: DS 1
TASK3_DELAY: DS 1
TASK4_DELAY: DS 1
TASK5_DELAY: DS 1
TASK_TIMEOUT: DS 1
TASK_CURRENT_ID: DS 1
TASK0_SP: DS 1
TASK1_SP: DS 1
TASK2_SP: DS 1
TASK3_SP: DS 1
TASK4_SP: DS 1
TASK5_SP: DS 1
TASK_STACK: DS 1
TASK_POSITION: DS 1
STACK_BACK_L: DS 1
STACK_BACK_H: DS 1
DSEG AT 48H
TASK_STACK_SPACE: DS 48 ;48H-77H
INT_STACK: DS 6 ;78H-7FH
BSEG AT 00H
TASK0_READY: DBIT 1
TASK1_READY: DBIT 1
TASK2_READY: DBIT 1
TASK3_READY: DBIT 1
TASK4_READY: DBIT 1
TASK5_READY: DBIT 1
TASK_TIMEOUT_F: DBIT 1
BSEG AT 08H
TASK_SUSPEND: DBIT 1
W_SIGNAL: DBIT 1
CK_STATE: DBIT 1
REAL_TASK: DBIT 1
;*******************************TASK_FLAG*****************************************************
FL4: DBIT 1
;********************************const var****************************************************
ON EQU 1
OFF EQU 0
TASK_MAX_NUM EQU 6
TASK_READY_NUM EQU TASK_MAX_NUM-1
TASK_POSITION_ID EQU 20H;00100000B TASK5
TASK_RD_INDEX EQU 20H
TASK0_FREE_SPACE EQU 7 ;BACKADDRESS0 BACKADDRESS1 PSW R0 R1 R2 ACC ,5+4=9
TASK1_FREE_SPACE EQU 7
TASK2_FREE_SPACE EQU 9
TASK3_FREE_SPACE EQU 7
TASK4_FREE_SPACE EQU 9
TASK5_FREE_SPACE EQU 9
TASK_STACK_START EQU TASK_STACK_SPACE
TASK_SP_POINTER EQU TASK0_SP
SYS_TIME EQU 5000
TASK_TIMEOUT_SET EQU 2; set task time out
TASK0_P EQU 01H
TASK1_P EQU 02H
TASK2_P EQU 04H
TASK3_P EQU 08H
TASK4_P EQU 10H
TASK5_P EQU 20H
TASK6_P EQU 40H
TIMEOUT_P EQU 80H
TASK0_ID EQU 00H
TASK1_ID EQU 01H
TASK2_ID EQU 02H
TASK3_ID EQU 03H
TASK4_ID EQU 04H
TASK5_ID EQU 05H
TASK6_ID EQU 06H
;*****************************************************************************************
LED0 BIT P2.0
LED1 BIT P2.1
LED2 BIT P2.2
LED3 BIT P2.3
LED4 BIT P2.4
LED5 BIT P2.5
LED6 BIT P2.6
LED7 BIT P2.7
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:10 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 4楼: 初始化部分,调用的是宏代码:;********************************MAIN_PROCESS_START****************************************
CSEG AT 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 0030H
START:
;*******************************SYSTEM_INITIAL******************************************
REG_CLR 1FH,7FH;
TASK_STACK_INITIAL;
TASK_CREATE TASK1_FREE_SPACE,TASK1,TASK1_SP,OFF
TASK_CREATE TASK2_FREE_SPACE,TASK2,TASK2_SP,OFF
TASK_CREATE TASK3_FREE_SPACE,TASK3,TASK3_SP,OFF
TASK_CREATE TASK4_FREE_SPACE,TASK4,TASK4_SP,OFF
TASK_REG_INITIAL
TIME_INITIAL SYS_TIME
TIME_MODEL_SET
;*******************************SYSTEM_INITIAL*****************************************
;********************************TASK_INITIAL******************************************
;put task_initial
;***********************************************************************************
AJMP TASK5 ;start at the lowest priority task which is idle task
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:11 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 5楼: 任务部分,里面加入了调试代码:TASK0:
CPL LED0
TASK_DELAYSET TASK0,#200
TASK_GIVEUP
SJMP TASK0
TASK1:
CPL LED1
TASK_DELAYSET TASK1,#100
TASK_GIVEUP
SJMP TASK1
TASK2:
CPL LED2
MOV R7,#TASK4_ID
MOV R5,#TASK4_P
ACALL SEND_SIGNAL_FUC
TASK_DELAYSET TASK2,#120
TASK_GIVEUP
SJMP TASK2
TASK3:
CPL LED3
TASK_DELAYSET TASK3,#50
TASK_GIVEUP
SJMP TASK3
TASK4:
CPL LED4
SETB W_SIGNAL
CLR EA
ACALL TASK_WAIT_FUC
JUPD:
SJMP TASK4
TASK5:
CPL LED5
SJMP TASK5
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:13 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 6楼: 定时器程序,检查任务定时部分,以及是否有任务超时等:;********************************************************************************
; Prototype : TIME0
; Description: TIME0 Interrupt Function using 0 and
; switch to its own stack when function start,
; check all the delay time of all tasks and set
; the flag when delay==0 or timeout ==0
; Input Parameter:None
; Return :None(Back to task switch function or interrupt position of current task)
; Create Data :2010-10-1
; Revision History:2010-10-11
;********************************************************************************
TIME0:
PUSH ACC
MOV A,#(INT_STACK-1)
XCH A,SP
MOV TASK_STACK,A
PUSH PSW
PUSH 00H
PUSH 01H
PUSH 02H
TIME_CORRECT 5000;
;----------------------
PUSH TASK_RD_INDEX
MOV R2,#07H
MOV R1,#TASK0_DELAY
MOV R0,#01H
RE_CHECK_DELAY:
MOV A,@R1
JZ CHECK_NEXT
DEC @R1
MOV A,@R1
JNZ CHECK_NEXT
MOV A,R0
ORL TASK_RD_INDEX,A
CHECK_NEXT:
INC R1
XCH A,R0
RL A
XCH A,R0
DJNZ R2,RE_CHECK_DELAY
POP ACC
;--------------------------
POP 02H
POP 01H
POP 00H
POP PSW
XRL A,TASK_RD_INDEX
JZ INT_END
CPL LED7;---------------------
XCH A,TASK_STACK
MOV SP,A
POP ACC
PUSH STACK_BACK_L
PUSH STACK_BACK_H
RETI
INT_END:
XCH A,TASK_STACK
MOV SP,A
POP ACC
RETI
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:14 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 7楼: 任务切换函数,可以被中断调用,或者任务调用:;***************************************************************************************
; Prototype:TASK_SWITCH_FUC
; Description:Check whether there is a task in task_ready_queue,
; if the task with the highest priority is in task_ready_queue,
; it will be inserted to task_current_id,meanwhile,the current
; task will be saved,and change the sp to the next task''s stack
; Input Parameter:None
; Return :None(Back to current task or next task)
; Create Data:2010-10-1
; Revision History:2010-10-11
;***************************************************************************************
TASK_SWITCH_FUC:
MOV TASK_TIMEOUT,#TASK_TIMEOUT_SET
PUSH PSW
PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC
;------------------TASK_INDEX_MODULE_START----------------------
JNB TASK_TIMEOUT_F,RD_INDEX
CLR REAL_TASK
CLR TASK_TIMEOUT_F
RD_INDEX:
MOV A,TASK_RD_INDEX
JZ TASK_SWITCH_END;-------------????
MOV A,TASK_RD_INDEX;R3=TASK_INDEX-------R4=TASK_TEMP_ID
MOV R2,#06H ;number
MOV R1,#00H ;task_id
MOV R0,#0FEH ;task_id_flag cpl
RE_CHECK:
RRC A
JNC NEXT_CHECK
MOV A,R0
ANL TASK_RD_INDEX,A
SJMP TASK_INDEX_END;return R1 with ready task_id
NEXT_CHECK:
XCH A,R0
RL A
XCH A,R0
INC R1
DJNZ R2,RE_CHECK
TASK_INDEX_END:
JNB REAL_TASK,HIGH_PRIO
CLR C
MOV A,R1
SUBB A,TASK_CURRENT_ID
JC HIGH_PRIO
LOW_PRIO:
MOV A,R0
CPL A
ORL TASK_RD_INDEX,A ;recover the index flag
SJMP TASK_SWITCH_END
HIGH_PRIO:
JBC TASK_SUSPEND,NEXT_JUP
MOV A,TASK_POSITION
CPL A
ORL TASK_RD_INDEX,A ;the current task is inserted to the ready_squeue
NEXT_JUP:
MOV A,TASK_CURRENT_ID
MOV TASK_CURRENT_ID,R1
MOV TASK_POSITION,R0
NOP
ADD A,#TASK_SP_POINTER
XCH A,R0
MOV @R0,SP
MOV A,R1
ADD A,#TASK_SP_POINTER
XCH A,R0
MOV SP,@R0
TASK_SWITCH_END:
SETB REAL_TASK
POP ACC
POP 02H
POP 01H
POP 00H
POP PSW
SETB EA
RET
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:15 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 8楼: 任务放弃CPU程序,参数,一等待信号,二延时等待:;**************************************************************************************
; Prototype :TASK_WAIT_FUC
; Input Parameter :Ticks(R7),W_SIGNAL
; Description :If W_SIGAL==1,then the current task will suspend because of signal
; If W_SIGAL==0,then the current task will suspend because of delay time
; Return :R7(FFH|No Change)
; Create Data :2010-10-12
; Revision History:2010-10-13
;**************************************************************************************
TASK_WAIT_FUC:
PUSH ACC
JBC W_SIGNAL,WAIT_SIGNAL
MOV A,R7;(Ticks:1--255)
JNZ NO_ERRO_0
CPL A
MOV R7,A
POP ACC
RET
NO_ERRO_0:
PUSH 00H
MOV R0,#TASK0_DELAY
XCH A,R0
ADD A,#TASK_CURRENT_ID
XCH A,R0
MOV @R0,A
POP 00H
WAIT_SIGNAL:
POP ACC
SETB TASK_SUSPEND
PUSH STACK_BACK_L
PUSH STACK_BACK_H
RET ;Back to TASK_SWITCH_FUC
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:16 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 9楼: 任务发送信息函数,支持任务是否唤起;**************************************************************************************
; Prototype : SEND_SIGNAL_FUC
; Input Parameter :R7(Task_ID),R5(Task_ready_position),CK_STATE(Check_state)
; Description :If CK_STATE==1,then check whether task&id_delay is zero
; Return :R7(FFH:Erro|00H|Nochange)
; Create Data : 2010-10-12
; Revision History: 2010-10-12
;**************************************************************************************
SEND_SIGNAL_FUC:
PUSH ACC
PUSH 00H
MOV R0,#TASK0_DELAY
MOV A,R0
ADD A,R7
XCH A,R0
MOV A,@R0
JNB CK_STATE,STATE_ZERO
JZ STATE_ZERO
POP 00H
POP ACC
RET
STATE_ZERO:
MOV A,R5
ORL TASK_RD_INDEX,A
MOV @R0,00H
POP 00H
POP ACC
RET
END
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:17 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 10楼: 完毕;- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:17 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 11楼: 等待C语言版本,大家尽情期待- 发短消息
- 加为好友
c+++ 当前离线
- 帖子
- 13
- 精华
- 0
- 积分
- 39
- 阅读权限
- 10
- 在线时间
- 4 小时
- 注册时间
- 2010-10-12
- 最后登录
- 2010-10-18
帖子: 13
积分: 39
专家等级:
c+++发表于 2010-10-18 22:23 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 12楼: 顶你!- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:25 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 13楼: 本帖最后由 singleywy 于 2010-10-18 22:27 编辑测试条件RAM:128B,ROM:2K,F:12MHZ:
初始化部分,花费时间461US,运行到TASK5即空闲任务,并运行到切换部分
下载 (71.8 KB)
2010-10-18 22:25
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:28 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 14楼: 本帖最后由 singleywy 于 2010-10-18 22:31 编辑由TASK5切换到TASK0,运行状态为522US,任务切换花费时间仅为
522US-461US=61US,即几十US就可以完成任务切换任务
下载 (49.37 KB)
2010-10-18 22:29
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:31 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 15楼:任务运行到TASK0
下载 (57.6 KB)2010-10-18 22:31
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:32 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 16楼: 为了调试让TASK0主动放弃CPU,开始任务调试了,状态为533US下载 (65.85 KB)
2010-10-18 22:32
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:34 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 17楼: 本帖最后由 singleywy 于 2010-10-18 22:35 编辑任务切换完,运行状态为600US,切换时间为600US-533US=67US,与上次的
时间相接近
下载 (60.83 KB)
2010-10-18 22:34
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:36 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 18楼: 运行到TASK1下载 (57.7 KB)
2010-10-18 22:36
- 发短消息
- 加为好友
singleywy 当前在线
- 帖子
- 181
- 精华
- 2
- 积分
- 645
- 阅读权限
- 20
- 在线时间
- 67 小时
- 注册时间
- 2010-5-23
- 最后登录
- 2010-10-30
帖子: 181
积分: 645
专家等级:
singleywy发表于 2010-10-18 22:37 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 19楼: 一下部分不作测试了,任务切换的时间保证在几十US的时间- 发短消息
- 加为好友
batsong 当前在线
- 帖子
- 216
- 精华
- 0
- 积分
- 657
- 阅读权限
- 20
- 在线时间
- 75 小时
- 注册时间
- 2010-3-31
- 最后登录
- 2010-10-30
帖子: 216
积分: 657
专家等级:
batsong发表于 2010-10-18 23:08 | 只看该作者 回复 引用 评分 报告 返回版面 TOP 得分:0 20楼: 汇编读起来太费力了,不是设计者很难懂,等待c语言版本
迷你RTOS第二版改进版开源——带简单通信功能,不容错过哦 - 侃单片机 - 21IC电子...
MIPS架构下PIC32单片机的UART通信 - 21世纪电子
【唐诗网】——不容错过!
走过路过??不容错过——美女
美味不容错过——紫薯酥
51单片机串口通信软件程序 - 中国电子前沿-->领先的嵌入式技术网站平台,单片机,DS...
不容错过的收藏——Webshots精选
不容错过的收藏——Webshots精选00
.不容错过的收藏——Webshots精选
不容错过的收藏——Webshots精选1
不容错过的收藏——Webshots精选111
不容错过的收藏——Webshots精选vip
不容错过的收藏——Webshots精选1
不容错过的收藏——美图精选
不容错过的收藏——Webshots精选.
[图文音画]不容错过的收藏——Webshots精选
.不容错过的收藏——美图
不容错过的收藏——Webshots 美图 精选
不容错过的收藏——美景精选
不容错过的收藏——Webshots精选..........
.不容错过的收藏——Webshots精美照片
不容错过
四川正宗自制泡椒凤爪,简单易学,不容错过!
四川正宗自制泡椒凤爪,简单易学,不容错过!