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 + -
显示快捷键?