📄 os_task.lis
字号:
0156 5040 sbci R21,0
0158 84E2 ldi R24,36
015A F101 movw R30,R2
015C 8083 std z+0,R24
015E .dbline 95
015E ; *stk-- = (INT8U)0x25;
015E 1A01 movw R2,R20
0160 4150 subi R20,1
0162 5040 sbci R21,0
0164 85E2 ldi R24,37
0166 F101 movw R30,R2
0168 8083 std z+0,R24
016A .dbline 96
016A ; *stk-- = (INT8U)0x26;
016A 1A01 movw R2,R20
016C 4150 subi R20,1
016E 5040 sbci R21,0
0170 86E2 ldi R24,38
0172 F101 movw R30,R2
0174 8083 std z+0,R24
0176 .dbline 97
0176 ; *stk-- = (INT8U)0x27;
0176 1A01 movw R2,R20
0178 4150 subi R20,1
017A 5040 sbci R21,0
017C 87E2 ldi R24,39
017E F101 movw R30,R2
0180 8083 std z+0,R24
0182 .dbline 99
0182 ; // the heap pointer Y=R29:R28 will not be stored
0182 ; *stk-- = (INT8U)0x30;
0182 1A01 movw R2,R20
0184 4150 subi R20,1
0186 5040 sbci R21,0
0188 80E3 ldi R24,48
018A F101 movw R30,R2
018C 8083 std z+0,R24
018E .dbline 100
018E ; *stk-- = (INT8U)0x31;
018E 1A01 movw R2,R20
0190 4150 subi R20,1
0192 5040 sbci R21,0
0194 81E3 ldi R24,49
0196 F101 movw R30,R2
0198 8083 std z+0,R24
019A .dbline 102
019A ; // *stk-- = (INT8U)0x3B;
019A ; *stk-- = (INT8U)0x80; //SREG = Interrupts enabled
019A 1A01 movw R2,R20
019C 4150 subi R20,1
019E 5040 sbci R21,0
01A0 80E8 ldi R24,128
01A2 F101 movw R30,R2
01A4 8083 std z+0,R24
01A6 .dbline 104
01A6 ;
01A6 ; tmp = (INT16U)(stks);
01A6 B501 movw R22,R10
01A8 .dbline 105
01A8 ; *stk-- = (OS_STK)(tmp >> 8);
01A8 1A01 movw R2,R20
01AA 4150 subi R20,1
01AC 5040 sbci R21,0
01AE 2B01 movw R4,R22
01B0 452C mov R4,R5
01B2 5524 clr R5
01B4 F101 movw R30,R2
01B6 4082 std z+0,R4
01B8 .dbline 106
01B8 ; *stk = (OS_STK)(tmp);
01B8 FA01 movw R30,R20
01BA 6083 std z+0,R22
01BC .dbline 107
01BC ; return ((void *)stk);
01BC 042F mov R16,R20
01BE 152F mov R17,R21
01C0 .dbline -2
01C0 L2:
01C0 0E940000 xcall pop_gset3
01C4 .dbline 0 ; func end
01C4 0895 ret
01C6 .dbsym r stks 10 pc
01C6 .dbsym r tmp 22 i
01C6 .dbsym r stk 20 pc
01C6 .dbsym l opt 8 i
01C6 .dbsym l ptos 6 pc
01C6 .dbsym r pdata 18 pV
01C6 .dbsym r task 16 pfV
01C6 .dbend
01C6 .dbfunc e OSTaskCreate _OSTaskCreate fc
01C6 ; psp -> R20,R21
01C6 ; err -> R20
01C6 ; prio -> R22
01C6 ; ptos -> y+16
01C6 ; pdata -> R10,R11
01C6 ; task -> R20,R21
.even
01C6 _OSTaskCreate::
01C6 0E940000 xcall push_gset3
01CA 5901 movw R10,R18
01CC A801 movw R20,R16
01CE 2A97 sbiw R28,10
01D0 6A89 ldd R22,y+18
01D2 .dbline -1
01D2 .dbline 111
01D2 ; }
01D2 ;
01D2 ; INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
01D2 ; {
01D2 .dbline 116
01D2 ; void *psp;
01D2 ; INT8U err;
01D2 ;
01D2 ;
01D2 ; if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
01D2 8FE0 ldi R24,15
01D4 8617 cp R24,R22
01D6 10F4 brsh L4
01D8 .dbline 116
01D8 .dbline 117
01D8 ; return (OS_PRIO_INVALID);
01D8 0AE2 ldi R16,42
01DA 72C0 xjmp L3
01DC L4:
01DC .dbline 119
01DC ; }
01DC ; OS_ENTER_CRITICAL();
01DC 0A93 st -y,r16
01DE 0FB7 in r16,0x3f
01E0 F894 cli
01E2 0F93 push r16
01E4 0991 ld r16,y+
01E6 .dbline 119
01E6 .dbline 120
01E6 ; if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
01E6 82E0 ldi R24,2
01E8 869F mul R24,R22
01EA F001 movw R30,R0
01EC 80E0 ldi R24,<_OSTCBPrioTbl
01EE 90E0 ldi R25,>_OSTCBPrioTbl
01F0 E80F add R30,R24
01F2 F91F adc R31,R25
01F4 2080 ldd R2,z+0
01F6 3180 ldd R3,z+1
01F8 2220 tst R2
01FA 09F0 breq X1
01FC 5CC0 xjmp L6
01FE X1:
01FE 3320 tst R3
0200 09F0 breq X2
0202 59C0 xjmp L6
0204 X2:
0204 X0:
0204 .dbline 120
0204 .dbline 121
0204 ; OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
0204 82E0 ldi R24,2
0206 869F mul R24,R22
0208 F001 movw R30,R0
020A 80E0 ldi R24,<_OSTCBPrioTbl
020C 90E0 ldi R25,>_OSTCBPrioTbl
020E E80F add R30,R24
0210 F91F adc R31,R25
0212 81E0 ldi R24,1
0214 90E0 ldi R25,0
0216 8083 std z+0,R24
0218 9183 std z+1,R25
021A .dbline 123
021A ; /* ... the same thing until task is created. */
021A ; OS_EXIT_CRITICAL();
021A 0A93 st -y,r16
021C 0F91 pop r16
021E 0FBF out 0x3F,r16
0220 0991 ld r16,y+
0222 .dbline 123
0222 .dbline 124
0222 ; psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); /* Initialize the task's stack */
0222 2224 clr R2
0224 3324 clr R3
0226 2A82 std y+2,R2
0228 3B82 std y+3,R3
022A 0888 ldd R0,y+16
022C 1988 ldd R1,y+17
022E 0882 std y+0,R0
0230 1982 std y+1,R1
0232 9501 movw R18,R10
0234 8A01 movw R16,R20
0236 E4DE xcall _OSTaskStkInit
0238 A801 movw R20,R16
023A .dbline 125
023A ; err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);
023A 2224 clr R2
023C 3324 clr R3
023E 2886 std y+8,R2
0240 3986 std y+9,R3
0242 2E82 std y+6,R2
0244 3F82 std y+7,R3
0246 2C82 std y+4,R2
0248 3D82 std y+5,R3
024A 2A82 std y+2,R2
024C 3B82 std y+3,R3
024E 2882 std y+0,R2
0250 3982 std y+1,R3
0252 9A01 movw R18,R20
0254 062F mov R16,R22
0256 0E940000 xcall _OSTCBInit
025A 402F mov R20,R16
025C .dbline 126
025C ; if (err == OS_NO_ERR) {
025C 0023 tst R16
025E A9F4 brne L8
0260 .dbline 126
0260 .dbline 127
0260 ; OS_ENTER_CRITICAL();
0260 0A93 st -y,r16
0262 0FB7 in r16,0x3f
0264 F894 cli
0266 0F93 push r16
0268 0991 ld r16,y+
026A .dbline 127
026A .dbline 128
026A ; OSTaskCtr++; /* Increment the #tasks counter */
026A 80910000 lds R24,_OSTaskCtr
026E 8F5F subi R24,255 ; addi 1
0270 80930000 sts _OSTaskCtr,R24
0274 .dbline 129
0274 ; OS_EXIT_CRITICAL();
0274 0A93 st -y,r16
0276 0F91 pop r16
0278 0FBF out 0x3F,r16
027A 0991 ld r16,y+
027C .dbline 129
027C .dbline 130
027C ; if (OSRunning) { /* Find highest priority task if multitasking has started */
027C 20900000 lds R2,_OSRunning
0280 2220 tst R2
0282 B9F0 breq L9
0284 .dbline 130
0284 .dbline 131
0284 ; OSSched();
0284 0E940000 xcall _OSSched
0288 .dbline 132
0288 ; }
0288 .dbline 133
0288 14C0 xjmp L9
028A L8:
028A .dbline 133
028A ; } else {
028A .dbline 134
028A ; OS_ENTER_CRITICAL();
028A 0A93 st -y,r16
028C 0FB7 in r16,0x3f
028E F894 cli
0290 0F93 push r16
0292 0991 ld r16,y+
0294 .dbline 134
0294 .dbline 135
0294 ; OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
0294 82E0 ldi R24,2
0296 869F mul R24,R22
0298 F001 movw R30,R0
029A 80E0 ldi R24,<_OSTCBPrioTbl
029C 90E0 ldi R25,>_OSTCBPrioTbl
029E E80F add R30,R24
02A0 F91F adc R31,R25
02A2 2224 clr R2
02A4 3324 clr R3
02A6 2082 std z+0,R2
02A8 3182 std z+1,R3
02AA .dbline 136
02AA ; OS_EXIT_CRITICAL();
02AA 0A93 st -y,r16
02AC 0F91 pop r16
02AE 0FBF out 0x3F,r16
02B0 0991 ld r16,y+
02B2 .dbline 136
02B2 .dbline 137
02B2 ; }
02B2 L9:
02B2 .dbline 138
02B2 ; return (err);
02B2 042F mov R16,R20
02B4 05C0 xjmp L3
02B6 L6:
02B6 .dbline 139
02B6 ; } else {
02B6 .dbline 140
02B6 ; OS_EXIT_CRITICAL();
02B6 0A93 st -y,r16
02B8 0F91 pop r16
02BA 0FBF out 0x3F,r16
02BC 0991 ld r16,y+
02BE .dbline 140
02BE .dbline 141
02BE ; return (OS_PRIO_EXIST);
02BE 08E2 ldi R16,40
02C0 .dbline -2
02C0 L3:
02C0 2A96 adiw R28,10
02C2 0E940000 xcall pop_gset3
02C6 .dbline 0 ; func end
02C6 0895 ret
02C8 .dbsym r psp 20 pV
02C8 .dbsym r err 20 c
02C8 .dbsym r prio 22 c
02C8 .dbsym l ptos 16 pc
02C8 .dbsym r pdata 10 pV
02C8 .dbsym r task 20 pfV
02C8 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -