📄 os_flag.lst
字号:
\ 006A 1D4C0400 MOV 4(R12),R13
118 OS_EXIT_CRITICAL();
\ 006E 32D2 EINT
119 break;
\ 0070 393C JMP (?0065)
\ 0072 ?0072:
120
121 case OS_FLAG_WAIT_SET_ANY:
122 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 0072 1D4C0400 MOV 4(R12),R13
\ 0076 0DFE AND R14,R13
123 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
\ 0078 0624 JEQ (?0074)
124 if (consume == TRUE) { /* See if we need to consume the flags */
\ 007A 5F93 CMP.B #1,R15
\ 007C 0720 JNE (?0077)
125 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
\ 007E 3DE3 XOR #-1,R13
\ 0080 8CFD0400 AND R13,4(R12)
126 }
127 } else {
\ 0084 033C JMP (?0077)
\ 0086 ?0074:
128 *err = OS_FLAG_ERR_NOT_RDY;
\ 0086 FA409800 MOV.B #152,0(R10)
\ 008A 0000
\ 008C ?0077:
129 }
130 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 008C 1D4C0400 MOV 4(R12),R13
131 OS_EXIT_CRITICAL();
\ 0090 32D2 EINT
132 break;
\ 0092 283C JMP (?0065)
\ 0094 ?0078:
133
134 #if OS_FLAG_WAIT_CLR_EN > 0
135 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
136 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 0094 1D4C0400 MOV 4(R12),R13
\ 0098 3DE3 XOR #-1,R13
\ 009A 0DFE AND R14,R13
137 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
\ 009C 0E9D CMP R13,R14
\ 009E 0520 JNE (?0080)
138 if (consume == TRUE) { /* See if we need to consume the flags */
\ 00A0 5F93 CMP.B #1,R15
\ 00A2 0620 JNE (?0083)
139 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
\ 00A4 8CDD0400 BIS R13,4(R12)
140 }
141 } else {
\ 00A8 033C JMP (?0083)
\ 00AA ?0080:
142 *err = OS_FLAG_ERR_NOT_RDY;
\ 00AA FA409800 MOV.B #152,0(R10)
\ 00AE 0000
\ 00B0 ?0083:
143 }
144 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 00B0 1D4C0400 MOV 4(R12),R13
145 OS_EXIT_CRITICAL();
\ 00B4 32D2 EINT
146 break;
\ 00B6 163C JMP (?0065)
\ 00B8 ?0084:
147
148 case OS_FLAG_WAIT_CLR_ANY:
149 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\ 00B8 1D4C0400 MOV 4(R12),R13
\ 00BC 3DE3 XOR #-1,R13
\ 00BE 0DFE AND R14,R13
150 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
\ 00C0 0524 JEQ (?0086)
151 if (consume == TRUE) { /* See if we need to consume the flags */
\ 00C2 5F93 CMP.B #1,R15
\ 00C4 0620 JNE (?0089)
152 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
\ 00C6 8CDD0400 BIS R13,4(R12)
153 }
154 } else {
\ 00CA 033C JMP (?0089)
\ 00CC ?0086:
155 *err = OS_FLAG_ERR_NOT_RDY;
\ 00CC FA409800 MOV.B #152,0(R10)
\ 00D0 0000
\ 00D2 ?0089:
156 }
157 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
\ 00D2 1D4C0400 MOV 4(R12),R13
158 OS_EXIT_CRITICAL();
\ 00D6 32D2 EINT
159 break;
\ 00D8 053C JMP (?0065)
\ 00DA ?0090:
160 #endif
161
162 default:
163 OS_EXIT_CRITICAL();
\ 00DA 32D2 EINT
164 flags_cur = (OS_FLAGS)0;
\ 00DC 0D43 MOV #0,R13
165 *err = OS_FLAG_ERR_WAIT_TYPE;
\ 00DE FA409700 MOV.B #151,0(R10)
\ 00E2 0000
166 break;
\ 00E4 ?0065:
167 }
168 return (flags_cur);
\ 00E4 0C4D MOV R13,R12
169 }
\ 00E6 ?0091:
\ 00E6 3A41 POP R10
\ 00E8 3041 RET
\ 00EA OSFlagCreate:
170 #endif
171
172 /*$PAGE*/
173 /*
174 *********************************************************************************************************
175 * CREATE AN EVENT FLAG
176 *
177 * Description: This function is called to create an event flag group.
178 *
179 * Arguments : flags Contains the initial value to store in the event flag group.
180 *
181 * err is a pointer to an error code which will be returned to your application:
182 * OS_NO_ERR if the call was successful.
183 * OS_ERR_CREATE_ISR if you attempted to create an Event Flag from an
184 * ISR.
185 * OS_FLAG_GRP_DEPLETED if there are no more event flag groups
186 *
187 * Returns : A pointer to an event flag group or a NULL pointer if no more groups are available.
188 *
189 * Called from: Task ONLY
190 *********************************************************************************************************
191 */
192
193 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
194 {
195 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
196 OS_CPU_SR cpu_sr;
197 #endif
198 OS_FLAG_GRP *pgrp;
199
200
201 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 00EA C2930000 CMP.B #0,&OSIntNesting
\ 00EE 0524 JEQ (?0093)
202 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
\ 00F0 FE408D00 MOV.B #141,0(R14)
\ 00F4 0000
203 return ((OS_FLAG_GRP *)0);
\ 00F6 0C43 MOV #0,R12
204 }
\ 00F8 3041 RET
\ 00FA ?0093:
205 OS_ENTER_CRITICAL();
\ 00FA 32C2 DINT
206 pgrp = OSFlagFreeList; /* Get next free event flag */
\ 00FC 1D420000 MOV &OSFlagFreeList,R13
207 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
\ 0100 0D93 CMP #0,R13
\ 0102 1024 JEQ (?0095)
208 /* Adjust free list */
209 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
\ 0104 1F420000 MOV &OSFlagFreeList,R15
\ 0108 924F0200 MOV 2(R15),&OSFlagFreeList
\ 010C 0000
210 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
\ 010E FD400500 MOV.B #5,0(R13)
\ 0112 0000
211 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
\ 0114 8D4C0400 MOV R12,4(R13)
212 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
\ 0118 8D430200 MOV #0,2(R13)
213 OS_EXIT_CRITICAL();
\ 011C 32D2 EINT
214 *err = OS_NO_ERR;
\ 011E CE430000 MOV.B #0,0(R14)
215 } else {
\ 0122 043C JMP (?0096)
\ 0124 ?0095:
216 OS_EXIT_CRITICAL();
\ 0124 32D2 EINT
217 *err = OS_FLAG_GRP_DEPLETED;
\ 0126 FE409A00 MOV.B #154,0(R14)
\ 012A 0000
\ 012C ?0096:
218 }
219 return (pgrp); /* Return pointer to event flag group */
\ 012C 0C4D MOV R13,R12
220 }
\ 012E 3041 RET
\ 0130 OSFlagDel:
221
222 /*$PAGE*/
223 /*
224 *********************************************************************************************************
225 * DELETE AN EVENT FLAG GROUP
226 *
227 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
228 * group.
229 *
230 * Arguments : pgrp is a pointer to the desired event flag group.
231 *
232 * opt determines delete options as follows:
233 * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
234 * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
235 * waiting. In this case, all the tasks pending will be
236 * readied.
237 *
238 * err is a pointer to an error code that can contain one of the following values:
239 * OS_NO_ERR The call was successful and the event flag group was
240 * deleted
241 * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
242 * an ISR
243 * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
244 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
245 * OS_ERR_INVALID_OPT An invalid option was specified
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -