📄 os_core.lis
字号:
.module OS_Core.c
.area text(rom, con, rel)
0000 .dbfile C:\icc\minOS_iccavr\OS_Core.c
0000 .dbfunc s OSInit _OSInit fI
; i -> R16
; pOS_TCB -> R18,R19
.even
0000 _OSInit::
0000 .dbline -1
0000 .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;
0000 .dbline 20
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
0000 20E0 ldi R18,<_OSTCB
0002 30E0 ldi R19,>_OSTCB
0004 .dbline 21
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
0004 0027 clr R16
0006 0EC0 rjmp L6
0008 L3:
0008 .dbline 22
0008 .dbline 23
0008 2224 clr R2
000A 3324 clr R3
000C E22F mov R30,R18
000E F32F mov R31,R19
0010 2082 std z+0,R2
0012 3182 std z+1,R3
0014 .dbline 24
0014 8DEF ldi R24,253
0016 8283 std z+2,R24
0018 .dbline 25
0018 2224 clr R2
001A 2382 std z+3,R2
001C 3482 std z+4,R3
001E .dbline 26
001E L4:
001E .dbline 21
001E 0395 inc R16
0020 2B5F subi R18,251 ; offset = 5
0022 3F4F sbci R19,255
0024 L6:
0024 .dbline 21
0024 0530 cpi R16,5
0026 80F3 brlo L3
0028 .dbline -2
0028 .dbline 27
; {
; pOS_TCB->OSStkTop=(INT16U)NULL;
; pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
; pOS_TCB->OSTimeDly=0;
; }
; }
0028 L2:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbsym r i 16 c
002A .dbsym r pOS_TCB 18 pX
002A .dbfunc s OSStart _OSStart fI
.even
002A _OSStart::
002A .dbline -1
002A .dbline 31
;
; //Start OS --- 启动OS
; void OSStart(void)
; {
002A .dbline 32
; Init_OS_Timer();
002A 00D0 rcall _InitOSTimer
002C .dbline 33
; OS_TASK_CrtPrio=Task_main_Prio;
002C 2224 clr R2
002E 20924A00 sts _OS_TASK_CrtPrio,R2
0032 .dbline 34
; OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
0032 222D mov R18,R2
0034 3327 clr R19
0036 05E0 ldi R16,5
0038 10E0 ldi R17,0
003A 00D0 rcall mpy16s
003C E02F mov R30,R16
003E F12F mov R31,R17
0040 80E0 ldi R24,<_OSTCB+2
0042 90E0 ldi R25,>_OSTCB+2
0044 E80F add R30,R24
0046 F91F adc R31,R25
0048 8BEF ldi R24,251
004A 8083 std z+0,R24
004C .dbline 35
; OS_INT_ENABLE();
004C .dbline 36
; OS_TASK_INT();
004C 00D0 rcall _OSCtxSw
004E .dbline -2
004E .dbline 37
; }
004E L7:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbfunc s OSPrioHighRdy _OSPrioHighRdy fI
; i -> R16
; pOS_TCB -> R18,R19
.even
0050 _OSPrioHighRdy:
0050 00D0 rcall push_gset2
0052 .dbline -1
0052 .dbline 41
;
; //返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
; static INT8U OSPrioHighRdy(void)
; { INT8U i;
0052 .dbline 43
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
0052 20E0 ldi R18,<_OSTCB
0054 30E0 ldi R19,>_OSTCB
0056 .dbline 44
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
0056 0027 clr R16
0058 24C0 rjmp L13
005A L10:
005A .dbline 45
; {
005A .dbline 46
; if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
005A E22F mov R30,R18
005C F32F mov R31,R19
005E 2080 ldd R2,z+0
0060 3180 ldd R3,z+1
0062 2220 tst R2
0064 11F4 brne X0
0066 3320 tst R3
0068 19F0 breq L16
006A X0:
006A 61E0 ldi R22,1
006C 70E0 ldi R23,0
006E 02C0 rjmp L17
0070 L16:
0070 6627 clr R22
0072 7727 clr R23
0074 L17:
0074 E22F mov R30,R18
0076 F32F mov R31,R19
0078 8281 ldd R24,z+2
007A 8C3F cpi R24,252
007C 19F4 brne L18
007E 41E0 ldi R20,1
0080 50E0 ldi R21,0
0082 02C0 rjmp L19
0084 L18:
0084 4427 clr R20
0086 5527 clr R21
0088 L19:
0088 262E mov R2,R22
008A 372E mov R3,R23
008C 2422 and R2,R20
008E 3522 and R3,R21
0090 2220 tst R2
0092 11F4 brne X1
0094 3320 tst R3
0096 11F0 breq L14
0098 X1:
0098 .dbline 46
0098 .dbline 46
0098 1127 clr R17
009A 07C0 rjmp L9
009C L14:
009C .dbline 47
009C L11:
009C .dbline 44
009C 0395 inc R16
009E 2B5F subi R18,251 ; offset = 5
00A0 3F4F sbci R19,255
00A2 L13:
00A2 .dbline 44
00A2 0530 cpi R16,5
00A4 D0F2 brlo L10
00A6 .dbline 48
; }
; return no_TASK_Rdy;
00A6 0FEF ldi R16,255
00A8 10E0 ldi R17,0
00AA .dbline -2
00AA L9:
00AA 00D0 rcall pop_gset2
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r i 16 c
00AE .dbsym r pOS_TCB 18 pX
00AE .dbfunc s OSTimeTick _OSTimeTick fI
; i -> R20
; pOS_TCB -> R22,R23
.even
00AE _OSTimeTick::
00AE 00D0 rcall push_gset2
00B0 .dbline -1
00B0 .dbline 54
; }
;
; //Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
; //如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
; void OSTimeTick(void)
; { INT8U i;
00B0 .dbline 56
; OS_TCB *pOS_TCB;
; pOS_TCB=OSTCB;
00B0 60E0 ldi R22,<_OSTCB
00B2 70E0 ldi R23,>_OSTCB
00B4 .dbline 57
; for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
00B4 4427 clr R20
00B6 21C0 rjmp L24
00B8 L21:
00B8 .dbline 58
; {
00B8 .dbline 59
; if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut)
00B8 E62F mov R30,R22
00BA F72F mov R31,R23
00BC 2380 ldd R2,z+3
00BE 3480 ldd R3,z+4
00C0 2220 tst R2
00C2 11F4 brne X2
00C4 3320 tst R3
00C6 B1F0 breq L25
00C8 X2:
00C8 .dbline 60
; {
00C8 .dbline 61
; if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
00C8 862F mov R24,R22
00CA 972F mov R25,R23
00CC 0396 adiw R24,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -