?? os_core.lst
字號(hào):
307 */
308 /*$PAGE*/
309 #if ((OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0u))
\ In section .text, align 2, keep-with-next
310 INT16U OSEventPendMulti (OS_EVENT **pevents_pend,
311 OS_EVENT **pevents_rdy,
312 void **pmsgs_rdy,
313 INT32U timeout,
314 INT8U *perr)
315 {
\ OSEventPendMulti:
\ 00000000 2DE9F94F PUSH {R0,R3-R11,LR}
\ 00000004 83B0 SUB SP,SP,#+12
\ 00000006 8B46 MOV R11,R1
\ 00000008 9246 MOV R10,R2
\ 0000000A 0E9C LDR R4,[SP, #+56]
316 OS_EVENT **pevents;
317 OS_EVENT *pevent;
318 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
319 OS_Q *pq;
320 #endif
321 BOOLEAN events_rdy;
322 INT16U events_rdy_nbr;
323 INT8U events_stat;
324 #if (OS_CRITICAL_METHOD == 3u) /* Allocate storage for CPU status register */
325 OS_CPU_SR cpu_sr = 0u;
\ 0000000C 0020 MOVS R0,#+0
\ 0000000E 0090 STR R0,[SP, #+0]
326 #endif
327
328
329
330 #ifdef OS_SAFETY_CRITICAL
331 if (perr == (INT8U *)0) {
332 OS_SAFETY_CRITICAL_EXCEPTION();
333 return (0u);
334 }
335 #endif
336
337 #if (OS_ARG_CHK_EN > 0u)
338 if (pevents_pend == (OS_EVENT **)0) { /* Validate 'pevents_pend' */
339 *perr = OS_ERR_PEVENT_NULL;
340 return (0u);
341 }
342 if (*pevents_pend == (OS_EVENT *)0) { /* Validate 'pevents_pend' */
343 *perr = OS_ERR_PEVENT_NULL;
344 return (0u);
345 }
346 if (pevents_rdy == (OS_EVENT **)0) { /* Validate 'pevents_rdy' */
347 *perr = OS_ERR_PEVENT_NULL;
348 return (0u);
349 }
350 if (pmsgs_rdy == (void **)0) { /* Validate 'pmsgs_rdy' */
351 *perr = OS_ERR_PEVENT_NULL;
352 return (0u);
353 }
354 #endif
355
356 *pevents_rdy = (OS_EVENT *)0; /* Init array to NULL in case of errors */
\ 00000010 0020 MOVS R0,#+0
\ 00000012 CBF80000 STR R0,[R11, #+0]
357
358 pevents = pevents_pend;
\ 00000016 0398 LDR R0,[SP, #+12]
\ 00000018 0700 MOVS R7,R0
359 pevent = *pevents;
\ 0000001A 3868 LDR R0,[R7, #+0]
\ 0000001C 0500 MOVS R5,R0
360 while (pevent != (OS_EVENT *)0) {
\ ??OSEventPendMulti_0:
\ 0000001E 002D CMP R5,#+0
\ 00000020 12D0 BEQ.N ??OSEventPendMulti_1
361 switch (pevent->OSEventType) { /* Validate event block types */
\ 00000022 2878 LDRB R0,[R5, #+0]
\ 00000024 0128 CMP R0,#+1
\ 00000026 05D0 BEQ.N ??OSEventPendMulti_2
\ 00000028 06D3 BCC.N ??OSEventPendMulti_3
\ 0000002A 0328 CMP R0,#+3
\ 0000002C 01D0 BEQ.N ??OSEventPendMulti_4
\ 0000002E 02D3 BCC.N ??OSEventPendMulti_5
\ 00000030 02E0 B.N ??OSEventPendMulti_3
362 #if (OS_SEM_EN > 0u)
363 case OS_EVENT_TYPE_SEM:
364 break;
\ ??OSEventPendMulti_4:
\ 00000032 05E0 B.N ??OSEventPendMulti_6
365 #endif
366 #if (OS_MBOX_EN > 0u)
367 case OS_EVENT_TYPE_MBOX:
368 break;
\ ??OSEventPendMulti_2:
\ 00000034 04E0 B.N ??OSEventPendMulti_6
369 #endif
370 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
371 case OS_EVENT_TYPE_Q:
372 break;
\ ??OSEventPendMulti_5:
\ 00000036 03E0 B.N ??OSEventPendMulti_6
373 #endif
374
375 case OS_EVENT_TYPE_MUTEX:
376 case OS_EVENT_TYPE_FLAG:
377 default:
378 *perr = OS_ERR_EVENT_TYPE;
\ ??OSEventPendMulti_3:
\ 00000038 0120 MOVS R0,#+1
\ 0000003A 2070 STRB R0,[R4, #+0]
379 return (0u);
\ 0000003C 0020 MOVS R0,#+0
\ 0000003E 49E1 B.N ??OSEventPendMulti_7
380 }
381 pevents++;
\ ??OSEventPendMulti_6:
\ 00000040 3F1D ADDS R7,R7,#+4
382 pevent = *pevents;
\ 00000042 3868 LDR R0,[R7, #+0]
\ 00000044 0500 MOVS R5,R0
\ 00000046 EAE7 B.N ??OSEventPendMulti_0
383 }
384
385 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ ??OSEventPendMulti_1:
\ 00000048 ........ LDR.W R0,??DataTable26
\ 0000004C 0078 LDRB R0,[R0, #+0]
\ 0000004E 0028 CMP R0,#+0
\ 00000050 03D0 BEQ.N ??OSEventPendMulti_8
386 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 00000052 0220 MOVS R0,#+2
\ 00000054 2070 STRB R0,[R4, #+0]
387 return (0u);
\ 00000056 0020 MOVS R0,#+0
\ 00000058 3CE1 B.N ??OSEventPendMulti_7
388 }
389 if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
\ ??OSEventPendMulti_8:
\ 0000005A ........ LDR.W R0,??DataTable26_1
\ 0000005E 0078 LDRB R0,[R0, #+0]
\ 00000060 0028 CMP R0,#+0
\ 00000062 03D0 BEQ.N ??OSEventPendMulti_9
390 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 00000064 0D20 MOVS R0,#+13
\ 00000066 2070 STRB R0,[R4, #+0]
391 return (0u);
\ 00000068 0020 MOVS R0,#+0
\ 0000006A 33E1 B.N ??OSEventPendMulti_7
392 }
393
394 /*$PAGE*/
395 events_rdy = OS_FALSE;
\ ??OSEventPendMulti_9:
\ 0000006C 0020 MOVS R0,#+0
\ 0000006E 8DF80400 STRB R0,[SP, #+4]
396 events_rdy_nbr = 0u;
\ 00000072 0020 MOVS R0,#+0
\ 00000074 8046 MOV R8,R0
397 events_stat = OS_STAT_RDY;
\ 00000076 0020 MOVS R0,#+0
\ 00000078 8146 MOV R9,R0
398 pevents = pevents_pend;
\ 0000007A 0398 LDR R0,[SP, #+12]
\ 0000007C 0700 MOVS R7,R0
399 pevent = *pevents;
\ 0000007E 3868 LDR R0,[R7, #+0]
\ 00000080 0500 MOVS R5,R0
400 OS_ENTER_CRITICAL();
\ 00000082 ........ BL OS_CPU_SR_Save
\ 00000086 0090 STR R0,[SP, #+0]
401 while (pevent != (OS_EVENT *)0) { /* See if any events already available */
\ ??OSEventPendMulti_10:
\ 00000088 002D CMP R5,#+0
\ 0000008A 68D0 BEQ.N ??OSEventPendMulti_11
402 switch (pevent->OSEventType) {
\ 0000008C 2878 LDRB R0,[R5, #+0]
\ 0000008E 0128 CMP R0,#+1
\ 00000090 1CD0 BEQ.N ??OSEventPendMulti_12
\ 00000092 55D3 BCC.N ??OSEventPendMulti_13
\ 00000094 0328 CMP R0,#+3
\ 00000096 01D0 BEQ.N ??OSEventPendMulti_14
\ 00000098 2FD3 BCC.N ??OSEventPendMulti_15
\ 0000009A 51E0 B.N ??OSEventPendMulti_13
403 #if (OS_SEM_EN > 0u)
404 case OS_EVENT_TYPE_SEM:
405 if (pevent->OSEventCnt > 0u) { /* If semaphore count > 0, resource available; */
\ ??OSEventPendMulti_14:
\ 0000009C 2889 LDRH R0,[R5, #+8]
\ 0000009E 0028 CMP R0,#+0
\ 000000A0 11D0 BEQ.N ??OSEventPendMulti_16
406 pevent->OSEventCnt--; /* ... decrement semaphore, ... */
\ 000000A2 2889 LDRH R0,[R5, #+8]
\ 000000A4 401E SUBS R0,R0,#+1
\ 000000A6 2881 STRH R0,[R5, #+8]
407 *pevents_rdy++ = pevent; /* ... and return available semaphore event */
\ 000000A8 CBF80050 STR R5,[R11, #+0]
\ 000000AC 1BF1040B ADDS R11,R11,#+4
408 events_rdy = OS_TRUE;
\ 000000B0 0120 MOVS R0,#+1
\ 000000B2 8DF80400 STRB R0,[SP, #+4]
409 *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
\ 000000B6 0020 MOVS R0,#+0
\ 000000B8 CAF80000 STR R0,[R10, #+0]
\ 000000BC 1AF1040A ADDS R10,R10,#+4
410 events_rdy_nbr++;
\ 000000C0 18F10108 ADDS R8,R8,#+1
\ 000000C4 01E0 B.N ??OSEventPendMulti_17
411
412 } else {
413 events_stat |= OS_STAT_SEM; /* Configure multi-pend for semaphore events */
\ ??OSEventPendMulti_16:
\ 000000C6 59F00109 ORRS R9,R9,#0x1
414 }
415 break;
\ ??OSEventPendMulti_17:
\ 000000CA 44E0 B.N ??OSEventPendMulti_18
416 #endif
417
418 #if (OS_MBOX_EN > 0u)
419 case OS_EVENT_TYPE_MBOX:
420 if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty; ... */
\ ??OSEventPendMulti_12:
\ 000000CC 6868 LDR R0,[R5, #+4]
\ 000000CE 0028 CMP R0,#+0
\ 000000D0 10D0 BEQ.N ??OSEventPendMulti_19
421 /* ... return available message, ... */
422 *pmsgs_rdy++ = (void *)pevent->OSEventPtr;
\ 000000D2 6868 LDR R0,[R5, #+4]
\ 000000D4 CAF80000 STR R0,[R10, #+0]
\ 000000D8 1AF1040A ADDS R10,R10,#+4
423 pevent->OSEventPtr = (void *)0;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -