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

📄 ucosii.lst

📁 ucos如何移植到单片机mega128
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0214)         *err                 = OS_NO_ERR;
    021D 01F9      MOVW	R30,R18
    021E 8220      STD	Z+0,R2
(0215)     } else {
    021F C007      RJMP	0x0227
(0216)         OS_EXIT_CRITICAL();
    0220 930A      ST	R16,-Y
    0221 910F      POP	R16
    0222 BF0F      OUT	0x3F,R16
    0223 9109      LD	R16,Y+
(0217)         *err                 = OS_FLAG_GRP_DEPLETED;
    0224 E98A      LDI	R24,0x9A
    0225 01F9      MOVW	R30,R18
    0226 8380      STD	Z+0,R24
(0218)     }
(0219)     return (pgrp);                                  /* Return pointer to event flag group              */
    0227 018A      MOVW	R16,R20
    0228 940E0DE5  CALL	pop_gset1
    022A 9508      RET
_OSFlagDel:
  tasks_waiting        --> R10
  pnode                --> R12
  err                  --> R22
  opt                  --> R12
  pgrp                 --> R20
    022B 940E0DDC  CALL	push_gset4
    022D 2EC2      MOV	R12,R18
    022E 01A8      MOVW	R20,R16
    022F 8568      LDD	R22,Y+8
    0230 8579      LDD	R23,Y+9
(0220) }
(0221) 
(0222) /*$PAGE*/
(0223) /*
(0224) *********************************************************************************************************
(0225) *                                     DELETE AN EVENT FLAG GROUP
(0226) *
(0227) * Description: This function deletes an event flag group and readies all tasks pending on the event flag
(0228) *              group.
(0229) *
(0230) * Arguments  : pgrp          is a pointer to the desired event flag group.
(0231) *
(0232) *              opt           determines delete options as follows:
(0233) *                            opt == OS_DEL_NO_PEND   Deletes the event flag group ONLY if no task pending
(0234) *                            opt == OS_DEL_ALWAYS    Deletes the event flag group even if tasks are
(0235) *                                                    waiting.  In this case, all the tasks pending will be
(0236) *                                                    readied.
(0237) *
(0238) *              err           is a pointer to an error code that can contain one of the following values:
(0239) *                            OS_NO_ERR               The call was successful and the event flag group was
(0240) *                                                    deleted
(0241) *                            OS_ERR_DEL_ISR          If you attempted to delete the event flag group from
(0242) *                                                    an ISR
(0243) *                            OS_FLAG_INVALID_PGRP    If 'pgrp' is a NULL pointer.
(0244) *                            OS_ERR_EVENT_TYPE       If you didn't pass a pointer to an event flag group
(0245) *                            OS_ERR_INVALID_OPT      An invalid option was specified
(0246) *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on the event flag
(0247) *                                                    group.
(0248) *
(0249) * Returns    : pevent        upon error
(0250) *              (OS_EVENT *)0 if the semaphore was successfully deleted.
(0251) *
(0252) * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect the presence of
(0253) *                 the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
(0254) *              2) This call can potentially disable interrupts for a long time.  The interrupt disable
(0255) *                 time is directly proportional to the number of tasks waiting on the event flag group.
(0256) *********************************************************************************************************
(0257) */
(0258) 
(0259) #if OS_FLAG_DEL_EN > 0
(0260) OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
(0261) {
(0262) #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
(0263)     OS_CPU_SR     cpu_sr;
(0264) #endif
(0265)     BOOLEAN       tasks_waiting;
(0266)     OS_FLAG_NODE *pnode;
(0267) 
(0268) 
(0269)     if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
    0231 2422      CLR	R2
    0232 9030032C  LDS	R3,OSIntNesting
    0234 1423      CP	R2,R3
    0235 F428      BCC	0x023B
(0270)         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
    0236 E88C      LDI	R24,0x8C
    0237 01FB      MOVW	R30,R22
    0238 8380      STD	Z+0,R24
(0271)         return (pgrp);
    0239 018A      MOVW	R16,R20
    023A C080      RJMP	0x02BB
(0272)     }
(0273) #if OS_ARG_CHK_EN > 0
(0274)     if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
    023B 3040      CPI	R20,0
    023C 0745      CPC	R20,R21
    023D F429      BNE	0x0243
(0275)         *err = OS_FLAG_INVALID_PGRP;
    023E E986      LDI	R24,0x96
    023F 01FB      MOVW	R30,R22
    0240 8380      STD	Z+0,R24
(0276)         return (pgrp);
    0241 018A      MOVW	R16,R20
    0242 C078      RJMP	0x02BB
(0277)     }
(0278)     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
    0243 01FA      MOVW	R30,R20
    0244 8180      LDD	R24,Z+0
    0245 3085      CPI	R24,5
    0246 F029      BEQ	0x024C
(0279)         *err = OS_ERR_EVENT_TYPE;
    0247 E081      LDI	R24,1
    0248 01FB      MOVW	R30,R22
    0249 8380      STD	Z+0,R24
(0280)         return (pgrp);
    024A 018A      MOVW	R16,R20
    024B C06F      RJMP	0x02BB
(0281)     }
(0282) #endif
(0283)     OS_ENTER_CRITICAL();
    024C 930A      ST	R16,-Y
    024D B70F      IN	R16,0x3F
    024E 94F8      BCLR	7
    024F 930F      PUSH	R16
    0250 9109      LD	R16,Y+
(0284)     if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
    0251 01FA      MOVW	R30,R20
    0252 8021      LDD	R2,Z+1
    0253 8032      LDD	R3,Z+2
    0254 2022      TST	R2
    0255 F411      BNE	0x0258
    0256 2033      TST	R3
    0257 F019      BEQ	0x025B
(0285)         tasks_waiting = TRUE;                              /* Yes                                      */
    0258 24AA      CLR	R10
    0259 94A3      INC	R10
(0286)     } else {
    025A C001      RJMP	0x025C
(0287)         tasks_waiting = FALSE;                             /* No                                       */
    025B 24AA      CLR	R10
(0288)     }
(0289)     switch (opt) {
    025C 24DD      CLR	R13
    025D 20CC      TST	R12
    025E F411      BNE	0x0261
    025F 20DD      TST	R13
    0260 F031      BEQ	0x0267
    0261 01C6      MOVW	R24,R12
    0262 3081      CPI	R24,1
    0263 E0E0      LDI	R30,0
    0264 079E      CPC	R25,R30
    0265 F119      BEQ	0x0289
    0266 C04C      RJMP	0x02B3
(0290)         case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
(0291)              if (tasks_waiting == FALSE) {
    0267 20AA      TST	R10
    0268 F4B9      BNE	0x0280
(0292)                  pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
    0269 2422      CLR	R2
    026A 01FA      MOVW	R30,R20
    026B 8220      STD	Z+0,R2
(0293)                  pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
    026C 9020032D  LDS	R2,OSFlagFreeList
    026E 9030032E  LDS	R3,OSFlagFreeList+1
    0270 8232      STD	Z+2,R3
    0271 8221      STD	Z+1,R2
(0294)                  OSFlagFreeList       = pgrp;
    0272 9350032E  STS	OSFlagFreeList+1,R21
    0274 9340032D  STS	OSFlagFreeList,R20
(0295)                  OS_EXIT_CRITICAL();
    0276 930A      ST	R16,-Y
    0277 910F      POP	R16
    0278 BF0F      OUT	0x3F,R16
    0279 9109      LD	R16,Y+
(0296)                  *err                 = OS_NO_ERR;
    027A 2422      CLR	R2
    027B 01FB      MOVW	R30,R22
    027C 8220      STD	Z+0,R2
(0297)                  return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */
    027D 2700      CLR	R16
    027E 2711      CLR	R17
    027F C03B      RJMP	0x02BB
(0298)              } else {
(0299)                  OS_EXIT_CRITICAL();
    0280 930A      ST	R16,-Y
    0281 910F      POP	R16
    0282 BF0F      OUT	0x3F,R16
    0283 9109      LD	R16,Y+
(0300)                  *err                 = OS_ERR_TASK_WAITING;
    0284 E088      LDI	R24,0x8
    0285 01FB      MOVW	R30,R22
    0286 8380      STD	Z+0,R24
(0301)                  return (pgrp);
    0287 018A      MOVW	R16,R20
    0288 C032      RJMP	0x02BB
(0302)              }
(0303) 
(0304)         case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
(0305)              pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
    0289 01FA      MOVW	R30,R20
    028A 80C1      LDD	R12,Z+1
    028B 80D2      LDD	R13,Z+2
    028C C006      RJMP	0x0293
(0306)              while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
(0307)                  OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
    028D 2722      CLR	R18
    028E 0186      MOVW	R16,R12
    028F D31E      RCALL	_OS_FlagTaskRdy
(0308)                  pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
    0290 01F6      MOVW	R30,R12
    0291 80C0      LDD	R12,Z+0
    0292 80D1      LDD	R13,Z+1
    0293 20CC      TST	R12
    0294 F7C1      BNE	0x028D
    0295 20DD      TST	R13
    0296 F7B1      BNE	0x028D
(0309)              }
(0310)              pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
    0297 2422      CLR	R2
    0298 01FA      MOVW	R30,R20
    0299 8220      STD	Z+0,R2
(0311)              pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
    029A 9020032D  LDS	R2,OSFlagFreeList
    029C 9030032E  LDS	R3,OSFlagFreeList+1
    029E 8232      STD	Z+2,R3
    029F 8221      STD	Z+1,R2
(0312)              OSFlagFreeList       = pgrp;
    02A0 9350032E  STS	OSFlagFreeList+1,R21
    02A2 9340032D  STS	OSFlagFreeList,R20
(0313)              OS_EXIT_CRITICAL();
    02A4 930A      ST	R16,-Y
    02A5 910F      POP	R16
    02A6 BF0F      OUT	0x3F,R16
    02A7 9109      LD	R16,Y+
(0314)              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
    02A8 2D8A      MOV	R24,R10
    02A9 3081      CPI	R24,1
    02AA F411      BNE	0x02AD
(0315)                  OS_Sched();                               /* Find highest priority task ready to run  */
    02AB 940E0A51  CALL	_OS_Sched
(0316)              }
(0317)              *err = OS_NO_ERR;
    02AD 2422      CLR	R2
    02AE 01FB      MOVW	R30,R22
    02AF 8220      STD	Z+0,R2
(0318)              return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been deleted        */
    02B0 2700      CLR	R16
    02B1 2711      CLR	R17
    02B2 C008      RJMP	0x02BB
(0319) 
(0320)         default:
(0321)              OS_EXIT_CRITICAL();
    02B3 930A      ST	R16,-Y
    02B4 910F      POP	R16
    02B5 BF0F      OUT	0x3F,R16
    02B6 9109      LD	R16,Y+
(0322)              *err = OS_ERR_INVALID_OPT;
    02B7 E087      LDI	R24,7
    02B8 01FB      MOVW	R30,R22
    02B9 8380      STD	Z+0,R24
(0323)              return (pgrp);
    02BA 018A      MOVW	R16,R20
    02BB 940E0DD4  CALL	pop_gset4
    02BD 9508      RET
_OSFlagPend:
  node                 --> Y+6
  flags_rdy            --> R10
  consume              --> R14
  flags_cur            --> R20
  err                  --> R22
  timeout              --> Y+30
  wait_type            --> R12
  flags                --> Y+26
  pgrp                 --> R6
    02BE 933A      ST	R19,-Y
    02BF 932A      ST	R18,-Y
    02C0 940E0DDA  CALL	push_gset5
    02C2 0138      MOVW	R6,R16
    02C3 9760      SBIW	R28,0x10
    02C4 8CCC      LDD	R12,Y+28
    02C5 A168      LDD	R22,Y+32
    02C6 A179      LDD	R23,Y+33
(0324)     }
(0325) }
(0326) #endif
(0327) /*$PAGE*/
(0328) /*
(0329) *********************************************************************************************************
(0330) *                                        WAIT ON AN EVENT FLAG GROUP
(0331) *
(0332) * Description: This function is called to wait for a combination of bits to be set in an event flag
(0333) *              group.  Your application can wait for ANY bit to be set or ALL bits to be set.
(0334) *
(0335) * Arguments  : pgrp          is a pointer to the desired event flag group.
(0336) *
(0337) *              flags         Is a bit pattern indicating which bit(s) (i.e. flags) you wish to wait for.
(0338) *                            The bits you want are specified by setting the corresponding bits in
(0339) *                            'flags'.  e.g. if your application wants to wait for bits 0 and 1 then
(0340) *                            'flags' would contain 0x03.
(0341) *
(0342) *              wait_type     specifies whether you want ALL bits to be set or ANY of the bits to be set.
(0343) *                            You can specify the following argument:
(0344) *
(0345) *                            OS_FLAG_WAIT_CLR_ALL   You will wait for ALL bits in 'mask' to be clear (0)
(0346) *                            OS_FLAG_WAIT_SET_ALL   You will wait for ALL bits in 'mask' to be set   (1)
(0347) *                            OS_FLAG_WAIT_CLR_ANY   You will wait for ANY bit  in 'mask' to be clear (0)
(0348) *                            OS_FLAG_WAIT_SET_ANY   You will wait for ANY bit  in 'mask' to be set   (1)
(0349) *
(0350) *                            NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
(0351) *                                  the call.  Example, to wait for any flag in a group AND then clear
(0352) *                                  the flags that are present, set 'wait_type' to:
(0353) *
(0354) *                                  OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
(0355) *
(0356) *              timeout       is an optional timeout (in clock ticks) that your task will wait for the

⌨️ 快捷键说明

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