📄 os_core.s
字号:
.module OS_Core.c
.area text(rom, con, rel)
.dbfile C:\icc\minOS_iccavr\OS_Core.c
.dbfunc s OSInit _OSInit fI
; i -> R16
; pOS_TCB -> R18,R19
.even
_OSInit::
.dbline -1
.dbline 18
; /*
; *********************************************************************************************************
; * minOS 0.01v
; * The Real-Time OS Kernel
; * All Rights Reserved
; * File : OS_Core.C
; * 作者 : 21icbbs网友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
; *
; *********************************************************************************************************
; */
;
;
; #define OS_GLOBALS /* Declare GLOBAL variables */
; #include "OS_Includes.h"
;
; // initialization OSTCB --- 初始化任务控制块.
; void OSInit(void)
; { INT8U i;
.dbline 20
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
ldi R18,<_OSTCB
ldi R19,>_OSTCB
.dbline 21
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
clr R16
rjmp L6
L3:
.dbline 22
.dbline 23
clr R2
clr R3
mov R30,R18
mov R31,R19
std z+0,R2
std z+1,R3
.dbline 24
ldi R24,253
std z+2,R24
.dbline 25
clr R2
std z+3,R2
std z+4,R3
.dbline 26
L4:
.dbline 21
inc R16
subi R18,251 ; offset = 5
sbci R19,255
L6:
.dbline 21
cpi R16,5
brlo L3
.dbline -2
.dbline 27
; {
; pOS_TCB->OSStkTop=(INT16U)NULL;
; pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
; pOS_TCB->OSTimeDly=0;
; }
; }
L2:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbsym r pOS_TCB 18 pX
.dbfunc s OSStart _OSStart fI
.even
_OSStart::
.dbline -1
.dbline 31
;
; //Start OS --- 启动OS
; void OSStart(void)
; {
.dbline 32
; Init_OS_Timer();
rcall _InitOSTimer
.dbline 33
; OS_TASK_CrtPrio=Task_main_Prio;
clr R2
sts _OS_TASK_CrtPrio,R2
.dbline 34
; OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
mov R18,R2
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,251
std z+0,R24
.dbline 35
; OS_INT_ENABLE();
.dbline 36
; OS_TASK_INT();
rcall _OSCtxSw
.dbline -2
.dbline 37
; }
L7:
.dbline 0 ; func end
ret
.dbfunc s OSPrioHighRdy _OSPrioHighRdy fI
; i -> R16
; pOS_TCB -> R18,R19
.even
_OSPrioHighRdy:
rcall push_gset2
.dbline -1
.dbline 41
;
; //返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
; static INT8U OSPrioHighRdy(void)
; { INT8U i;
.dbline 43
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
ldi R18,<_OSTCB
ldi R19,>_OSTCB
.dbline 44
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
clr R16
rjmp L13
L10:
.dbline 45
; {
.dbline 46
; if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
mov R30,R18
mov R31,R19
ldd R2,z+0
ldd R3,z+1
tst R2
brne X0
tst R3
breq L16
X0:
ldi R22,1
ldi R23,0
rjmp L17
L16:
clr R22
clr R23
L17:
mov R30,R18
mov R31,R19
ldd R24,z+2
cpi R24,252
brne L18
ldi R20,1
ldi R21,0
rjmp L19
L18:
clr R20
clr R21
L19:
mov R2,R22
mov R3,R23
and R2,R20
and R3,R21
tst R2
brne X1
tst R3
breq L14
X1:
.dbline 46
.dbline 46
clr R17
rjmp L9
L14:
.dbline 47
L11:
.dbline 44
inc R16
subi R18,251 ; offset = 5
sbci R19,255
L13:
.dbline 44
cpi R16,5
brlo L10
.dbline 48
; }
; return no_TASK_Rdy;
ldi R16,255
ldi R17,0
.dbline -2
L9:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbsym r pOS_TCB 18 pX
.dbfunc s OSTimeTick _OSTimeTick fI
; i -> R20
; pOS_TCB -> R22,R23
.even
_OSTimeTick::
rcall push_gset2
.dbline -1
.dbline 54
; }
;
; //Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
; //如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
; void OSTimeTick(void)
; { INT8U i;
.dbline 56
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
ldi R22,<_OSTCB
ldi R23,>_OSTCB
.dbline 57
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
clr R20
rjmp L24
L21:
.dbline 58
; {
.dbline 59
; if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut)
mov R30,R22
mov R31,R23
ldd R2,z+3
ldd R3,z+4
tst R2
brne X2
tst R3
breq L25
X2:
.dbline 60
; {
.dbline 61
; if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
mov R24,R22
mov R25,R23
adiw R24,3
mov R2,R24
mov R3,R25
mov R30,R2
mov R31,R3
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
mov R4,R24
mov R5,R25
std z+0,R4
std z+1,R5
tst R4
brne L27
tst R5
brne L27
.dbline 61
.dbline 61
ldi R24,252
mov R30,R22
mov R31,R23
std z+2,R24
.dbline 61
L27:
.dbline 62
; }
L25:
.dbline 63
L22:
.dbline 57
inc R20
subi R22,251 ; offset = 5
sbci R23,255
L24:
.dbline 57
cpi R20,5
brlo L21
.dbline 64
; }
; OS_TASK_HighPri=OSPrioHighRdy();
rcall _OSPrioHighRdy
mov R2,R16
mov R3,R17
sts _OS_TASK_HighPri,R2
.dbline -2
.dbline 65
; }
L20:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r pOS_TCB 22 pX
.dbfunc s OSTimeDly _OSTimeDly fI
; Tdly -> R20,R21
.even
_OSTimeDly::
rcall push_gset1
mov R20,R16
mov R21,R17
.dbline -1
.dbline 70
;
; #if OS_TIME_DLY_EN
; //OS Time Delay --- 使任务延时Tdly个时间节拍
; void OSTimeDly(INT16U Tdly) /* Delay Tdly clock tick */
; {
.dbline 71
; OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
lds R18,_OS_TASK_CrtPrio
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+3
ldi R25,>_OSTCB+3
add R30,R24
adc R31,R25
std z+0,R20
std z+1,R21
.dbline 72
; OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
lds R18,_OS_TASK_CrtPrio
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,250
std z+0,R24
.dbline 73
; OSSched();
rcall _OSSched
.dbline -2
.dbline 74
; }
L29:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Tdly 20 i
.dbfunc s OSTaskSuspend _OSTaskSuspend fI
; TaskPrio -> R20
.even
_OSTaskSuspend::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 80
; #endif
;
; #if OS_TASK_SUSPEND_EN>0
; //把正在运行的任务挂起(Suspend a task)。
; void OSTaskSuspend(INT8U TaskPrio)
; {
.dbline 81
; OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
mov R18,R20
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,253
std z+0,R24
.dbline 82
; OSSched();
rcall _OSSched
.dbline -2
.dbline 83
; }
L32:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r TaskPrio 20 c
.dbfunc s OSTaskResume _OSTaskResume fI
; TaskPrio -> R20
.even
_OSTaskResume::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 89
; #endif
;
; #if OS_TASK_Resume_EN>0
; // 恢复被挂起的任务(resume a task)。
; void OSTaskResume(INT8U TaskPrio)
; {
.dbline 90
; OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
mov R18,R20
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,252
std z+0,R24
.dbline -2
.dbline 91
; }
L34:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r TaskPrio 20 c
.dbfunc s OSSched _OSSched fI
.even
_OSSched::
.dbline -1
.dbline 96
; #endif
;
; //任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
; void OSSched(void)
; {
L37:
.dbline 98
; do
; {
.dbline 99
; OS_TASK_HighPri=OSPrioHighRdy();
rcall _OSPrioHighRdy
mov R2,R16
mov R3,R17
sts _OS_TASK_HighPri,R2
.dbline 100
L38:
.dbline 100
; } while (OS_TASK_HighPri==no_TASK_Rdy);
lds R24,_OS_TASK_HighPri
cpi R24,255
breq L37
.dbline 101
; OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
mov R18,R24
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,251
std z+0,R24
.dbline 102
; OS_TASK_INT();
rcall _OSCtxSw
.dbline -2
.dbline 103
; }
L36:
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
.dbfile C:\icc\minOS_iccavr\OS_Core.c
_TASK_main_PrioStk::
.blkb 48
.dbfile C:\icc\minOS_iccavr/OS_Minos.h
.dbsym s TASK_main_PrioStk _TASK_main_PrioStk A[48:48]c
_OSTCB::
.blkb 25
.dbsym s OSTCB _OSTCB A[25:5]X
_OS_TASK_HighPri::
.blkb 1
.dbsym s OS_TASK_HighPri _OS_TASK_HighPri c
_OS_TASK_CrtPrio::
.blkb 1
.dbsym s OS_TASK_CrtPrio _OS_TASK_CrtPrio c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -