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

📄 ucosii.lst

📁 ucos如何移植到单片机mega128
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0154 8380      STD	Z+0,R24
(0095)         return ((OS_FLAGS)0);
    0155 2700      CLR	R16
    0156 C093      RJMP	0x01EA
(0096)     }
(0097) #endif
(0098)     if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
    0157 FF47      SBRS	R20,7
    0158 C004      RJMP	0x015D
(0099)         wait_type &= ~OS_FLAG_CONSUME;
    0159 774F      ANDI	R20,0x7F
(0100)         consume    = TRUE;
    015A 24CC      CLR	R12
    015B 94C3      INC	R12
(0101)     } else {
    015C C001      RJMP	0x015E
(0102)         consume    = FALSE;
    015D 24CC      CLR	R12
(0103)     }
(0104) /*$PAGE*/
(0105)     *err = OS_NO_ERR;                                      /* Assume NO error until proven otherwise.  */
    015E 2422      CLR	R2
    015F 01FB      MOVW	R30,R22
    0160 8220      STD	Z+0,R2
(0106)     OS_ENTER_CRITICAL();
    0161 930A      ST	R16,-Y
    0162 B70F      IN	R16,0x3F
    0163 94F8      BCLR	7
    0164 930F      PUSH	R16
    0165 9109      LD	R16,Y+
(0107)     switch (wait_type) {
    0166 2755      CLR	R21
    0167 3040      CPI	R20,0
    0168 0745      CPC	R20,R21
    0169 F409      BNE	0x016B
    016A C043      RJMP	0x01AE
    016B 3041      CPI	R20,1
    016C E0E0      LDI	R30,0
    016D 075E      CPC	R21,R30
    016E F409      BNE	0x0170
    016F C058      RJMP	0x01C8
    0170 3042      CPI	R20,2
    0171 E0E0      LDI	R30,0
    0172 075E      CPC	R21,R30
    0173 F029      BEQ	0x0179
    0174 3043      CPI	R20,3
    0175 E0E0      LDI	R30,0
    0176 075E      CPC	R21,R30
    0177 F0E1      BEQ	0x0194
    0178 C068      RJMP	0x01E1
(0108)         case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
(0109)              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
    0179 01F8      MOVW	R30,R16
    017A 80A3      LDD	R10,Z+3
    017B 22A2      AND	R10,R18
(0110)              if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
    017C 16A2      CP	R10,R18
    017D F461      BNE	0x018A
(0111)                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
    017E 2D8C      MOV	R24,R12
    017F 3081      CPI	R24,1
    0180 F461      BNE	0x018D
(0112)                      pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
    0181 01C8      MOVW	R24,R16
    0182 9603      ADIW	R24,3
    0183 2C4A      MOV	R4,R10
    0184 9440      COM	R4
    0185 01FC      MOVW	R30,R24
    0186 8050      LDD	R5,Z+0
    0187 2054      AND	R5,R4
    0188 8250      STD	Z+0,R5
(0113)                  }
(0114)              } else {
    0189 C003      RJMP	0x018D
(0115)                  *err  = OS_FLAG_ERR_NOT_RDY;
    018A E988      LDI	R24,0x98
    018B 01FB      MOVW	R30,R22
    018C 8380      STD	Z+0,R24
(0116)              }
(0117)              flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
    018D 01F8      MOVW	R30,R16
    018E 8143      LDD	R20,Z+3
(0118)              OS_EXIT_CRITICAL();
    018F 930A      ST	R16,-Y
    0190 910F      POP	R16
    0191 BF0F      OUT	0x3F,R16
    0192 9109      LD	R16,Y+
(0119)              break;
    0193 C055      RJMP	0x01E9
(0120) 
(0121)         case OS_FLAG_WAIT_SET_ANY:
(0122)              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
    0194 01F8      MOVW	R30,R16
    0195 80A3      LDD	R10,Z+3
    0196 22A2      AND	R10,R18
(0123)              if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
    0197 F061      BEQ	0x01A4
(0124)                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
    0198 2D8C      MOV	R24,R12
    0199 3081      CPI	R24,1
    019A F461      BNE	0x01A7
(0125)                      pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
    019B 01C8      MOVW	R24,R16
    019C 9603      ADIW	R24,3
    019D 2C4A      MOV	R4,R10
    019E 9440      COM	R4
    019F 01FC      MOVW	R30,R24
    01A0 8050      LDD	R5,Z+0
    01A1 2054      AND	R5,R4
    01A2 8250      STD	Z+0,R5
(0126)                  }
(0127)              } else {
    01A3 C003      RJMP	0x01A7
(0128)                  *err  = OS_FLAG_ERR_NOT_RDY;
    01A4 E988      LDI	R24,0x98
    01A5 01FB      MOVW	R30,R22
    01A6 8380      STD	Z+0,R24
(0129)              }
(0130)              flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
    01A7 01F8      MOVW	R30,R16
    01A8 8143      LDD	R20,Z+3
(0131)              OS_EXIT_CRITICAL();
    01A9 930A      ST	R16,-Y
    01AA 910F      POP	R16
    01AB BF0F      OUT	0x3F,R16
    01AC 9109      LD	R16,Y+
(0132)              break;
    01AD C03B      RJMP	0x01E9
(0133) 
(0134) #if OS_FLAG_WAIT_CLR_EN > 0
(0135)         case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
(0136)              flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
    01AE 01F8      MOVW	R30,R16
    01AF 80A3      LDD	R10,Z+3
    01B0 94A0      COM	R10
    01B1 22A2      AND	R10,R18
(0137)              if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
    01B2 16A2      CP	R10,R18
    01B3 F451      BNE	0x01BE
(0138)                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
    01B4 2D8C      MOV	R24,R12
    01B5 3081      CPI	R24,1
    01B6 F451      BNE	0x01C1
(0139)                      pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
    01B7 01C8      MOVW	R24,R16
    01B8 9603      ADIW	R24,3
    01B9 01FC      MOVW	R30,R24
    01BA 8040      LDD	R4,Z+0
    01BB 284A      OR	R4,R10
    01BC 8240      STD	Z+0,R4
(0140)                  }
(0141)              } else {
    01BD C003      RJMP	0x01C1
(0142)                  *err  = OS_FLAG_ERR_NOT_RDY;
    01BE E988      LDI	R24,0x98
    01BF 01FB      MOVW	R30,R22
    01C0 8380      STD	Z+0,R24
(0143)              }
(0144)              flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
    01C1 01F8      MOVW	R30,R16
    01C2 8143      LDD	R20,Z+3
(0145)              OS_EXIT_CRITICAL();
    01C3 930A      ST	R16,-Y
    01C4 910F      POP	R16
    01C5 BF0F      OUT	0x3F,R16
    01C6 9109      LD	R16,Y+
(0146)              break;
    01C7 C021      RJMP	0x01E9
(0147) 
(0148)         case OS_FLAG_WAIT_CLR_ANY:
(0149)              flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
    01C8 01F8      MOVW	R30,R16
    01C9 80A3      LDD	R10,Z+3
    01CA 94A0      COM	R10
    01CB 22A2      AND	R10,R18
(0150)              if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
    01CC F051      BEQ	0x01D7
(0151)                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
    01CD 2D8C      MOV	R24,R12
    01CE 3081      CPI	R24,1
    01CF F451      BNE	0x01DA
(0152)                      pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
    01D0 01C8      MOVW	R24,R16
    01D1 9603      ADIW	R24,3
    01D2 01FC      MOVW	R30,R24
    01D3 8040      LDD	R4,Z+0
    01D4 284A      OR	R4,R10
    01D5 8240      STD	Z+0,R4
(0153)                  }
(0154)              } else {
    01D6 C003      RJMP	0x01DA
(0155)                  *err  = OS_FLAG_ERR_NOT_RDY;
    01D7 E988      LDI	R24,0x98
    01D8 01FB      MOVW	R30,R22
    01D9 8380      STD	Z+0,R24
(0156)              }
(0157)              flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
    01DA 01F8      MOVW	R30,R16
    01DB 8143      LDD	R20,Z+3
(0158)              OS_EXIT_CRITICAL();
    01DC 930A      ST	R16,-Y
    01DD 910F      POP	R16
    01DE BF0F      OUT	0x3F,R16
    01DF 9109      LD	R16,Y+
(0159)              break;
    01E0 C008      RJMP	0x01E9
(0160) #endif
(0161) 
(0162)         default:
(0163)              OS_EXIT_CRITICAL();
    01E1 930A      ST	R16,-Y
    01E2 910F      POP	R16
    01E3 BF0F      OUT	0x3F,R16
    01E4 9109      LD	R16,Y+
(0164)              flags_cur = (OS_FLAGS)0;
    01E5 2744      CLR	R20
(0165)              *err      = OS_FLAG_ERR_WAIT_TYPE;
    01E6 E987      LDI	R24,0x97
    01E7 01FB      MOVW	R30,R22
    01E8 8380      STD	Z+0,R24
(0166)              break;
(0167)     }
(0168)     return (flags_cur);
    01E9 2F04      MOV	R16,R20
    01EA 940E0DD4  CALL	pop_gset4
    01EC 9508      RET
_OSFlagCreate:
  pgrp                 --> R20
  err                  --> R18
  flags                --> R16
    01ED 940E0DE2  CALL	push_gset1
(0169) }
(0170) #endif
(0171) 
(0172) /*$PAGE*/
(0173) /*
(0174) *********************************************************************************************************
(0175) *                                           CREATE AN EVENT FLAG
(0176) *
(0177) * Description: This function is called to create an event flag group.
(0178) *
(0179) * Arguments  : flags         Contains the initial value to store in the event flag group.
(0180) *
(0181) *              err           is a pointer to an error code which will be returned to your application:
(0182) *                               OS_NO_ERR                if the call was successful.
(0183) *                               OS_ERR_CREATE_ISR        if you attempted to create an Event Flag from an
(0184) *                                                        ISR.
(0185) *                               OS_FLAG_GRP_DEPLETED     if there are no more event flag groups
(0186) *
(0187) * Returns    : A pointer to an event flag group or a NULL pointer if no more groups are available.
(0188) *
(0189) * Called from: Task ONLY
(0190) *********************************************************************************************************
(0191) */
(0192) 
(0193) OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err)
(0194) {
(0195) #if OS_CRITICAL_METHOD == 3                         /* Allocate storage for CPU status register        */
(0196)     OS_CPU_SR    cpu_sr;
(0197) #endif
(0198)     OS_FLAG_GRP *pgrp;
(0199) 
(0200) 
(0201)     if (OSIntNesting > 0) {                         /* See if called from ISR ...                      */
    01EF 2422      CLR	R2
    01F0 9030032C  LDS	R3,OSIntNesting
    01F2 1423      CP	R2,R3
    01F3 F430      BCC	0x01FA
(0202)         *err = OS_ERR_CREATE_ISR;                   /* ... can't CREATE from an ISR                    */
    01F4 E88D      LDI	R24,0x8D
    01F5 01F9      MOVW	R30,R18
    01F6 8380      STD	Z+0,R24
(0203)         return ((OS_FLAG_GRP *)0);
    01F7 2700      CLR	R16
    01F8 2711      CLR	R17
    01F9 C02E      RJMP	0x0228
(0204)     }
(0205)     OS_ENTER_CRITICAL();
    01FA 930A      ST	R16,-Y
    01FB B70F      IN	R16,0x3F
    01FC 94F8      BCLR	7
    01FD 930F      PUSH	R16
    01FE 9109      LD	R16,Y+
(0206)     pgrp = OSFlagFreeList;                          /* Get next free event flag                        */
    01FF 9140032D  LDS	R20,OSFlagFreeList
    0201 9150032E  LDS	R21,OSFlagFreeList+1
(0207)     if (pgrp != (OS_FLAG_GRP *)0) {                 /* See if we have event flag groups available      */
    0203 3040      CPI	R20,0
    0204 0745      CPC	R20,R21
    0205 F0D1      BEQ	0x0220
(0208)                                                     /* Adjust free list                                */
(0209)         OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
    0206 91E0032D  LDS	R30,OSFlagFreeList
    0208 91F0032E  LDS	R31,OSFlagFreeList+1
    020A 8021      LDD	R2,Z+1
    020B 8032      LDD	R3,Z+2
    020C 9230032E  STS	OSFlagFreeList+1,R3
    020E 9220032D  STS	OSFlagFreeList,R2
(0210)         pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
    0210 E085      LDI	R24,5
    0211 01FA      MOVW	R30,R20
    0212 8380      STD	Z+0,R24
(0211)         pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
    0213 8303      STD	Z+3,R16
(0212)         pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
    0214 2422      CLR	R2
    0215 2433      CLR	R3
    0216 01FA      MOVW	R30,R20
    0217 8232      STD	Z+2,R3
    0218 8221      STD	Z+1,R2
(0213)         OS_EXIT_CRITICAL();
    0219 930A      ST	R16,-Y
    021A 910F      POP	R16
    021B BF0F      OUT	0x3F,R16
    021C 9109      LD	R16,Y+

⌨️ 快捷键说明

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