📄 os_flag.lis
字号:
0340 0027 clr R16
0342 4FC1 xjmp L59
0344 L64:
0344 .dbline 402
0344 ; }
0344 ; #endif
0344 ; if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
0344 C7FE sbrs R12,7
0346 06C0 rjmp L66
0348 .dbline 402
0348 .dbline 403
0348 ; wait_type &= ~OS_FLAG_CONSUME;
0348 8C2D mov R24,R12
034A 8F77 andi R24,127
034C C82E mov R12,R24
034E .dbline 404
034E ; consume = TRUE;
034E EE24 clr R14
0350 E394 inc R14
0352 .dbline 405
0352 01C0 xjmp L67
0354 L66:
0354 .dbline 405
0354 ; } else {
0354 .dbline 406
0354 ; consume = FALSE;
0354 EE24 clr R14
0356 .dbline 407
0356 ; }
0356 L67:
0356 .dbline 409
0356 ; /*$PAGE*/
0356 ; OS_ENTER_CRITICAL();
0356 0A93 st -y,r16
0358 0FB7 in r16,0x3F
035A F894 cli
035C 0F93 push r16
035E 0991 ld r16,y+
0360 .dbline 409
0360 .dbline 410
0360 4C2D mov R20,R12
0362 5527 clr R21
0364 4030 cpi R20,0
0366 4507 cpc R20,R21
0368 09F4 brne X16
036A 70C0 xjmp L81
036C X16:
036C X12:
036C 4130 cpi R20,1
036E E0E0 ldi R30,0
0370 5E07 cpc R21,R30
0372 09F4 brne X17
0374 9BC0 xjmp L86
0376 X17:
0376 4230 cpi R20,2
0378 E0E0 ldi R30,0
037A 5E07 cpc R21,R30
037C 31F0 breq L71
037E 4330 cpi R20,3
0380 E0E0 ldi R30,0
0382 5E07 cpc R21,R30
0384 09F4 brne X18
0386 32C0 xjmp L76
0388 X18:
0388 C0C0 xjmp L68
038A X13:
038A .dbline 410
038A ; switch (wait_type) {
038A L71:
038A .dbline 412
038A ; case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
038A ; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
038A F301 movw R30,R6
038C A380 ldd R10,z+3
038E 0A8C ldd R0,y+26
0390 A020 and R10,R0
0392 .dbline 413
0392 ; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
0392 A014 cp R10,R0
0394 B1F4 brne L72
0396 .dbline 413
0396 .dbline 414
0396 ; if (consume == TRUE) { /* See if we need to consume the flags */
0396 8E2D mov R24,R14
0398 8130 cpi R24,1
039A 41F4 brne L74
039C .dbline 414
039C .dbline 415
039C ; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
039C C301 movw R24,R6
039E 0396 adiw R24,3
03A0 4A2C mov R4,R10
03A2 4094 com R4
03A4 FC01 movw R30,R24
03A6 5080 ldd R5,z+0
03A8 5420 and R5,R4
03AA 5082 std z+0,R5
03AC .dbline 416
03AC ; }
03AC L74:
03AC .dbline 417
03AC ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
03AC F301 movw R30,R6
03AE 4381 ldd R20,z+3
03B0 .dbline 418
03B0 ; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
03B0 0A93 st -y,r16
03B2 0F91 pop r16
03B4 0FBF out 0x3F,r16
03B6 0991 ld r16,y+
03B8 .dbline 418
03B8 .dbline 419
03B8 ; *err = OS_NO_ERR;
03B8 2224 clr R2
03BA FB01 movw R30,R22
03BC 2082 std z+0,R2
03BE .dbline 420
03BE ; return (flags_cur);
03BE 042F mov R16,R20
03C0 10C1 xjmp L59
03C2 L72:
03C2 .dbline 421
03C2 ; } else { /* Block task until events occur or timeout */
03C2 .dbline 422
03C2 ; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
03C2 0E8C ldd R0,y+30
03C4 1F8C ldd R1,y+31
03C6 1D82 std y+5,R1
03C8 0C82 std y+4,R0
03CA CA82 std y+2,R12
03CC 0A8C ldd R0,y+26
03CE 0882 std y+0,R0
03D0 9E01 movw R18,R28
03D2 2A5F subi R18,250 ; offset = 6
03D4 3F4F sbci R19,255
03D6 8301 movw R16,R6
03D8 0F93 push R16
03DA 1F93 push R17
03DC FCD1 xcall _OS_FlagBlock
03DE 7F90 pop R7
03E0 6F90 pop R6
03E2 .dbline 423
03E2 ; OS_EXIT_CRITICAL();
03E2 0A93 st -y,r16
03E4 0F91 pop r16
03E6 0FBF out 0x3F,r16
03E8 0991 ld r16,y+
03EA .dbline 423
03EA .dbline 424
03EA ; }
03EA .dbline 425
03EA ; break;
03EA 99C0 xjmp L69
03EC L76:
03EC .dbline 428
03EC ;
03EC ; case OS_FLAG_WAIT_SET_ANY:
03EC ; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
03EC F301 movw R30,R6
03EE A380 ldd R10,z+3
03F0 0A8C ldd R0,y+26
03F2 A020 and R10,R0
03F4 .dbline 429
03F4 ; if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
03F4 B1F0 breq L77
03F6 .dbline 429
03F6 .dbline 430
03F6 ; if (consume == TRUE) { /* See if we need to consume the flags */
03F6 8E2D mov R24,R14
03F8 8130 cpi R24,1
03FA 41F4 brne L79
03FC .dbline 430
03FC .dbline 431
03FC ; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
03FC C301 movw R24,R6
03FE 0396 adiw R24,3
0400 4A2C mov R4,R10
0402 4094 com R4
0404 FC01 movw R30,R24
0406 5080 ldd R5,z+0
0408 5420 and R5,R4
040A 5082 std z+0,R5
040C .dbline 432
040C ; }
040C L79:
040C .dbline 433
040C ; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
040C F301 movw R30,R6
040E 4381 ldd R20,z+3
0410 .dbline 434
0410 ; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
0410 0A93 st -y,r16
0412 0F91 pop r16
0414 0FBF out 0x3F,r16
0416 0991 ld r16,y+
0418 .dbline 434
0418 .dbline 435
0418 ; *err = OS_NO_ERR;
0418 2224 clr R2
041A FB01 movw R30,R22
041C 2082 std z+0,R2
041E .dbline 436
041E ; return (flags_cur);
041E 042F mov R16,R20
0420 E0C0 xjmp L59
0422 L77:
0422 .dbline 437
0422 ; } else { /* Block task until events occur or timeout */
0422 .dbline 438
0422 ; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
0422 0E8C ldd R0,y+30
0424 1F8C ldd R1,y+31
0426 1D82 std y+5,R1
0428 0C82 std y+4,R0
042A CA82 std y+2,R12
042C 0A8C ldd R0,y+26
042E 0882 std y+0,R0
0430 9E01 movw R18,R28
0432 2A5F subi R18,250 ; offset = 6
0434 3F4F sbci R19,255
0436 8301 movw R16,R6
0438 0F93 push R16
043A 1F93 push R17
043C CCD1 xcall _OS_FlagBlock
043E 7F90 pop R7
0440 6F90 pop R6
0442 .dbline 439
0442 ; OS_EXIT_CRITICAL();
0442 0A93 st -y,r16
0444 0F91 pop r16
0446 0FBF out 0x3F,r16
0448 0991 ld r16,y+
044A .dbline 439
044A .dbline 440
044A ; }
044A .dbline 441
044A ; break;
044A 69C0 xjmp L69
044C L81:
044C .dbline 445
044C ;
044C ; #if OS_FLAG_WAIT_CLR_EN > 0
044C ; case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
044C ; flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
044C F301 movw R30,R6
044E A380 ldd R10,z+3
0450 A094 com R10
0452 0A8C ldd R0,y+26
0454 A020 and R10,R0
0456 .dbline 446
0456 ; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
0456 A014 cp R10,R0
0458 A1F4 brne L82
045A .dbline 446
045A .dbline 447
045A ; if (consume == TRUE) { /* See if we need to consume the flags */
045A 8E2D mov R24,R14
045C 8130 cpi R24,1
045E 31F4 brne L84
0460 .dbline 447
0460 .dbline 448
0460 ; pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
0460 C301 movw R24,R6
0462 0396 adiw R24,3
0464 FC01 movw R30,R24
0466 4080 ldd R4,z+0
0468 4A28 or R4,R10
046A 4082 std z+0,R4
046C .dbline 449
046C ; }
046C L84:
046C .dbline 450
046C ; flags_cur = pgrp->OSFlagFlags; /* Will return the st
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -