📄 ucosii.lst
字号:
(0031)
(0032) #if OS_TASK_STAT_EN
(0033) static OS_STK OSTaskStatStk[OS_TASK_STAT_STK_SIZE]; /* Statistics task stack */
(0034) #endif
(0035)
(0036) static OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS]; /* Table of TCBs */
(0037)
(0038) /*$PAGE*/
(0039) /*
(0040) *********************************************************************************************************
(0041) * MAPPING TABLE TO MAP BIT POSITION TO BIT MASK
(0042) *
(0043) * Note: Index into table is desired bit position, 0..7
(0044) * Indexed value corresponds to bit mask
(0045) *********************************************************************************************************
(0046) */
(0047) //INT8U const
(0048) INT8U const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
(0049)
(0050) /*
(0051) *********************************************************************************************************
(0052) * PRIORITY RESOLUTION TABLE
(0053) *
(0054) * Note: Index into table is bit pattern to resolve highest priority
(0055) * Indexed value corresponds to highest priority bit position (i.e. 0..7)
(0056) *********************************************************************************************************
(0057) */
(0058) //INT8U const
(0059) INT8U const OSUnMapTbl[] = {
(0060) 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0061) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0062) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0063) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0064) 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0065) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0066) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0067) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0068) 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0069) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0070) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0071) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0072) 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0073) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0074) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0075) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
(0076) };
(0077)
(0078) /*$PAGE*/
(0079) /*
(0080) *********************************************************************************************************
(0081) * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
(0082) *
(0083) * Description: This function is called by other uC/OS-II services and is used to ready a task that was
(0084) * waiting for an event to occur.
(0085) *
(0086) * Arguments : pevent is a pointer to the event control block corresponding to the event.
(0087) *
(0088) * msg is a pointer to a message. This pointer is used by message oriented services
(0089) * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
(0090) * service functions.
(0091) *
(0092) * msk is a mask that is used to clear the status byte of the TCB. For example,
(0093) * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
(0094) *
(0095) * Returns : none
(0096) *
(0097) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0098) *********************************************************************************************************
(0099) */
(0100) #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
(0101) void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
(0102) {
(0103) OS_TCB *ptcb;
(0104) INT8U x;
(0105) INT8U y;
(0106) INT8U bitx;
(0107) INT8U bity;
(0108) INT8U prio;
(0109)
(0110)
(0111) y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
0201 E288 LDI R24,0x28
0202 E090 LDI R25,0
0203 2FE0 MOV R30,R16
0204 2FF1 MOV R31,R17
0205 8420 LDD R2,8+Z
0206 2433 CLR R3
0207 0E28 ADD R2,R24
0208 1E39 ADC R3,R25
0209 2DE2 MOV R30,R2
020A 2DF3 MOV R31,R3
020B 95C8 LPM
020C 2D60 MOV R22,R0
(0112) bity = OSMapTbl[y];
020D E280 LDI R24,0x20
020E E090 LDI R25,0
020F 2E26 MOV R2,R22
0210 2433 CLR R3
0211 0E28 ADD R2,R24
0212 1E39 ADC R3,R25
0213 2DE2 MOV R30,R2
0214 2DF3 MOV R31,R3
0215 95C8 LPM
0216 2CA0 MOV R10,R0
(0113) x = OSUnMapTbl[pevent->OSEventTbl[y]];
0217 2F80 MOV R24,R16
0218 2F91 MOV R25,R17
0219 9602 ADIW R24,2
021A 2FE6 MOV R30,R22
021B 27FF CLR R31
021C 0FE8 ADD R30,R24
021D 1FF9 ADC R31,R25
021E 8020 LDD R2,0+Z
021F 2433 CLR R3
0220 E288 LDI R24,0x28
0221 E090 LDI R25,0
0222 0E28 ADD R2,R24
0223 1E39 ADC R3,R25
0224 2DE2 MOV R30,R2
0225 2DF3 MOV R31,R3
0226 95C8 LPM
0227 2CC0 MOV R12,R0
(0114) bitx = OSMapTbl[x];
0228 E280 LDI R24,0x20
0229 E090 LDI R25,0
022A 2C2C MOV R2,R12
022B 2433 CLR R3
022C 0E28 ADD R2,R24
022D 1E39 ADC R3,R25
022E 2DE2 MOV R30,R2
022F 2DF3 MOV R31,R3
0230 95C8 LPM
0231 2D40 MOV R20,R0
(0115) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
0232 2C2C MOV R2,R12
0233 2433 CLR R3
0234 2EC6 MOV R12,R22
0235 24DD CLR R13
0236 0CCC LSL R12
0237 1CDD ROL R13
0238 0CCC LSL R12
0239 1CDD ROL R13
023A 0CCC LSL R12
023B 1CDD ROL R13
023C 0CC2 ADD R12,R2
023D 1CD3 ADC R13,R3
(0116) if ((pevent->OSEventTbl[y] &= ~bitx) == 0) { /* Remove this task from the waiting list */
023E 2F80 MOV R24,R16
023F 2F91 MOV R25,R17
0240 9602 ADIW R24,2
0241 2E26 MOV R2,R22
0242 2433 CLR R3
0243 0E28 ADD R2,R24
0244 1E39 ADC R3,R25
0245 2E44 MOV R4,R20
0246 9440 COM R4
0247 2DE2 MOV R30,R2
0248 2DF3 MOV R31,R3
0249 8050 LDD R5,0+Z
024A 2054 AND R5,R4
024B 2C45 MOV R4,R5
024C 8240 STD R4,0+Z
024D 2055 TST R5
024E F451 BNE 0x0259
(0117) pevent->OSEventGrp &= ~bity;
024F 2F80 MOV R24,R16
0250 2F91 MOV R25,R17
0251 9608 ADIW R24,0x8
0252 2C4A MOV R4,R10
0253 9440 COM R4
0254 2FE8 MOV R30,R24
0255 2FF9 MOV R31,R25
0256 8050 LDD R5,0+Z
0257 2054 AND R5,R4
0258 8250 STD R5,0+Z
(0118) }
(0119) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
0259 E185 LDI R24,0x15
025A E091 LDI R25,1
025B 2DEC MOV R30,R12
025C 27FF CLR R31
025D 0FEE LSL R30
025E 1FFF ROL R31
025F 0FE8 ADD R30,R24
0260 1FF9 ADC R31,R25
0261 80C0 LDD R12,0+Z
0262 80D1 LDD R13,1+Z
(0120) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0263 2422 CLR R2
0264 2433 CLR R3
0265 2DEC MOV R30,R12
0266 2DFD MOV R31,R13
0267 8620 STD R2,8+Z
0268 8631 STD R3,9+Z
(0121) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
0269 8226 STD R2,6+Z
026A 8237 STD R3,7+Z
(0122) #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
(0123) ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
(0124) #else
(0125) msg = msg; /* Prevent compiler warning if not used */
(0126) #endif
(0127) ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
026B 2D8C MOV R24,R12
026C 2D9D MOV R25,R13
026D 960A ADIW R24,0xA
026E 8448 LDD R4,8+Y
026F 9440 COM R4
0270 2FE8 MOV R30,R24
0271 2FF9 MOV R31,R25
0272 8050 LDD R5,0+Z
0273 2054 AND R5,R4
0274 8250 STD R5,0+Z
(0128) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
0275 2DEC MOV R30,R12
0276 2DFD MOV R31,R13
0277 8422 LDD R2,10+Z
0278 2022 TST R2
0279 F481 BNE 0x028A
(0129) OSRdyGrp |= bity; /* Put task in the ready to run list */
027A 9020014C LDS R2,_OSRdyGrp
027C 282A OR R2,R10
027D 9220014C STS R2,_OSRdyGrp
(0130) OSRdyTbl[y] |= bitx;
027F E489 LDI R24,0x49
0280 E091 LDI R25,1
0281 2E26 MOV R2,R22
0282 2433 CLR R3
0283 0E28 ADD R2,R24
0284 1E39 ADC R3,R25
0285 2DE2 MOV R30,R2
0286 2DF3 MOV R31,R3
0287 8040 LDD R4,0+Z
0288 2A44 OR R4,R20
0289 8240 STD R4,0+Z
(0131) }
(0132) }
028A DA96 RCALL pop_gset4
028B 9508 RET
(0133) #endif
(0134) /*$PAGE*/
(0135) /*
(0136) *********************************************************************************************************
(0137) * MAKE TASK WAIT FOR EVENT TO OCCUR
(0138) *
(0139) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0140) * not occurred.
(0141) *
(0142) * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
(0143) *
(0144) * Returns : none
(0145) *
(0146) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0147) *********************************************************************************************************
(0148) */
(0149) #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
(0150) void OSEventTaskWait (OS_EVENT *pevent)
(0151) {
(0152) OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
_OSEventTaskWait:
pevent --> R16
028C 91E00145 LDS R30,_OSTCBCur
028E 91F00146 LDS R31,_OSTCBCur+1
0290 8306 STD R16,6+Z
0291 8317 STD R17,7+Z
(0153) if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Task no longer ready */
0292 E489 LDI R24,0x49
0293 E091 LDI R25,1
0294 8425 LDD R2,13+Z
0295 2433 CLR R3
0296 0E28 ADD R2,R24
0297 1E39 ADC R3,R25
0298 8446 LDD R4,14+Z
0299 9440 COM R4
029A 2DE2 MOV R30,R2
029B 2DF3 MOV R31,R3
029C 8050 LDD R5,0+Z
029D 2054 AND R5,R4
029E 2C45 MOV R4,R5
029F 8240 STD R4,0+Z
02A0 2055 TST R5
02A1 F459 BNE 0x02AD
(0154) OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
02A2 91E00145 LDS R30,_OSTCBCur
02A4 91F00146 LDS R31,_OSTCBCur+1
02A6 8427 LDD R2,15+Z
02A7 9420 COM R2
02A8 9030014C LDS R3,_OSRdyGrp
02AA 2032 AND R3,R2
02AB 9230014C STS R3,_OSRdyGrp
(0155) }
(0156) pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
02AD 2F80 MOV R24,R16
02AE 2F91 MOV R25,R17
02AF 9602 ADIW R24,2
02B0 91E00145 LDS R30,_OSTCBCur
02B2 91F00146 LDS R31,_OSTCBCur+1
02B4 8425 LDD R2,13+Z
02B5 2433 CLR R3
02B6 0E28 ADD R2,R24
02B7 1E39 ADC R3,R25
02B8 8446 LDD R4,14+Z
02B9 2DE2 MOV R30,R2
02BA 2DF3 MOV R31,R3
02BB 8050 LDD R5,0+Z
02BC 2854 OR R5,R4
02BD 8250 STD R5,0+Z
(0157) pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
02BE 2F80 MOV R24,R16
02BF 2F91 MOV R25,R17
02C0 9608 ADIW R24,0x8
02C1 91E00145 LDS R30,_OSTCBCur
02C3 91F00146 LDS R31,_OSTCBCur+1
02C5 8447 LDD R4,15+Z
02C6 2FE8 MOV R30,R24
02C7 2FF9 MOV R31,R25
02C8 8050 LDD R5,0+Z
02C9 2854 OR R5,R4
02CA 8250 STD R5,0+Z
(0158) }
02CB 9508 RET
(0159) #endif
(0160) /*$PAGE*/
(0161) /*
(0162) *********************************************************************************************************
(0163) * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
(0164) *
(0165) * Description: This function is called by other uC/OS-II services to make a task ready to run because a
(0166) * timeout occurred.
(0167) *
(0168) * Arguments : pevent is a pointer to the event control block which is readying a task.
(0169) *
(0170) * Returns : none
(0171) *
(0172) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -