📄 os_q.lst
字号:
\ 0000000E 2000 MOVS R0,R4
\ 00000010 6CE0 B.N ??OSQDel_2
226 }
227 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ ??OSQDel_0:
\ 00000012 002C CMP R4,#+0
\ 00000014 03D1 BNE.N ??OSQDel_3
228 *perr = OS_ERR_PEVENT_NULL;
\ 00000016 0420 MOVS R0,#+4
\ 00000018 2870 STRB R0,[R5, #+0]
229 return (pevent);
\ 0000001A 0020 MOVS R0,#+0
\ 0000001C 66E0 B.N ??OSQDel_2
230 }
231 #endif
232 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
\ ??OSQDel_3:
\ 0000001E 0126 MOVS R6,#+1
\ 00000020 2078 LDRB R0,[R4, #+0]
\ 00000022 0228 CMP R0,#+2
\ 00000024 01D0 BEQ.N ??OSQDel_4
233 *perr = OS_ERR_EVENT_TYPE;
\ 00000026 2E70 STRB R6,[R5, #+0]
\ 00000028 F1E7 B.N ??OSQDel_1
234 return (pevent);
235 }
236 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSQDel_4:
\ 0000002A .... LDR.N R0,??DataTable6 ;; OSIntNesting
\ 0000002C 0078 LDRB R0,[R0, #+0]
\ 0000002E 0028 CMP R0,#+0
\ 00000030 02D0 BEQ.N ??OSQDel_5
237 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000032 0F20 MOVS R0,#+15
\ 00000034 2870 STRB R0,[R5, #+0]
\ 00000036 EAE7 B.N ??OSQDel_1
238 return (pevent);
239 }
240 OS_ENTER_CRITICAL();
\ ??OSQDel_5:
\ 00000038 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 0000003C 8046 MOV R8,R0
241 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on queue */
\ 0000003E 0020 MOVS R0,#+0
\ 00000040 8146 MOV R9,R0
\ 00000042 A07A LDRB R0,[R4, #+10]
\ 00000044 0028 CMP R0,#+0
\ 00000046 01D0 BEQ.N ??OSQDel_6
242 tasks_waiting = OS_TRUE; /* Yes */
\ 00000048 B246 MOV R10,R6
\ 0000004A 00E0 B.N ??OSQDel_7
243 } else {
244 tasks_waiting = OS_FALSE; /* No */
\ ??OSQDel_6:
\ 0000004C CA46 MOV R10,R9
245 }
246 switch (opt) {
\ ??OSQDel_7:
\ 0000004E .... LDR.N R6,??DataTable4 ;; OSEventFreeList
\ 00000050 .... LDR.N R7,??DataTable5 ;; OSQFreeList
\ 00000052 3F20 MOVS R0,#+63
\ 00000054 8346 MOV R11,R0
\ 00000056 9DF80000 LDRB R0,[SP, #+0]
\ 0000005A 0028 CMP R0,#+0
\ 0000005C 02D0 BEQ.N ??OSQDel_8
\ 0000005E 0128 CMP R0,#+1
\ 00000060 22D0 BEQ.N ??OSQDel_9
\ 00000062 3DE0 B.N ??OSQDel_10
247 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
248 if (tasks_waiting == OS_FALSE) {
\ ??OSQDel_8:
\ 00000064 5046 MOV R0,R10
\ 00000066 0028 CMP R0,#+0
\ 00000068 11D1 BNE.N ??OSQDel_11
249 #if OS_EVENT_NAME_SIZE > 1
250 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 0000006A 84F80FB0 STRB R11,[R4, #+15]
251 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 0000006E 2074 STRB R0,[R4, #+16]
252 #endif
253 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 00000070 6068 LDR R0,[R4, #+4]
254 pq->OSQPtr = OSQFreeList;
\ 00000072 3968 LDR R1,[R7, #+0]
\ 00000074 0160 STR R1,[R0, #+0]
255 OSQFreeList = pq;
\ 00000076 3860 STR R0,[R7, #+0]
256 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 00000078 4846 MOV R0,R9
\ 0000007A 2070 STRB R0,[R4, #+0]
257 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 0000007C 3068 LDR R0,[R6, #+0]
\ 0000007E 6060 STR R0,[R4, #+4]
258 pevent->OSEventCnt = 0;
\ 00000080 4846 MOV R0,R9
\ 00000082 2081 STRH R0,[R4, #+8]
259 OSEventFreeList = pevent; /* Get next free event control block */
\ 00000084 3460 STR R4,[R6, #+0]
260 OS_EXIT_CRITICAL();
\ 00000086 4046 MOV R0,R8
\ 00000088 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
\ 0000008C 25E0 B.N ??OSQDel_12
261 *perr = OS_ERR_NONE;
262 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
263 } else {
264 OS_EXIT_CRITICAL();
\ ??OSQDel_11:
\ 0000008E 4046 MOV R0,R8
\ 00000090 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
265 *perr = OS_ERR_TASK_WAITING;
\ 00000094 4920 MOVS R0,#+73
\ 00000096 2870 STRB R0,[R5, #+0]
266 pevent_return = pevent;
\ 00000098 2000 MOVS R0,R4
\ 0000009A 27E0 B.N ??OSQDel_2
267 }
268 break;
269
270 case OS_DEL_ALWAYS: /* Always delete the queue */
271 while (pevent->OSEventGrp != 0) { /* Ready ALL tasks waiting for queue */
272 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
\ ??OSQDel_13:
\ 0000009C 4B46 MOV R3,R9
\ 0000009E 0422 MOVS R2,#+4
\ 000000A0 1946 MOV R1,R3
\ 000000A2 2000 MOVS R0,R4
\ 000000A4 ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rT
273 }
\ ??OSQDel_9:
\ 000000A8 A07A LDRB R0,[R4, #+10]
\ 000000AA 0028 CMP R0,#+0
\ 000000AC F6D1 BNE.N ??OSQDel_13
274 #if OS_EVENT_NAME_SIZE > 1
275 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 000000AE 84F80FB0 STRB R11,[R4, #+15]
276 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 000000B2 2074 STRB R0,[R4, #+16]
277 #endif
278 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 000000B4 6068 LDR R0,[R4, #+4]
279 pq->OSQPtr = OSQFreeList;
\ 000000B6 3968 LDR R1,[R7, #+0]
\ 000000B8 0160 STR R1,[R0, #+0]
280 OSQFreeList = pq;
\ 000000BA 3860 STR R0,[R7, #+0]
281 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 000000BC 4846 MOV R0,R9
\ 000000BE 2070 STRB R0,[R4, #+0]
282 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 000000C0 3068 LDR R0,[R6, #+0]
\ 000000C2 6060 STR R0,[R4, #+4]
283 pevent->OSEventCnt = 0;
\ 000000C4 4846 MOV R0,R9
\ 000000C6 2081 STRH R0,[R4, #+8]
284 OSEventFreeList = pevent; /* Get next free event control block */
\ 000000C8 3460 STR R4,[R6, #+0]
285 OS_EXIT_CRITICAL();
\ 000000CA 4046 MOV R0,R8
\ 000000CC ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
286 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
\ 000000D0 5046 MOV R0,R10
\ 000000D2 0128 CMP R0,#+1
\ 000000D4 01D1 BNE.N ??OSQDel_12
287 OS_Sched(); /* Find highest priority task ready to run */
\ 000000D6 ........ _BLF OS_Sched,??OS_Sched??rT
288 }
289 *perr = OS_ERR_NONE;
\ ??OSQDel_12:
\ 000000DA 4846 MOV R0,R9
\ 000000DC 2870 STRB R0,[R5, #+0]
290 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
\ 000000DE 05E0 B.N ??OSQDel_2
291 break;
292
293 default:
294 OS_EXIT_CRITICAL();
\ ??OSQDel_10:
\ 000000E0 4046 MOV R0,R8
\ 000000E2 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
295 *perr = OS_ERR_INVALID_OPT;
\ 000000E6 0720 MOVS R0,#+7
\ 000000E8 2870 STRB R0,[R5, #+0]
296 pevent_return = pevent;
\ 000000EA 2000 MOVS R0,R4
297 break;
298 }
299 return (pevent_return);
\ ??OSQDel_2:
\ 000000EC BDE8F28F POP {R1,R4-R11,PC} ;; return
300 }
301 #endif
302
303 /*$PAGE*/
304 /*
305 *********************************************************************************************************
306 * FLUSH QUEUE
307 *
308 * Description : This function is used to flush the contents of the message queue.
309 *
310 * Arguments : none
311 *
312 * Returns : OS_ERR_NONE upon success
313 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a queue
314 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
315 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -