?? ucosii.lst
字號:
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 + -