📄 os_q.lst
字号:
238 if (perr == (INT8U *)0) {
239 OS_SAFETY_CRITICAL_EXCEPTION();
240 return ((OS_EVENT *)0);
241 }
242 #endif
243
244 #if OS_ARG_CHK_EN > 0u
245 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
246 *perr = OS_ERR_PEVENT_NULL;
247 return (pevent);
248 }
249 #endif
250 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
\ 0000000E 2078 LDRB R0,[R4, #+0]
\ 00000010 0228 CMP R0,#+2
\ 00000012 03D0 BEQ.N ??OSQDel_0
251 *perr = OS_ERR_EVENT_TYPE;
\ 00000014 0120 MOVS R0,#+1
\ 00000016 3070 STRB R0,[R6, #+0]
252 return (pevent);
\ 00000018 2000 MOVS R0,R4
\ 0000001A 79E0 B.N ??OSQDel_1
253 }
254 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ ??OSQDel_0:
\ 0000001C ........ LDR.W R0,??DataTable4
\ 00000020 0078 LDRB R0,[R0, #+0]
\ 00000022 0028 CMP R0,#+0
\ 00000024 03D0 BEQ.N ??OSQDel_2
255 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000026 0F20 MOVS R0,#+15
\ 00000028 3070 STRB R0,[R6, #+0]
256 return (pevent);
\ 0000002A 2000 MOVS R0,R4
\ 0000002C 70E0 B.N ??OSQDel_1
257 }
258 OS_ENTER_CRITICAL();
\ ??OSQDel_2:
\ 0000002E ........ BL OS_CPU_SR_Save
\ 00000032 8246 MOV R10,R0
259 if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on queue */
\ 00000034 A07A LDRB R0,[R4, #+10]
\ 00000036 0028 CMP R0,#+0
\ 00000038 02D0 BEQ.N ??OSQDel_3
260 tasks_waiting = OS_TRUE; /* Yes */
\ 0000003A 0120 MOVS R0,#+1
\ 0000003C 0700 MOVS R7,R0
\ 0000003E 01E0 B.N ??OSQDel_4
261 } else {
262 tasks_waiting = OS_FALSE; /* No */
\ ??OSQDel_3:
\ 00000040 0020 MOVS R0,#+0
\ 00000042 0700 MOVS R7,R0
263 }
264 switch (opt) {
\ ??OSQDel_4:
\ 00000044 EDB2 UXTB R5,R5 ;; ZeroExt R5,R5,#+24,#+24
\ 00000046 002D CMP R5,#+0
\ 00000048 02D0 BEQ.N ??OSQDel_5
\ 0000004A 012D CMP R5,#+1
\ 0000004C 2AD0 BEQ.N ??OSQDel_6
\ 0000004E 58E0 B.N ??OSQDel_7
265 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
266 if (tasks_waiting == OS_FALSE) {
\ ??OSQDel_5:
\ 00000050 FFB2 UXTB R7,R7 ;; ZeroExt R7,R7,#+24,#+24
\ 00000052 002F CMP R7,#+0
\ 00000054 1FD1 BNE.N ??OSQDel_8
267 #if OS_EVENT_NAME_EN > 0u
268 pevent->OSEventName = (INT8U *)(void *)"?";
\ 00000056 .... ADR.N R0,??DataTable3 ;; "\?"
\ 00000058 6061 STR R0,[R4, #+20]
269 #endif
270 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 0000005A 6068 LDR R0,[R4, #+4]
\ 0000005C 8146 MOV R9,R0
271 pq->OSQPtr = OSQFreeList;
\ 0000005E ........ LDR.W R0,??DataTable4_2
\ 00000062 0068 LDR R0,[R0, #+0]
\ 00000064 C9F80000 STR R0,[R9, #+0]
272 OSQFreeList = pq;
\ 00000068 ........ LDR.W R0,??DataTable4_2
\ 0000006C C0F80090 STR R9,[R0, #+0]
273 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 00000070 0020 MOVS R0,#+0
\ 00000072 2070 STRB R0,[R4, #+0]
274 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 00000074 ........ LDR.W R0,??DataTable4_1
\ 00000078 0068 LDR R0,[R0, #+0]
\ 0000007A 6060 STR R0,[R4, #+4]
275 pevent->OSEventCnt = 0u;
\ 0000007C 0020 MOVS R0,#+0
\ 0000007E 2081 STRH R0,[R4, #+8]
276 OSEventFreeList = pevent; /* Get next free event control block */
\ 00000080 ........ LDR.W R0,??DataTable4_1
\ 00000084 0460 STR R4,[R0, #+0]
277 OS_EXIT_CRITICAL();
\ 00000086 5046 MOV R0,R10
\ 00000088 ........ BL OS_CPU_SR_Restore
278 *perr = OS_ERR_NONE;
\ 0000008C 0020 MOVS R0,#+0
\ 0000008E 3070 STRB R0,[R6, #+0]
279 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
\ 00000090 0020 MOVS R0,#+0
\ 00000092 8046 MOV R8,R0
\ 00000094 05E0 B.N ??OSQDel_9
280 } else {
281 OS_EXIT_CRITICAL();
\ ??OSQDel_8:
\ 00000096 5046 MOV R0,R10
\ 00000098 ........ BL OS_CPU_SR_Restore
282 *perr = OS_ERR_TASK_WAITING;
\ 0000009C 4920 MOVS R0,#+73
\ 0000009E 3070 STRB R0,[R6, #+0]
283 pevent_return = pevent;
\ 000000A0 A046 MOV R8,R4
284 }
285 break;
\ ??OSQDel_9:
\ 000000A2 34E0 B.N ??OSQDel_10
286
287 case OS_DEL_ALWAYS: /* Always delete the queue */
288 while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for queue */
\ ??OSQDel_6:
\ 000000A4 A07A LDRB R0,[R4, #+10]
\ 000000A6 0028 CMP R0,#+0
\ 000000A8 06D0 BEQ.N ??OSQDel_11
289 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
\ 000000AA 0023 MOVS R3,#+0
\ 000000AC 0422 MOVS R2,#+4
\ 000000AE 0021 MOVS R1,#+0
\ 000000B0 2000 MOVS R0,R4
\ 000000B2 ........ BL OS_EventTaskRdy
\ 000000B6 F5E7 B.N ??OSQDel_6
290 }
291 #if OS_EVENT_NAME_EN > 0u
292 pevent->OSEventName = (INT8U *)(void *)"?";
\ ??OSQDel_11:
\ 000000B8 .... ADR.N R0,??DataTable3 ;; "\?"
\ 000000BA 6061 STR R0,[R4, #+20]
293 #endif
294 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 000000BC 6068 LDR R0,[R4, #+4]
\ 000000BE 8146 MOV R9,R0
295 pq->OSQPtr = OSQFreeList;
\ 000000C0 ........ LDR.W R0,??DataTable4_2
\ 000000C4 0068 LDR R0,[R0, #+0]
\ 000000C6 C9F80000 STR R0,[R9, #+0]
296 OSQFreeList = pq;
\ 000000CA ........ LDR.W R0,??DataTable4_2
\ 000000CE C0F80090 STR R9,[R0, #+0]
297 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 000000D2 0020 MOVS R0,#+0
\ 000000D4 2070 STRB R0,[R4, #+0]
298 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 000000D6 ........ LDR.W R0,??DataTable4_1
\ 000000DA 0068 LDR R0,[R0, #+0]
\ 000000DC 6060 STR R0,[R4, #+4]
299 pevent->OSEventCnt = 0u;
\ 000000DE 0020 MOVS R0,#+0
\ 000000E0 2081 STRH R0,[R4, #+8]
300 OSEventFreeList = pevent; /* Get next free event control block */
\ 000000E2 ........ LDR.W R0,??DataTable4_1
\ 000000E6 0460 STR R4,[R0, #+0]
301 OS_EXIT_CRITICAL();
\ 000000E8 5046 MOV R0,R10
\ 000000EA ........ BL OS_CPU_SR_Restore
302 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
\ 000000EE FFB2 UXTB R7,R7 ;; ZeroExt R7,R7,#+24,#+24
\ 000000F0 012F CMP R7,#+1
\ 000000F2 01D1 BNE.N ??OSQDel_12
303 OS_Sched(); /* Find highest priority task ready to run */
\ 000000F4 ........ BL OS_Sched
304 }
305 *perr = OS_ERR_NONE;
\ ??OSQDel_12:
\ 000000F8 0020 MOVS R0,#+0
\ 000000FA 3070 STRB R0,[R6, #+0]
306 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
\ 000000FC 0020 MOVS R0,#+0
\ 000000FE 8046 MOV R8,R0
307 break;
\ 00000100 05E0 B.N ??OSQDel_10
308
309 default:
310 OS_EXIT_CRITICAL();
\ ??OSQDel_7:
\ 00000102 5046 MOV R0,R10
\ 00000104 ........ BL OS_CPU_SR_Restore
311 *perr = OS_ERR_INVALID_OPT;
\ 00000108 0720 MOVS R0,#+7
\ 0000010A 3070 STRB R0,[R6, #+0]
312 pevent_return = pevent;
\ 0000010C A046 MOV R8,R4
313 break;
314 }
315 return (pevent_return);
\ ??OSQDel_10:
\ 0000010E 4046 MOV R0,R8
\ ??OSQDel_1:
\ 00000110 BDE8F087 POP {R4-R10,PC} ;; return
316 }
317 #endif
318
319 /*$PAGE*/
320 /*
321 *********************************************************************************************************
322 * FLUSH QUEUE
323 *
324 * Description : This function is used to flush the contents of the message queue.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -