os_core.lis
来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 1,342 行 · 第 1/5 页
LIS
1,342 行
0050 .dbline 326
0050 .dbline 327
0050 ; OSIntNesting--;
0050 832D mov R24,R3
0052 8150 subi R24,1
0054 8093A501 sts _OSIntNesting,R24
0058 .dbline 328
0058 ; }
0058 L10:
0058 .dbline 329
0058 ; if (OSIntNesting == 0) { /* Reschedule only if all ISRs complete ... */
0058 2090A501 lds R2,_OSIntNesting
005C 2220 tst R2
005E 99F5 brne L12
0060 .dbline 329
0060 .dbline 330
0060 ; if (OSLockNesting == 0) { /* ... and not locked. */
0060 2090A401 lds R2,_OSLockNesting
0064 2220 tst R2
0066 79F5 brne L14
0068 .dbline 330
0068 .dbline 331
0068 ; OS_SchedNew();
0068 43D3 xcall _OS_SchedNew
006A .dbline 332
006A ; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
006A 2090A301 lds R2,_OSPrioCur
006E 3090A201 lds R3,_OSPrioHighRdy
0072 3214 cp R3,R2
0074 41F1 breq L16
0076 .dbline 332
0076 .dbline 333
0076 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0076 232C mov R2,R3
0078 82E0 ldi R24,2
007A 829D mul R24,R2
007C F001 movw R30,R0
007E 80E0 ldi R24,<_OSTCBPrioTbl
0080 90E0 ldi R25,>_OSTCBPrioTbl
0082 E80F add R30,R24
0084 F91F adc R31,R25
0086 2080 ldd R2,z+0
0088 3180 ldd R3,z+1
008A 30929400 sts _OSTCBHighRdy+1,R3
008E 20929300 sts _OSTCBHighRdy,R2
0092 .dbline 337
0092 ; #if OS_TASK_PROFILE_EN > 0
0092 ; OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
0092 ; #endif
0092 ; OSCtxSwCtr++; /* Keep track of the number of ctx switches */
0092 41E0 ldi R20,1
0094 50E0 ldi R21,0
0096 60E0 ldi R22,0
0098 70E0 ldi R23,0
009A 4090D201 lds R4,_OSCtxSwCtr+2
009E 5090D301 lds R5,_OSCtxSwCtr+2+1
00A2 2090D001 lds R2,_OSCtxSwCtr
00A6 3090D101 lds R3,_OSCtxSwCtr+1
00AA 240E add R2,R20
00AC 351E adc R3,R21
00AE 461E adc R4,R22
00B0 571E adc R5,R23
00B2 3092D101 sts _OSCtxSwCtr+1,R3
00B6 2092D001 sts _OSCtxSwCtr,R2
00BA 5092D301 sts _OSCtxSwCtr+2+1,R5
00BE 4092D201 sts _OSCtxSwCtr+2,R4
00C2 .dbline 338
00C2 ; OSIntCtxSw(); /* Perform interrupt level ctx switch */
00C2 0E940000 xcall _OSIntCtxSw
00C6 .dbline 339
00C6 ; }
00C6 L16:
00C6 .dbline 340
00C6 ; }
00C6 L14:
00C6 .dbline 341
00C6 ; }
00C6 L12:
00C6 .dbline 342
00C6 0A2D mov R16,R10
00C8 0E940000 xcall _OS_CPU_SR_Restore
00CC .dbline 343
00CC L8:
00CC .dbline -2
00CC L7:
00CC 0E940000 xcall pop_gset3
00D0 .dbline 0 ; func end
00D0 0895 ret
00D2 .dbsym r cpu_sr 10 c
00D2 .dbend
00D2 .dbfunc e OSSchedLock _OSSchedLock fV
00D2 ; cpu_sr -> R20
.even
00D2 _OSSchedLock::
00D2 0E940000 xcall push_gset1
00D6 .dbline -1
00D6 .dbline 364
00D6 ; OS_EXIT_CRITICAL();
00D6 ; }
00D6 ; }
00D6 ; /*$PAGE*/
00D6 ; /*
00D6 ; *********************************************************************************************************
00D6 ; * PREVENT SCHEDULING
00D6 ; *
00D6 ; * Description: This function is used to prevent rescheduling to take place. This allows your application
00D6 ; * to prevent context switches until you are ready to permit context switching.
00D6 ; *
00D6 ; * Arguments : none
00D6 ; *
00D6 ; * Returns : none
00D6 ; *
00D6 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
00D6 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
00D6 ; *********************************************************************************************************
00D6 ; */
00D6 ;
00D6 ; #if OS_SCHED_LOCK_EN > 0
00D6 ; void OSSchedLock (void)
00D6 ; {
00D6 .dbline 366
00D6 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
00D6 ; OS_CPU_SR cpu_sr = 0;
00D6 4427 clr R20
00D8 .dbline 371
00D8 ; #endif
00D8 ;
00D8 ;
00D8 ;
00D8 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
00D8 80919E01 lds R24,_OSRunning
00DC 8130 cpi R24,1
00DE 69F4 brne L19
00E0 .dbline 371
00E0 .dbline 372
00E0 ; OS_ENTER_CRITICAL();
00E0 0E940000 xcall _OS_CPU_SR_Save
00E4 402F mov R20,R16
00E6 .dbline 373
00E6 ; if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
00E6 8091A401 lds R24,_OSLockNesting
00EA 8F3F cpi R24,255
00EC 18F4 brsh L21
00EE .dbline 373
00EE .dbline 374
00EE ; OSLockNesting++; /* Increment lock nesting level */
00EE 8F5F subi R24,255 ; addi 1
00F0 8093A401 sts _OSLockNesting,R24
00F4 .dbline 375
00F4 ; }
00F4 L21:
00F4 .dbline 376
00F4 042F mov R16,R20
00F6 0E940000 xcall _OS_CPU_SR_Restore
00FA .dbline 377
00FA L19:
00FA .dbline -2
00FA L18:
00FA 0E940000 xcall pop_gset1
00FE .dbline 0 ; func end
00FE 0895 ret
0100 .dbsym r cpu_sr 20 c
0100 .dbend
0100 .dbfunc e OSSchedUnlock _OSSchedUnlock fV
0100 ; cpu_sr -> R20
.even
0100 _OSSchedUnlock::
0100 0E940000 xcall push_gset1
0104 .dbline -1
0104 .dbline 399
0104 ; OS_EXIT_CRITICAL();
0104 ; }
0104 ; }
0104 ; #endif
0104 ;
0104 ; /*$PAGE*/
0104 ; /*
0104 ; *********************************************************************************************************
0104 ; * ENABLE SCHEDULING
0104 ; *
0104 ; * Description: This function is used to re-allow rescheduling.
0104 ; *
0104 ; * Arguments : none
0104 ; *
0104 ; * Returns : none
0104 ; *
0104 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
0104 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
0104 ; *********************************************************************************************************
0104 ; */
0104 ;
0104 ; #if OS_SCHED_LOCK_EN > 0
0104 ; void OSSchedUnlock (void)
0104 ; {
0104 .dbline 401
0104 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0104 ; OS_CPU_SR cpu_sr = 0;
0104 4427 clr R20
0106 .dbline 406
0106 ; #endif
0106 ;
0106 ;
0106 ;
0106 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
0106 80919E01 lds R24,_OSRunning
010A 8130 cpi R24,1
010C 09F5 brne L24
010E .dbline 406
010E .dbline 407
010E ; OS_ENTER_CRITICAL();
010E 0E940000 xcall _OS_CPU_SR_Save
0112 402F mov R20,R16
0114 .dbline 408
0114 ; if (OSLockNesting > 0) { /* Do not decrement if already 0 */
0114 2224 clr R2
0116 3090A401 lds R3,_OSLockNesting
011A 2314 cp R2,R3
011C B0F4 brsh L26
011E .dbline 408
011E .dbline 409
011E ; OSLockNesting--; /* Decrement lock nesting level */
011E 832D mov R24,R3
0120 8150 subi R24,1
0122 8093A401 sts _OSLockNesting,R24
0126 .dbline 410
0126 ; if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
0126 8823 tst R24
0128 61F4 brne L28
012A .dbline 410
012A .dbline 411
012A ; if (OSIntNesting == 0) { /* ... not in an ISR */
012A 2090A501 lds R2,_OSIntNesting
012E 2220 tst R2
0130 21F4 brne L30
0132 .dbline 411
0132 .dbline 412
0132 ; OS_EXIT_CRITICAL();
0132 0E940000 xcall _OS_CPU_SR_Restore
0136 .dbline 413
0136 ; OS_Sched(); /* See if a HPT is ready */
0136 99D2 xcall _OS_Sched
0138 .dbline 414
0138 0BC0 xjmp L27
013A L30:
013A .dbline 414
013A ; } else {
013A .dbline 415
013A ; OS_EXIT_CRITICAL();
013A 042F mov R16,R20
013C 0E940000 xcall _OS_CPU_SR_Restore
0140 .dbline 416
0140 ; }
0140 .dbline 417
0140 07C0 xjmp L27
0142 L28:
0142 .dbline 417
0142 ; } else {
0142 .dbline 418
0142 ; OS_EXIT_CRITICAL();
0142 042F mov R16,R20
0144 0E940000 xcall _OS_CPU_SR_Restore
0148 .dbline 419
0148 ; }
0148 .dbline 420
0148 03C0 xjmp L27
014A L26:
014A .dbline 420
014A ; } else {
014A .dbline 421
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?