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

📄 ucosii.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -