📄 os_core.lis
字号:
0078 0196 adiw R24,1
007A 5C01 movw R10,R24
007C L6:
007C .dbline 92
007C ; for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
007C C501 movw R24,R10
007E 8230 cpi R24,2
0080 E0E0 ldi R30,0
0082 9E07 cpc R25,R30
0084 88F3 brlo L3
0086 .dbline 96
0086 ; OSRdyTbl[i] = 0;
0086 ; }
0086 ;
0086 ; OSPrioCur = 0;
0086 2224 clr R2
0088 2092EB00 sts _OSPrioCur,R2
008C .dbline 97
008C ; OSPrioHighRdy = 0;
008C 2092EA00 sts _OSPrioHighRdy,R2
0090 .dbline 98
0090 ; OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */
0090 3324 clr R3
0092 3092E000 sts _OSTCBHighRdy+1,R3
0096 2092DF00 sts _OSTCBHighRdy,R2
009A .dbline 99
009A ; OSTCBCur = (OS_TCB *)0;
009A 3092E400 sts _OSTCBCur+1,R3
009E 2092E300 sts _OSTCBCur,R2
00A2 .dbline 100
00A2 ; OSTCBList = (OS_TCB *)0;
00A2 3092DE00 sts _OSTCBList+1,R3
00A6 2092DD00 sts _OSTCBList,R2
00AA .dbline 101
00AA AA24 clr R10
00AC BB24 clr R11
00AE 10C0 rjmp L10
00B0 L7:
00B0 .dbline 101
00B0 .dbline 102
00B0 02E0 ldi R16,2
00B2 10E0 ldi R17,0
00B4 9501 movw R18,R10
00B6 00D0 rcall 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 3182 std z+1,R3
00C8 2082 std z+0,R2
00CA .dbline 103
00CA L8:
00CA .dbline 101
00CA C501 movw R24,R10
00CC 0196 adiw R24,1
00CE 5C01 movw R10,R24
00D0 L10:
00D0 .dbline 101
00D0 ; for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
00D0 C501 movw R24,R10
00D2 8031 cpi R24,16
00D4 E0E0 ldi R30,0
00D6 9E07 cpc R25,R30
00D8 58F3 brlo L7
00DA .dbline 104
00DA AA24 clr R10
00DC BB24 clr R11
00DE 19C0 rjmp L14
00E0 L11:
00E0 .dbline 104
00E0 .dbline 105
00E0 9501 movw R18,R10
00E2 2F5F subi R18,255 ; offset = 1
00E4 3F4F sbci R19,255
00E6 0EE0 ldi R16,14
00E8 10E0 ldi R17,0
00EA 00D0 rcall empy16s
00EC 1801 movw R2,R16
00EE 80E0 ldi R24,<_OSTCBTbl
00F0 90E0 ldi R25,>_OSTCBTbl
00F2 280E add R2,R24
00F4 391E adc R3,R25
00F6 0EE0 ldi R16,14
00F8 10E0 ldi R17,0
00FA 9501 movw R18,R10
00FC 00D0 rcall 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 3182 std z+1,R3
010A 2082 std z+0,R2
010C .dbline 106
010C L12:
010C .dbline 104
010C C501 movw R24,R10
010E 0196 adiw R24,1
0110 5C01 movw R10,R24
0112 L14:
0112 .dbline 104
0112 ; OSTCBPrioTbl[i] = (OS_TCB *)0;
0112 ; }
0112 ; for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
0112 C501 movw R24,R10
0114 8530 cpi R24,5
0116 E0E0 ldi R30,0
0118 9E07 cpc R25,R30
011A 10F3 brlo L11
011C .dbline 107
011C ; OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
011C ; }
011C ; OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
011C 2224 clr R2
011E 3324 clr R3
0120 30924900 sts _OSTCBTbl+70+2+1,R3
0124 20924800 sts _OSTCBTbl+70+2,R2
0128 .dbline 108
0128 ; OSTCBFreeList = &OSTCBTbl[0];
0128 80E0 ldi R24,<_OSTCBTbl
012A 90E0 ldi R25,>_OSTCBTbl
012C 9093E200 sts _OSTCBFreeList+1,R25
0130 8093E100 sts _OSTCBFreeList,R24
0134 .dbline 111
0134 AA24 clr R10
0136 BB24 clr R11
0138 19C0 rjmp L21
013A L18:
013A .dbline 111
013A .dbline 112
013A 9501 movw R18,R10
013C 2F5F subi R18,255 ; offset = 1
013E 3F4F sbci R19,255
0140 08E0 ldi R16,8
0142 10E0 ldi R17,0
0144 00D0 rcall empy16s
0146 1801 movw R2,R16
0148 80E0 ldi R24,<_OSEventTbl
014A 90E0 ldi R25,>_OSEventTbl
014C 280E add R2,R24
014E 391E adc R3,R25
0150 08E0 ldi R16,8
0152 10E0 ldi R17,0
0154 9501 movw R18,R10
0156 00D0 rcall 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 3182 std z+1,R3
0164 2082 std z+0,R2
0166 .dbline 113
0166 L19:
0166 .dbline 111
0166 C501 movw R24,R10
0168 0196 adiw R24,1
016A 5C01 movw R10,R24
016C L21:
016C .dbline 111
016C ;
016C ; #if OS_MAX_EVENTS >= 2
016C ; for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
016C C501 movw R24,R10
016E 8130 cpi R24,1
0170 E0E0 ldi R30,0
0172 9E07 cpc R25,R30
0174 10F3 brlo L18
0176 .dbline 114
0176 ; OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
0176 ; }
0176 ; OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
0176 2224 clr R2
0178 3324 clr R3
017A 3092FB00 sts _OSEventTbl+8+1,R3
017E 2092FA00 sts _OSEventTbl+8,R2
0182 .dbline 115
0182 ; OSEventFreeList = &OSEventTbl[0];
0182 80E0 ldi R24,<_OSEventTbl
0184 90E0 ldi R25,>_OSEventTbl
0186 90930301 sts _OSEventFreeList+1,R25
018A 80930201 sts _OSEventFreeList,R24
018E .dbline 119
018E ; #endif
018E ;
018E ; #if OS_STK_GROWTH == 1
018E ; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
018E 8FE0 ldi R24,15
0190 8A83 std y+2,R24
0192 80E0 ldi R24,<_OSTaskIdleStk+99
0194 90E0 ldi R25,>_OSTaskIdleStk+99
0196 9983 std y+1,R25
0198 8883 std y+0,R24
019A 2227 clr R18
019C 3327 clr R19
019E 00E0 ldi R16,<PL_OSTaskIdle
01A0 10E0 ldi R17,>PL_OSTaskIdle
01A2 00D0 rcall _OSTaskCreate
01A4 .dbline -2
01A4 L2:
01A4 2396 adiw R28,3
01A6 00D0 rcall pop_gset3x
01A8 .dbline 0 ; func end
01A8 0895 ret
01AA .dbsym r i 10 i
01AA .dbend
01AA .dbfunc e OSIntExit _OSIntExit fV
.even
01AA _OSIntExit::
01AA .dbline -1
01AA .dbline 146
01AA ; #else
01AA ; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
01AA ; #endif
01AA ;
01AA ; }
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 4FC0 rjmp 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -