📄 os_flag.lst
字号:
374 *********************************************************************************************************
375 */
376
377 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
378 {
\ 01F2 0A12 PUSH R10
\ 01F4 0B12 PUSH R11
\ 01F6 0812 PUSH R8
\ 01F8 0912 PUSH R9
\ 01FA 31800C00 SUB #12,SP
\ 01FE 0B4C MOV R12,R11
\ 0200 1C411800 MOV 24(SP),R12
\ 0204 5A411600 MOV.B 22(SP),R10
\ 0208 18411A00 MOV 26(SP),R8
379 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
380 OS_CPU_SR cpu_sr;
381 #endif
382 OS_FLAG_NODE node;
383 OS_FLAGS flags_cur;
384 OS_FLAGS flags_rdy;
385 BOOLEAN consume;
386
387
388 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 020C C2930000 CMP.B #0,&OSIntNesting
\ 0210 0424 JEQ (?0120)
389 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 0212 E8430000 MOV.B #2,0(R8)
390 return ((OS_FLAGS)0);
\ 0216 0C43 MOV #0,R12
391 }
\ 0218 CD3C JMP (?0152)
\ 021A ?0120:
392 #if OS_ARG_CHK_EN > 0
393 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
\ 021A 0B93 CMP #0,R11
\ 021C 0520 JNE (?0122)
394 *err = OS_FLAG_INVALID_PGRP;
\ 021E F8409600 MOV.B #150,0(R8)
\ 0222 0000
395 return ((OS_FLAGS)0);
\ 0224 0C43 MOV #0,R12
396 }
\ 0226 C63C JMP (?0152)
\ 0228 ?0122:
397 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
\ 0228 7D400500 MOV.B #5,R13
\ 022C 6D9B CMP.B @R11,R13
\ 022E 0424 JEQ (?0124)
398 *err = OS_ERR_EVENT_TYPE;
\ 0230 D8430000 MOV.B #1,0(R8)
399 return ((OS_FLAGS)0);
\ 0234 0C43 MOV #0,R12
400 }
\ 0236 BE3C JMP (?0152)
\ 0238 ?0124:
401 #endif
402 if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
\ 0238 7AB08000 BIT.B #128,R10
\ 023C 0424 JEQ (?0126)
403 wait_type &= ~OS_FLAG_CONSUME;
\ 023E 7AF07F00 AND.B #127,R10
404 consume = TRUE;
\ 0242 5943 MOV.B #1,R9
405 } else {
\ 0244 013C JMP (?0127)
\ 0246 ?0126:
406 consume = FALSE;
\ 0246 4943 MOV.B #0,R9
\ 0248 ?0127:
407 }
408 /*$PAGE*/
409 OS_ENTER_CRITICAL();
\ 0248 32C2 DINT
410 switch (wait_type) {
\ 024A 4D4A MOV.B R10,R13
\ 024C 2D92 CMP #4,R13
\ 024E 792C JC (?0149)
\ 0250 0D5D ADD R13,R13
\ 0252 104D5602 BR ?0218(R13)
\ 0256 ?0218:
\ 0256 D002 DW ?0139
\ 0258 0A03 DW ?0144
\ 025A 5E02 DW ?0129
\ 025C 9802 DW ?0134
\ 025E ?0129:
411 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
412 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 025E 1D4B0400 MOV 4(R11),R13
\ 0262 0DFE AND R14,R13
413 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
\ 0264 0E9D CMP R13,R14
\ 0266 0B20 JNE (?0131)
414 if (consume == TRUE) { /* See if we need to consume the flags */
\ 0268 5993 CMP.B #1,R9
\ 026A 0320 JNE (?0133)
415 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
\ 026C 3DE3 XOR #-1,R13
\ 026E 8BFD0400 AND R13,4(R11)
\ 0272 ?0133:
416 }
417 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 0272 1C4B0400 MOV 4(R11),R12
418 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
\ 0276 32D2 EINT
419 *err = OS_NO_ERR;
\ 0278 C8430000 MOV.B #0,0(R8)
420 return (flags_cur);
421 } else { /* Block task until events occur or timeout */
\ 027C 9B3C JMP (?0152)
\ 027E ?0131:
422 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
\ 027E 0C12 PUSH R12
\ 0280 4A12 PUSH.B R10
\ 0282 0E12 PUSH R14
\ 0284 0E41 MOV SP,R14
\ 0286 3E500600 ADD #6,R14
\ 028A 0C4B MOV R11,R12
\ 028C B012F204 CALL #OS_FlagBlock
\ 0290 31500600 ADD #6,SP
423 OS_EXIT_CRITICAL();
\ 0294 32D2 EINT
424 }
425 break;
\ 0296 5B3C JMP (?0128)
\ 0298 ?0134:
426
427 case OS_FLAG_WAIT_SET_ANY:
428 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 0298 1D4B0400 MOV 4(R11),R13
\ 029C 0DFE AND R14,R13
429 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
\ 029E 0B24 JEQ (?0136)
430 if (consume == TRUE) { /* See if we need to consume the flags */
\ 02A0 5993 CMP.B #1,R9
\ 02A2 0320 JNE (?0138)
431 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
\ 02A4 3DE3 XOR #-1,R13
\ 02A6 8BFD0400 AND R13,4(R11)
\ 02AA ?0138:
432 }
433 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 02AA 1C4B0400 MOV 4(R11),R12
434 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
\ 02AE 32D2 EINT
435 *err = OS_NO_ERR;
\ 02B0 C8430000 MOV.B #0,0(R8)
436 return (flags_cur);
437 } else { /* Block task until events occur or timeout */
\ 02B4 7F3C JMP (?0152)
\ 02B6 ?0136:
438 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
\ 02B6 0C12 PUSH R12
\ 02B8 4A12 PUSH.B R10
\ 02BA 0E12 PUSH R14
\ 02BC 0E41 MOV SP,R14
\ 02BE 3E500600 ADD #6,R14
\ 02C2 0C4B MOV R11,R12
\ 02C4 B012F204 CALL #OS_FlagBlock
\ 02C8 31500600 ADD #6,SP
439 OS_EXIT_CRITICAL();
\ 02CC 32D2 EINT
440 }
441 break;
\ 02CE 3F3C JMP (?0128)
\ 02D0 ?0139:
442
443 #if OS_FLAG_WAIT_CLR_EN > 0
444 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
445 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 02D0 1D4B0400 MOV 4(R11),R13
\ 02D4 3DE3 XOR #-1,R13
\ 02D6 0DFE AND R14,R13
446 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
\ 02D8 0E9D CMP R13,R14
\ 02DA 0A20 JNE (?0141)
447 if (consume == TRUE) { /* See if we need to consume the flags */
\ 02DC 5993 CMP.B #1,R9
\ 02DE 0220 JNE (?0143)
448 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
\ 02E0 8BDD0400 BIS R13,4(R11)
\ 02E4 ?0143:
449 }
450 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 02E4 1C4B0400 MOV 4(R11),R12
451 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
\ 02E8 32D2 EINT
452 *err = OS_NO_ERR;
\ 02EA C8430000 MOV.B #0,0(R8)
453 return (flags_cur);
454 } else { /* Block task until events occur or timeout */
\ 02EE 623C JMP (?0152)
\ 02F0 ?0141:
455 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
\ 02F0 0C12 PUSH R12
\ 02F2 4A12 PUSH.B R10
\ 02F4 0E12 PUSH R14
\ 02F6 0E41 MOV SP,R14
\ 02F8 3E500600 ADD #6,R14
\ 02FC 0C4B MOV R11,R12
\ 02FE B012F204 CALL #OS_FlagBlock
\ 0302 31500600 ADD #6,SP
456 OS_EXIT_CRITICAL();
\ 0306 32D2 EINT
457 }
458 break;
\ 0308 223C JMP (?0128)
\ 030A ?0144:
459
460 case OS_FLAG_WAIT_CLR_ANY:
461 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 030A 1D4B0400 MOV 4(R11),R13
\ 030E 3DE3 XOR #-1,R13
\ 0310 0DFE AND R14,R13
462 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
\ 0312 0A24 JEQ (?0146)
463 if (consume == TRUE) { /* See if we need to consume the flags */
\ 0314 5993 CMP.B #1,R9
\ 0316 0220 JNE (?0148)
464 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -