📄 os_core.lis
字号:
0078 4F5F subi R20,255 ; offset = 1
007A 5F4F sbci R21,255
007C L6:
007C .dbline 92
007C ; for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
007C 4230 cpi R20,2
007E E0E0 ldi R30,0
0080 5E07 cpc R21,R30
0082 98F3 brlo L3
0084 .dbline 96
0084 ; OSRdyTbl[i] = 0;
0084 ; }
0084 ;
0084 ; OSPrioCur = 0;
0084 2224 clr R2
0086 2092EB00 sts _OSPrioCur,R2
008A .dbline 97
008A ; OSPrioHighRdy = 0;
008A 2092EA00 sts _OSPrioHighRdy,R2
008E .dbline 98
008E ; OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */
008E 3324 clr R3
0090 3092E000 sts _OSTCBHighRdy+1,R3
0094 2092DF00 sts _OSTCBHighRdy,R2
0098 .dbline 99
0098 ; OSTCBCur = (OS_TCB *)0;
0098 3092E400 sts _OSTCBCur+1,R3
009C 2092E300 sts _OSTCBCur,R2
00A0 .dbline 100
00A0 ; OSTCBList = (OS_TCB *)0;
00A0 3092DE00 sts _OSTCBList+1,R3
00A4 2092DD00 sts _OSTCBList,R2
00A8 .dbline 101
00A8 4427 clr R20
00AA 5527 clr R21
00AC 10C0 xjmp L10
00AE L7:
00AE .dbline 101
00AE .dbline 102
00AE 02E0 ldi R16,2
00B0 10E0 ldi R17,0
00B2 9A01 movw R18,R20
00B4 0E940000 xcall empy16s
00B8 F801 movw R30,R16
00BA 80E0 ldi R24,<_OSTCBPrioTbl
00BC 90E0 ldi R25,>_OSTCBPrioTbl
00BE E80F add R30,R24
00C0 F91F adc R31,R25
00C2 2224 clr R2
00C4 3324 clr R3
00C6 2082 std z+0,R2
00C8 3182 std z+1,R3
00CA .dbline 103
00CA L8:
00CA .dbline 101
00CA 4F5F subi R20,255 ; offset = 1
00CC 5F4F sbci R21,255
00CE L10:
00CE .dbline 101
00CE ; for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
00CE 4031 cpi R20,16
00D0 E0E0 ldi R30,0
00D2 5E07 cpc R21,R30
00D4 60F3 brlo L7
00D6 .dbline 104
00D6 4427 clr R20
00D8 5527 clr R21
00DA 1AC0 xjmp L14
00DC L11:
00DC .dbline 104
00DC .dbline 105
00DC 9A01 movw R18,R20
00DE 2F5F subi R18,255 ; offset = 1
00E0 3F4F sbci R19,255
00E2 0EE0 ldi R16,14
00E4 10E0 ldi R17,0
00E6 0E940000 xcall empy16s
00EA 1801 movw R2,R16
00EC 80E0 ldi R24,<_OSTCBTbl
00EE 90E0 ldi R25,>_OSTCBTbl
00F0 280E add R2,R24
00F2 391E adc R3,R25
00F4 0EE0 ldi R16,14
00F6 10E0 ldi R17,0
00F8 9A01 movw R18,R20
00FA 0E940000 xcall empy16s
00FE F801 movw R30,R16
0100 80E0 ldi R24,<_OSTCBTbl+2
0102 90E0 ldi R25,>_OSTCBTbl+2
0104 E80F add R30,R24
0106 F91F adc R31,R25
0108 2082 std z+0,R2
010A 3182 std z+1,R3
010C .dbline 106
010C L12:
010C .dbline 104
010C 4F5F subi R20,255 ; offset = 1
010E 5F4F sbci R21,255
0110 L14:
0110 .dbline 104
0110 ; OSTCBPrioTbl[i] = (OS_TCB *)0;
0110 ; }
0110 ; for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
0110 4530 cpi R20,5
0112 E0E0 ldi R30,0
0114 5E07 cpc R21,R30
0116 10F3 brlo L11
0118 .dbline 107
0118 ; OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
0118 ; }
0118 ; OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
0118 2224 clr R2
011A 3324 clr R3
011C 30924900 sts _OSTCBTbl+70+2+1,R3
0120 20924800 sts _OSTCBTbl+70+2,R2
0124 .dbline 108
0124 ; OSTCBFreeList = &OSTCBTbl[0];
0124 80E0 ldi R24,<_OSTCBTbl
0126 90E0 ldi R25,>_OSTCBTbl
0128 9093E200 sts _OSTCBFreeList+1,R25
012C 8093E100 sts _OSTCBFreeList,R24
0130 .dbline 111
0130 4427 clr R20
0132 5527 clr R21
0134 1AC0 xjmp L21
0136 L18:
0136 .dbline 111
0136 .dbline 112
0136 9A01 movw R18,R20
0138 2F5F subi R18,255 ; offset = 1
013A 3F4F sbci R19,255
013C 08E0 ldi R16,8
013E 10E0 ldi R17,0
0140 0E940000 xcall empy16s
0144 1801 movw R2,R16
0146 80E0 ldi R24,<_OSEventTbl
0148 90E0 ldi R25,>_OSEventTbl
014A 280E add R2,R24
014C 391E adc R3,R25
014E 08E0 ldi R16,8
0150 10E0 ldi R17,0
0152 9A01 movw R18,R20
0154 0E940000 xcall empy16s
0158 F801 movw R30,R16
015A 80E0 ldi R24,<_OSEventTbl
015C 90E0 ldi R25,>_OSEventTbl
015E E80F add R30,R24
0160 F91F adc R31,R25
0162 2082 std z+0,R2
0164 3182 std z+1,R3
0166 .dbline 113
0166 L19:
0166 .dbline 111
0166 4F5F subi R20,255 ; offset = 1
0168 5F4F sbci R21,255
016A L21:
016A .dbline 111
016A ;
016A ; #if OS_MAX_EVENTS >= 2
016A ; for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
016A 4130 cpi R20,1
016C E0E0 ldi R30,0
016E 5E07 cpc R21,R30
0170 10F3 brlo L18
0172 .dbline 114
0172 ; OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
0172 ; }
0172 ; OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
0172 2224 clr R2
0174 3324 clr R3
0176 3092FB00 sts _OSEventTbl+8+1,R3
017A 2092FA00 sts _OSEventTbl+8,R2
017E .dbline 115
017E ; OSEventFreeList = &OSEventTbl[0];
017E 80E0 ldi R24,<_OSEventTbl
0180 90E0 ldi R25,>_OSEventTbl
0182 90930301 sts _OSEventFreeList+1,R25
0186 80930201 sts _OSEventFreeList,R24
018A .dbline 119
018A ; #endif
018A ;
018A ; #if OS_STK_GROWTH == 1
018A ; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
018A 8FE0 ldi R24,15
018C 8A83 std y+2,R24
018E 80E0 ldi R24,<_OSTaskIdleStk+99
0190 90E0 ldi R25,>_OSTaskIdleStk+99
0192 8883 std y+0,R24
0194 9983 std y+1,R25
0196 2227 clr R18
0198 3327 clr R19
019A 00E0 ldi R16,<PL_OSTaskIdle
019C 10E0 ldi R17,>PL_OSTaskIdle
019E 0E940000 xcall _OSTaskCreate
01A2 .dbline -2
01A2 .dbline 124
01A2 ; #else
01A2 ; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
01A2 ; #endif
01A2 ;
01A2 ; }
01A2 L2:
01A2 2396 adiw R28,3
01A4 0E940000 xcall pop_gset1
01A8 .dbline 0 ; func end
01A8 0895 ret
01AA .dbsym r i 20 i
01AA .dbend
01AA .dbfunc e OSIntExit _OSIntExit fV
.even
01AA _OSIntExit::
01AA .dbline -1
01AA .dbline 146
01AA ; /*$PAGE*/
01AA ; /*
01AA ; *********************************************************************************************************
01AA ; * EXIT ISR
01AA ; *
01AA ; * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR. When
01AA ; * the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
01AA ; * a new, high-priority task, is ready to run.
01AA ; *
01AA ; * Arguments : none
01AA ; *
01AA ; * Returns : none
01AA ; *
01AA ; * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
01AA ; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
01AA ; * end of the ISR.
01AA ; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
01AA ; *********************************************************************************************************
01AA ; */
01AA ;
01AA ; void OSIntExit (void)
01AA ; {
01AA .dbline 147
01AA ; OS_ENTER_CRITICAL();
01AA 0A93 st -y,r16
01AC 0FB7 in r16,0x3f
01AE F894 cli
01B0 0F93 push r16
01B2 0991 ld r16,y+
01B4 .dbline 147
01B4 .dbline 148
01B4 ; if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
01B4 8091ED00 lds R24,_OSIntNesting
01B8 8150 subi R24,1
01BA 282E mov R2,R24
01BC 2092ED00 sts _OSIntNesting,R2
01C0 4090EC00 lds R4,_OSLockNesting
01C4 2428 or R2,R4
01C6 09F0 breq X0
01C8 50C0 xjmp L25
01CA X0:
01CA .dbline 148
01CA .dbline 149
01CA ; OSIntExitY = OSUnMapTbl[OSRdyGrp];
01CA 80E0 ldi R24,<_OSUnMapTbl
01CC 90E0 ldi R25,>_OSUnMapTbl
01CE E091E900 lds R30,_OSRdyGrp
01D2 FF27 clr R31
01D4 E80F add R30,R24
01D6 F91F adc R31,R25
01D8 E491 lpm R30,Z
01DA E093B800 sts _OSIntExitY,R30
01DE .dbline 150
01DE ; OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
01DE 80E0 ldi R24,<_OSRdyTbl
01E0 90E0 ldi R25,>_OSRdyTbl
01E2 FF27 clr R31
01E4 E80F add R30,R24
01E6 F91F adc R31,R25
01E8 E081 ldd R30,z+0
01EA FF27 clr R31
01EC 80E0 ldi R24,<_OSUnMapTbl
01EE 90E0 ldi R25,>_OSUnMapTbl
01F0 E80F add R30,R24
01F2 F91F adc R31,R25
01F4 2490 lpm R2,Z
01F6 3324 clr R3
01F8 4090B800 lds R4,_OSIntExitY
01FC 5524 clr R5
01FE 440C lsl R4
0200 551C rol R5
0202 440C lsl R4
0204 551C rol R5
0206 440C lsl R4
0208 551C rol R5
020A 420C add R4,R2
020C 531C adc R5,R3
020E 4092EA00 sts _OSPrioHighRdy,R4
0212 .dbline 151
0212 ; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0212 2090EB00 lds R2,_OSPrioCur
0216 4214 cp R4,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -