📄 os-task-switch.lis
字号:
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 L21
010C X1:
010C 82E0 ldi R24,2
010E 8617 cp R24,R22
0110 60F0 brlo L21
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 L21
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 L17
012A L21:
012A .dbline 102
012A ; OSError(0);
012A 0027 clr R16
012C 00D0 rcall _OSError
012E L17:
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 L22
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 L16
0164 L22:
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 L16:
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 2090A201 lds R2,_OSIntNesting
0180 3090A101 lds R3,_OSLockNesting
0184 3228 or R3,R2
0186 21F5 brne L25
0188 .dbline 139
0188 .dbline 140
0188 ; OSPrioHighRdy=OSGetPrioRdy();
0188 66D0 rcall _OSGetPrioRdy
018A 00939F01 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 L27
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 L28
019A L27:
019A .dbline 146
019A ; #endif
019A ; }else if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
019A 2090A001 lds R2,_OSPrioCur
019E 30909F01 lds R3,_OSPrioHighRdy
01A2 3214 cp R3,R2
01A4 A9F0 breq L29
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 30929C01 sts _OSTCBHighRdy+1,R3
01BE 20929B01 sts _OSTCBHighRdy,R2
01C2 .dbline 149
01C2 ; #if OS_STRICT
01C2 ; if(0==OSTCBHighRdy)
01C2 2220 tst R2
01C4 21F4 brne L31
01C6 3320 tst R3
01C8 11F4 brne L31
01CA X3:
01CA .dbline 150
01CA ; OSError(0);
01CA 0027 clr R16
01CC 00D0 rcall _OSError
01CE L31:
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 L29:
01D0 L28:
01D0 .dbline 154
01D0 ; }//end nesting==0
01D0 L25:
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 L24:
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 2090A901 lds R2,_OSRunning
01DE 2220 tst R2
01E0 F9F4 brne L34
01E2 .dbline 178
01E2 .dbline 179
01E2 ; OSPrioHighRdy = 0;
01E2 2224 clr R2
01E4 20929F01 sts _OSPrioHighRdy,R2
01E8 .dbline 180
01E8 ; OSPrioCur = 0;
01E8 2092A001 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 30929C01 sts _OSTCBHighRdy+1,R3
0204 20929B01 sts _OSTCBHighRdy,R2
0208 .dbline 182
0208 ; OSTCBCur = OSTCBHighRdy;
0208 30929E01 sts _OSTCBCur+1,R3
020C 20929D01 sts _OSTCBCur,R2
0210 .dbline 184
0210 ; #if OS_STRICT
0210 ; if(0==OSTCBCur)
0210 2220 tst R2
0212 21F4 brne L36
0214 3320 tst R3
0216 11F4 brne L36
0218 X4:
0218 .dbline 185
0218 ; OSError(0);
0218 0027 clr R16
021A 00D0 rcall _OSError
021C L36:
021C .dbline 187
021C ; #endif
021C ; OSStartHighRdy(); /* Execute target specific code to start task */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -