📄 ucos_ii.lis
字号:
003C .dbline 330
003C ; OS_ENTER_CRITICAL();
003C 0E940000 xcall _OS_CPU_SR_Save
0040 A02E mov R10,R16
0042 .dbline 331
0042 ; if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
0042 80E0 ldi R24,0
0044 20904B0A lds R2,_OSIntNesting
0048 8215 cp R24,R2
004A 20F4 brsh L10
004C X3:
004C .dbline 331
004C .dbline 332
004C ; OSIntNesting--;
004C 822D mov R24,R2
004E 8150 subi R24,1
0050 80934B0A sts _OSIntNesting,R24
0054 .dbline 333
0054 ; }
0054 L10:
0054 .dbline 334
0054 ; if (OSIntNesting == 0) { /* Reschedule only if all ISRs complete ... */
0054 20904B0A lds R2,_OSIntNesting
0058 2220 tst R2
005A 09F0 breq X8
005C 6BC0 xjmp L12
005E X8:
005E X4:
005E .dbline 334
005E .dbline 335
005E ; if (OSLockNesting == 0) { /* ... and not locked. */
005E 2090490A lds R2,_OSLockNesting
0062 2220 tst R2
0064 09F0 breq X9
0066 66C0 xjmp L14
0068 X9:
0068 X5:
0068 .dbline 335
0068 .dbline 336
0068 ; OSIntExitY = OSUnMapTbl[OSRdyGrp];
0068 80E0 ldi R24,<_OSUnMapTbl
006A 90E0 ldi R25,>_OSUnMapTbl
006C E091460A lds R30,_OSRdyGrp
0070 FF27 clr R31
0072 E80F add R30,R24
0074 F91F adc R31,R25
0076 2690 elpm R2,Z
0078 20924A0A sts _OSIntExitY,R2
007C .dbline 337
007C ; OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
007C 422C mov R4,R2
007E 80E0 ldi R24,<_OSRdyTbl
0080 90E0 ldi R25,>_OSRdyTbl
0082 E22D mov R30,R2
0084 FF27 clr R31
0086 E80F add R30,R24
0088 F91F adc R31,R25
008A E081 ldd R30,z+0
008C FF27 clr R31
008E 80E0 ldi R24,<_OSUnMapTbl
0090 90E0 ldi R25,>_OSUnMapTbl
0092 E80F add R30,R24
0094 F91F adc R31,R25
0096 2690 elpm R2,Z
0098 3324 clr R3
009A 5524 clr R5
009C 440C lsl R4
009E 551C rol R5
00A0 440C lsl R4
00A2 551C rol R5
00A4 440C lsl R4
00A6 551C rol R5
00A8 420C add R4,R2
00AA 531C adc R5,R3
00AC 4092470A sts _OSPrioHighRdy,R4
00B0 .dbline 338
00B0 ; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
00B0 2090480A lds R2,_OSPrioCur
00B4 342C mov R3,R4
00B6 4214 cp R4,R2
00B8 09F4 brne X10
00BA 3CC0 xjmp L16
00BC X10:
00BC X6:
00BC .dbline 338
00BC .dbline 339
00BC ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
00BC 80E0 ldi R24,<_OSTCBPrioTbl
00BE 90E0 ldi R25,>_OSTCBPrioTbl
00C0 E42D mov R30,R4
00C2 FF27 clr R31
00C4 EE0F lsl R30
00C6 FF1F rol R31
00C8 E80F add R30,R24
00CA F91F adc R31,R25
00CC 2080 ldd R2,z+0
00CE 3180 ldd R3,z+1
00D0 30923309 sts _OSTCBHighRdy+1,R3
00D4 20923209 sts _OSTCBHighRdy,R2
00D8 .dbline 341
00D8 ; #if OS_TASK_PROFILE_EN > 0
00D8 ; OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
00D8 A101 movw R20,R2
00DA 405F subi R20,240 ; offset = 16
00DC 5F4F sbci R21,255
00DE 81E0 ldi R24,1
00E0 90E0 ldi R25,0
00E2 A0E0 ldi R26,0
00E4 B0E0 ldi R27,0
00E6 FA01 movw R30,R20
00E8 2080 ldd R2,z+0
00EA 3180 ldd R3,z+1
00EC 4280 ldd R4,z+2
00EE 5380 ldd R5,z+3
00F0 280E add R2,R24
00F2 391E adc R3,R25
00F4 4A1E adc R4,R26
00F6 5B1E adc R5,R27
00F8 2082 std z+0,R2
00FA 3182 std z+1,R3
00FC 4282 std z+2,R4
00FE 5382 std z+3,R5
0100 .dbline 343
0100 ; #endif
0100 ; OSCtxSwCtr++; /* Keep track of the number of ctx switches */
0100 81E0 ldi R24,1
0102 90E0 ldi R25,0
0104 A0E0 ldi R26,0
0106 B0E0 ldi R27,0
0108 4090960A lds R4,_OSCtxSwCtr+2
010C 5090970A lds R5,_OSCtxSwCtr+2+1
0110 2090940A lds R2,_OSCtxSwCtr
0114 3090950A lds R3,_OSCtxSwCtr+1
0118 280E add R2,R24
011A 391E adc R3,R25
011C 4A1E adc R4,R26
011E 5B1E adc R5,R27
0120 3092950A sts _OSCtxSwCtr+1,R3
0124 2092940A sts _OSCtxSwCtr,R2
0128 5092970A sts _OSCtxSwCtr+2+1,R5
012C 4092960A sts _OSCtxSwCtr+2,R4
0130 .dbline 344
0130 ; OSIntCtxSw(); /* Perform interrupt level ctx switch */
0130 0E940000 xcall _OSIntCtxSw
0134 .dbline 345
0134 ; }
0134 L16:
0134 .dbline 346
0134 ; }
0134 L14:
0134 .dbline 347
0134 ; }
0134 L12:
0134 .dbline 348
0134 ; OS_EXIT_CRITICAL();
0134 0A2D mov R16,R10
0136 0E940000 xcall _OS_CPU_SR_Restore
013A .dbline 349
013A ; }
013A L8:
013A .dbline -2
013A L7:
013A .dbline 0 ; func end
013A 0C940000 xjmp pop_xgset300C
013E .dbsym r cpu_sr 10 c
013E .dbend
013E .dbfunc e OSSchedLock _OSSchedLock fV
013E ; cpu_sr -> R10
.even
013E _OSSchedLock::
013E AA92 st -y,R10
0140 .dbline -1
0140 .dbline 370
0140 ; }
0140 ; /*$PAGE*/
0140 ; /*
0140 ; *********************************************************************************************************
0140 ; * PREVENT SCHEDULING
0140 ; *
0140 ; * Description: This function is used to prevent rescheduling to take place. This allows your application
0140 ; * to prevent context switches until you are ready to permit context switching.
0140 ; *
0140 ; * Arguments : none
0140 ; *
0140 ; * Returns : none
0140 ; *
0140 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
0140 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
0140 ; *********************************************************************************************************
0140 ; */
0140 ;
0140 ; #if OS_SCHED_LOCK_EN > 0
0140 ; void OSSchedLock (void)
0140 ; {
0140 .dbline 376
0140 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0140 ; OS_CPU_SR cpu_sr;
0140 ; #endif
0140 ;
0140 ;
0140 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
0140 80913D0A lds R24,_OSRunning
0144 8130 cpi R24,1
0146 69F4 brne L19
0148 X11:
0148 .dbline 376
0148 .dbline 377
0148 ; OS_ENTER_CRITICAL();
0148 0E940000 xcall _OS_CPU_SR_Save
014C A02E mov R10,R16
014E .dbline 378
014E ; if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
014E 8091490A lds R24,_OSLockNesting
0152 8F3F cpi R24,255
0154 18F4 brsh L21
0156 X12:
0156 .dbline 378
0156 .dbline 379
0156 ; OSLockNesting++; /* Increment lock nesting level */
0156 8F5F subi R24,255 ; addi 1
0158 8093490A sts _OSLockNesting,R24
015C .dbline 380
015C ; }
015C L21:
015C .dbline 381
015C ; OS_EXIT_CRITICAL();
015C 0A2D mov R16,R10
015E 0E940000 xcall _OS_CPU_SR_Restore
0162 .dbline 382
0162 ; }
0162 L19:
0162 .dbline -2
0162 L18:
0162 .dbline 0 ; func end
0162 A990 ld R10,y+
0164 0895 ret
0166 .dbsym r cpu_sr 10 c
0166 .dbend
0166 .dbfunc e OSSchedUnlock _OSSchedUnlock fV
0166 ; cpu_sr -> R10
.even
0166 _OSSchedUnlock::
0166 AA92 st -y,R10
0168 .dbline -1
0168 .dbline 404
0168 ; }
0168 ; #endif
0168 ;
0168 ; /*$PAGE*/
0168 ; /*
0168 ; *********************************************************************************************************
0168 ; * ENABLE SCHEDULING
0168 ; *
0168 ; * Description: This function is used to re-allow rescheduling.
0168 ; *
0168 ; * Arguments : none
0168 ; *
0168 ; * Returns : none
0168 ; *
0168 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
0168 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
0168 ; *********************************************************************************************************
0168 ; */
0168 ;
0168 ; #if OS_SCHED_LOCK_EN > 0
0168 ; void OSSchedUnlock (void)
0168 ; {
0168 .dbline 410
0168 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0168 ; OS_CPU_SR cpu_sr;
0168 ; #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -