?? ucosii.lst
字號(hào):
(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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -