⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os-task-switch.lis

📁 ucos-ii-at90S-icc-avr
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0106           ; *              pext          is a pointer to a user supplied memory area that is used to extend the task
 0106           ; *                            control block.  This allows you to store the contents of floating-point
 0106           ; *                            registers, MMU registers or anything else you could find useful during a 
 0106           ; *                            context switch.  You can even assign a name to each task and store this name
 0106           ; *                            in this TCB extension.  A NULL pointer is passed if called by OSTaskCreate().
 0106           ; *
 0106           ; *              opt           options as passed to 'OSTaskCreateExt()' or, 
 0106           ; *                            0 if called from 'OSTaskCreate()'.
 0106           ; *
 0106           ; * Returns    : OS_NO_ERR         if the call was successful
 0106           ; *              OS_NO_MORE_TCB    if there are no more free TCBs to be allocated and thus, the task cannot
 0106           ; *                                be created.
 0106           ; *
 0106           ; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
 0106           ; *********************************************************************************************************
 0106           ; */
 0106           ; 
 0106           ; INT8U OSTCBInit (OS_TCB *ptcb,INT8U prio, OS_STK *ptos, INT16U stk_size)
 0106           ; {
 0106                   .dbline 101
 0106           ; #if OS_STRICT
 0106           ;   if((0==ptcb)||(prio>OS_LOWEST_PRIO)||((INT16U)ptos<OS_HARDWARE_STACK_SIZE+40)||(stk_size<OS_HARDWARE_STACK_SIZE+40))
 0106 4030              cpi R20,0
 0108 4507              cpc R20,R21
 010A 79F0              breq L20
 010C           X1:
 010C 82E0              ldi R24,2
 010E 8617              cp R24,R22
 0110 60F0              brlo L20
 0112 8C81              ldd R24,y+4
 0114 9D81              ldd R25,y+5
 0116 8836              cpi R24,104
 0118 E0E0              ldi R30,0
 011A 9E07              cpc R25,R30
 011C 30F0              brlo L20
 011E 8E81              ldd R24,y+6
 0120 9F81              ldd R25,y+7
 0122 8836              cpi R24,104
 0124 E0E0              ldi R30,0
 0126 9E07              cpc R25,R30
 0128 10F4              brsh L16
 012A           L20:
 012A                   .dbline 102
 012A           ;     OSError(0);
 012A 0027              clr R16
 012C 00D0              rcall _OSError
 012E           L16:
 012E                   .dbline 104
 012E           ; #endif
 012E           ;     OS_ENTER_CRITICAL();
 012E 0A93              st -y,r16
 0130 0FB7               in r16,0x3f
 0132 F894               cli
 0134 0F93               push r16
 0136 0991              ld r16,y+
 0138                   .dbline 104
 0138                   .dbline 105
 0138           ;     if ((OS_TCB *)0!=ptcb) {
 0138 4030              cpi R20,0
 013A 4507              cpc R20,R21
 013C 99F0              breq L21
 013E           X2:
 013E                   .dbline 105
 013E                   .dbline 106
 013E           ;         OS_EXIT_CRITICAL();
 013E 0A93              st -y,r16
 0140 0F91              pop r16
 0142 0FBF              out 0x3F,r16
 0144 0991              ld r16,y+
 0146                   .dbline 106
 0146                   .dbline 107
 0146           ;         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
 0146 E42F              mov R30,R20
 0148 F52F              mov R31,R21
 014A 0C80              ldd R0,y+4
 014C 1D80              ldd R1,y+5
 014E 0082              std z+0,R0
 0150 1182              std z+1,R1
 0152                   .dbline 108
 0152           ;         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
 0152 6583              std z+5,R22
 0154                   .dbline 109
 0154           ;         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
 0154 81E0              ldi R24,1
 0156 8483              std z+4,R24
 0158                   .dbline 110
 0158           ;         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
 0158 2224              clr R2
 015A 3324              clr R3
 015C 2282              std z+2,R2
 015E 3382              std z+3,R3
 0160                   .dbline 112
 0160           ; 
 0160           ;         return (OS_NO_ERR);
 0160 0027              clr R16
 0162 05C0              rjmp L15
 0164           L21:
 0164                   .dbline 113
 0164           ;     } else {
 0164                   .dbline 114
 0164           ;         OS_EXIT_CRITICAL();
 0164 0A93              st -y,r16
 0166 0F91              pop r16
 0168 0FBF              out 0x3F,r16
 016A 0991              ld r16,y+
 016C                   .dbline 114
 016C                   .dbline 115
 016C           ;         return (OSERR_TCB_INVALID);
 016C 02E0              ldi R16,2
 016E                   .dbline -2
 016E           L15:
 016E 00D0              rcall pop_gset2
 0170                   .dbline 0 ; func end
 0170 0895              ret
 0172                   .dbsym l stk_size 6 i
 0172                   .dbsym l ptos 4 pc
 0172                   .dbsym r prio 22 c
 0172                   .dbsym r ptcb 20 pX
 0172                   .dbend
 0172                   .dbfunc e OSSched _OSSched fV
                        .even
 0172           _OSSched::
 0172                   .dbline -1
 0172                   .dbline 137
 0172           ;     }
 0172           ; }
 0172           ; 
 0172           ; /*
 0172           ; *********************************************************************************************************
 0172           ; *                                              SCHEDULER
 0172           ; *
 0172           ; * Description: This function is called by other uC/OS-II services to determine whether a new, high
 0172           ; *              priority task has been made ready to run.  This function is invoked by TASK level code
 0172           ; *              and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
 0172           ; *
 0172           ; * Arguments  : none
 0172           ; *
 0172           ; * Returns    : none
 0172           ; *
 0172           ; * Notes      : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
 0172           ; *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
 0172           ; *********************************************************************************************************
 0172           ; */
 0172           ; 
 0172           ; void OSSched (void)
 0172           ; {
 0172                   .dbline 138
 0172           ;     OS_ENTER_CRITICAL();
 0172 0A93              st -y,r16
 0174 0FB7               in r16,0x3f
 0176 F894               cli
 0178 0F93               push r16
 017A 0991              ld r16,y+
 017C                   .dbline 138
 017C                   .dbline 139
 017C           ;     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
 017C 20909901          lds R2,_OSIntNesting
 0180 30909801          lds R3,_OSLockNesting
 0184 3228              or R3,R2
 0186 21F5              brne L24
 0188                   .dbline 139
 0188                   .dbline 140
 0188           ;         OSPrioHighRdy=OSGetPrioRdy();
 0188 66D0              rcall _OSGetPrioRdy
 018A 00939601          sts _OSPrioHighRdy,R16
 018E                   .dbline 141
 018E           ;               if(OSPrioHighRdy>OS_LOWEST_PRIO)
 018E 82E0              ldi R24,2
 0190 8017              cp R24,R16
 0192 18F4              brsh L26
 0194                   .dbline 142
 0194           ;               {
 0194                   .dbline 144
 0194           ; #if OS_STRICT
 0194           ;                 OSError(0);
 0194 0027              clr R16
 0196 00D0              rcall _OSError
 0198                   .dbline 146
 0198 1BC0              rjmp L27
 019A           L26:
 019A                   .dbline 146
 019A           ; #endif
 019A           ;               }else if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
 019A 20909701          lds R2,_OSPrioCur
 019E 30909601          lds R3,_OSPrioHighRdy
 01A2 3214              cp R3,R2
 01A4 A9F0              breq L28
 01A6                   .dbline 146
 01A6                   .dbline 147
 01A6           ;             OSTCBHighRdy = OSpTCBList[OSPrioHighRdy];
 01A6 80E0              ldi R24,<_OSpTCBList
 01A8 90E0              ldi R25,>_OSpTCBList
 01AA E32D              mov R30,R3
 01AC FF27              clr R31
 01AE EE0F              lsl R30
 01B0 FF1F              rol R31
 01B2 E80F              add R30,R24
 01B4 F91F              adc R31,R25
 01B6 2080              ldd R2,z+0
 01B8 3180              ldd R3,z+1
 01BA 30929301          sts _OSTCBHighRdy+1,R3
 01BE 20929201          sts _OSTCBHighRdy,R2
 01C2                   .dbline 149
 01C2           ; #if OS_STRICT
 01C2           ;                       if(0==OSTCBHighRdy)
 01C2 2220              tst R2
 01C4 21F4              brne L30
 01C6 3320              tst R3
 01C8 11F4              brne L30
 01CA           X3:
 01CA                   .dbline 150
 01CA           ;                         OSError(0);
 01CA 0027              clr R16
 01CC 00D0              rcall _OSError
 01CE           L30:
 01CE                   .dbline 152
 01CE           ; #endif                        
 01CE           ;                       OS_TASK_SW();                        /* Perform a context switch                           */
 01CE 00D0              rcall _OSCtxSw
 01D0                   .dbline 153
 01D0           ;         }//end OSPrioHighRdy != OSPrioCur
 01D0           L28:
 01D0           L27:
 01D0                   .dbline 154
 01D0           ;     }//end nesting==0
 01D0           L24:
 01D0                   .dbline 155
 01D0           ;     OS_EXIT_CRITICAL();
 01D0 0A93              st -y,r16
 01D2 0F91              pop r16
 01D4 0FBF              out 0x3F,r16
 01D6 0991              ld r16,y+
 01D8                   .dbline 155
 01D8                   .dbline -2
 01D8                   .dbline 156
 01D8           ; }
 01D8           L23:
 01D8                   .dbline 0 ; func end
 01D8 0895              ret
 01DA                   .dbend
 01DA                   .dbfunc e OSStart _OSStart fV
                        .even
 01DA           _OSStart::
 01DA                   .dbline -1
 01DA                   .dbline 177
 01DA           ; 
 01DA           ; /*
 01DA           ; *********************************************************************************************************
 01DA           ; *                                          START MULTITASKING
 01DA           ; *
 01DA           ; * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
 01DA           ; *              task that you have created.  Before you can call OSStart(), you MUST have called OSInit()
 01DA           ; *              and you MUST have created at least one task.
 01DA           ; *
 01DA           ; * Arguments  : none
 01DA           ; *
 01DA           ; * Returns    : none
 01DA           ; *
 01DA           ; * Note       : OSStartHighRdy() MUST:
 01DA           ; *                 a) Call OSTaskSwHook() then,
 01DA           ; *                 b) Set OSRunning to TRUE.
 01DA           ; *********************************************************************************************************
 01DA           ; */
 01DA           ; 
 01DA           ; void OSStart (void)
 01DA           ; {
 01DA                   .dbline 178
 01DA           ;     if (OSRunning == FALSE) {
 01DA 2090A001          lds R2,_OSRunning
 01DE 2220              tst R2
 01E0 F9F4              brne L33
 01E2                   .dbline 178
 01E2                   .dbline 179
 01E2           ;         OSPrioHighRdy = 0;
 01E2 2224              clr R2
 01E4 20929601          sts _OSPrioHighRdy,R2
 01E8                   .dbline 180
 01E8           ;         OSPrioCur     = 0;
 01E8 20929701          sts _OSPrioCur,R2
 01EC                   .dbline 181
 01EC           ;         OSTCBHighRdy  = OSpTCBList[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
 01EC 80E0              ldi R24,<_OSpTCBList
 01EE 90E0              ldi R25,>_OSpTCBList
 01F0 E22D              mov R30,R2
 01F2 FF27              clr R31
 01F4 EE0F              lsl R30
 01F6 FF1F              rol R31
 01F8 E80F              add R30,R24
 01FA F91F              adc R31,R25
 01FC 2080              ldd R2,z+0
 01FE 3180              ldd R3,z+1
 0200 30929301          sts _OSTCBHighRdy+1,R3
 0204 20929201          sts _OSTCBHighRdy,R2
 0208                   .dbline 182
 0208           ;         OSTCBCur      = OSTCBHighRdy;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -