📄 os_core.txt
字号:
;;;362 *perr = OS_ERR_EVENT_TYPE;
0001ea f888f888 STRB r11,[r8,#0]
;;;363 return (0);
0001ee 2000 MOVS r0,#0
|L1.496|
;;;364 }
;;;365 pevents++;
;;;366 pevent = *pevents;
;;;367 }
;;;368
;;;369 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;370 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;371 return (0);
;;;372 }
;;;373 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;374 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;375 return (0);
;;;376 }
;;;377
;;;378 /*$PAGE*/
;;;379 OS_ENTER_CRITICAL();
;;;380 events_rdy = OS_FALSE;
;;;381 events_rdy_nbr = 0;
;;;382 events_stat = OS_STAT_RDY;
;;;383 pevents = pevents_pend;
;;;384 pevent = *pevents;
;;;385 while (pevent != (OS_EVENT *)0) { /* See if any events already available */
;;;386 switch (pevent->OSEventType) {
;;;387 #if (OS_SEM_EN > 0)
;;;388 case OS_EVENT_TYPE_SEM:
;;;389 if (pevent->OSEventCnt > 0) { /* If semaphore count > 0, resource available; */
;;;390 pevent->OSEventCnt--; /* ... decrement semaphore, ... */
;;;391 *pevents_rdy++ = pevent; /* ... and return available semaphore event */
;;;392 events_rdy = OS_TRUE;
;;;393 *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
;;;394 events_rdy_nbr++;
;;;395
;;;396 } else {
;;;397 events_stat |= OS_STAT_SEM; /* Configure multi-pend for semaphore events */
;;;398 }
;;;399 break;
;;;400 #endif
;;;401
;;;402 #if (OS_MBOX_EN > 0)
;;;403 case OS_EVENT_TYPE_MBOX:
;;;404 if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty; ... */
;;;405 /* ... return available message, ... */
;;;406 *pmsgs_rdy++ = (void *)pevent->OSEventPtr;
;;;407 pevent->OSEventPtr = (void *)0;
;;;408 *pevents_rdy++ = pevent; /* ... and return available mailbox event */
;;;409 events_rdy = OS_TRUE;
;;;410 events_rdy_nbr++;
;;;411
;;;412 } else {
;;;413 events_stat |= OS_STAT_MBOX; /* Configure multi-pend for mailbox events */
;;;414 }
;;;415 break;
;;;416 #endif
;;;417
;;;418 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;;;419 case OS_EVENT_TYPE_Q:
;;;420 pq = (OS_Q *)pevent->OSEventPtr;
;;;421 if (pq->OSQEntries > 0) { /* If queue NOT empty; ... */
;;;422 /* ... return available message, ... */
;;;423 *pmsgs_rdy++ = (void *)*pq->OSQOut++;
;;;424 if (pq->OSQOut == pq->OSQEnd) { /* If OUT ptr at queue end, ... */
;;;425 pq->OSQOut = pq->OSQStart; /* ... wrap to queue start */
;;;426 }
;;;427 pq->OSQEntries--; /* Update number of queue entries */
;;;428 *pevents_rdy++ = pevent; /* ... and return available queue event */
;;;429 events_rdy = OS_TRUE;
;;;430 events_rdy_nbr++;
;;;431
;;;432 } else {
;;;433 events_stat |= OS_STAT_Q; /* Configure multi-pend for queue events */
;;;434 }
;;;435 break;
;;;436 #endif
;;;437
;;;438 case OS_EVENT_TYPE_MUTEX:
;;;439 case OS_EVENT_TYPE_FLAG:
;;;440 default:
;;;441 OS_EXIT_CRITICAL();
;;;442 *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
;;;443 *perr = OS_ERR_EVENT_TYPE;
;;;444 return (events_rdy_nbr);
;;;445 }
;;;446 pevents++;
;;;447 pevent = *pevents;
;;;448 }
;;;449
;;;450 if ( events_rdy == OS_TRUE) { /* Return any events already available */
;;;451 *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
;;;452 OS_EXIT_CRITICAL();
;;;453 *perr = OS_ERR_NONE;
;;;454 return (events_rdy_nbr);
;;;455 }
;;;456 /*$PAGE*/
;;;457 /* Otherwise, must wait until any event occurs */
;;;458 OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ... */
;;;459 OS_STAT_MULTI; /* ... pend on multiple events */
;;;460 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;461 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
;;;462 OS_EventTaskWaitMulti(pevents_pend); /* Suspend task until events or timeout occurs */
;;;463
;;;464 OS_EXIT_CRITICAL();
;;;465 OS_Sched(); /* Find next highest priority task ready */
;;;466 OS_ENTER_CRITICAL();
;;;467
;;;468 switch (OSTCBCur->OSTCBStatPend) { /* Handle event posted, aborted, or timed-out */
;;;469 case OS_STAT_PEND_OK:
;;;470 case OS_STAT_PEND_ABORT:
;;;471 pevent = OSTCBCur->OSTCBEventPtr;
;;;472 if (pevent != (OS_EVENT *)0) { /* If task event ptr != NULL, ... */
;;;473 *pevents_rdy++ = pevent; /* ... return available event ... */
;;;474 *pevents_rdy = (OS_EVENT *)0; /* ... & NULL terminate return event array */
;;;475 events_rdy_nbr++;
;;;476
;;;477 } else { /* Else NO event available, handle as timeout */
;;;478 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;
;;;479 OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
;;;480 }
;;;481 break;
;;;482
;;;483 case OS_STAT_PEND_TO: /* If events timed out, ... */
;;;484 default: /* ... remove task from events' wait lists */
;;;485 OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
;;;486 break;
;;;487 }
;;;488
;;;489 switch (OSTCBCur->OSTCBStatPend) {
;;;490 case OS_STAT_PEND_OK:
;;;491 switch (pevent->OSEventType) { /* Return event's message */
;;;492 #if (OS_SEM_EN > 0)
;;;493 case OS_EVENT_TYPE_SEM:
;;;494 *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
;;;495 break;
;;;496 #endif
;;;497
;;;498 #if ((OS_MBOX_EN > 0) || \
;;;499 ((OS_Q_EN > 0) && (OS_MAX_QS > 0)))
;;;500 case OS_EVENT_TYPE_MBOX:
;;;501 case OS_EVENT_TYPE_Q:
;;;502 *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg; /* Return received message */
;;;503 break;
;;;504 #endif
;;;505
;;;506 case OS_EVENT_TYPE_MUTEX:
;;;507 case OS_EVENT_TYPE_FLAG:
;;;508 default:
;;;509 OS_EXIT_CRITICAL();
;;;510 *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
;;;511 *perr = OS_ERR_EVENT_TYPE;
;;;512 return (events_rdy_nbr);
;;;513 }
;;;514 *perr = OS_ERR_NONE;
;;;515 break;
;;;516
;;;517 case OS_STAT_PEND_ABORT:
;;;518 *pmsgs_rdy++ = (void *)0; /* NO message returned for abort */
;;;519 *perr = OS_ERR_PEND_ABORT; /* Indicate that event aborted */
;;;520 break;
;;;521
;;;522 case OS_STAT_PEND_TO:
;;;523 default:
;;;524 *pmsgs_rdy++ = (void *)0; /* NO message returned for timeout */
;;;525 *perr = OS_ERR_TIMEOUT; /* Indicate that events timed out */
;;;526 break;
;;;527 }
;;;528
;;;529 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
;;;530 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
;;;531 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
;;;532 OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;533 OSTCBCur->OSTCBMsg = (void *)0; /* Clear task message */
;;;534 OS_EXIT_CRITICAL();
;;;535
;;;536 return (events_rdy_nbr);
;;;537 }
0001f0 b004 ADD sp,sp,#0x10
0001f2 e8bde8bd POP {r4-r12,pc}
|L1.502|
0001f6 f850f850 LDR r1,[r0,#4]! ;366
|L1.506|
0001fa 2900 CMP r1,#0 ;344
0001fc d1f0 BNE |L1.480|
0001fe 4889 LDR r0,|L1.1060|
000200 7881 LDRB r1,[r0,#2] ;369 ; OSIntNesting
000202 b121 CBZ r1,|L1.526|
000204 2002 MOVS r0,#2 ;370
000206 f888f888 STRB r0,[r8,#0] ;370
00020a 2000 MOVS r0,#0 ;371
00020c e7f0 B |L1.496|
|L1.526|
00020e 4885 LDR r0,|L1.1060|
000210 78c0 LDRB r0,[r0,#3] ;373 ; OSLockNesting
000212 b120 CBZ r0,|L1.542|
000214 200d MOVS r0,#0xd ;374
000216 f888f888 STRB r0,[r8,#0] ;374
00021a 2000 MOVS r0,#0 ;375
00021c e7e8 B |L1.496|
|L1.542|
00021e f7fff7ff BL OS_CPU_SR_Save
000222 4682 MOV r10,r0 ;379
000224 2200 MOVS r2,#0 ;380
000226 2700 MOVS r7,#0 ;381
000228 2000 MOVS r0,#0 ;382
00022a 9900 LDR r1,[sp,#0] ;383
00022c 680c LDR r4,[r1,#0] ;384
00022e e020 B |L1.626|
|L1.560|
000230 7823 LDRB r3,[r4,#0] ;386
000232 2b01 CMP r3,#1 ;386
000234 d00f BEQ |L1.598|
000236 2b03 CMP r3,#3 ;386
000238 d128 BNE |L1.652|
00023a 8923 LDRH r3,[r4,#8] ;389
00023c b143 CBZ r3,|L1.592|
00023e 1e5b SUBS r3,r3,#1 ;390
000240 8123 STRH r3,[r4,#8] ;390
000242 c510 STM r5!,{r4} ;391
000244 2201 MOVS r2,#1 ;392
000246 f846f846 STR r9,[r6],#4 ;393
00024a 1c7f ADDS r7,r7,#1 ;394
00024c b2bf UXTH r7,r7 ;394
00024e e00e B |L1.622|
|L1.592|
000250 f040f040 ORR r0,r0,#1 ;397
000254 e00b B |L1.622|
|L1.598|
000256 6863 LDR r3,[r4,#4] ;404
000258 b13b CBZ r3,|L1.618|
00025a c608 STM r6!,{r3} ;406
00025c f8c4f8c4 STR r9,[r4,#4] ;407
000260 c510 STM r5!,{r4} ;408
000262 2201 MOVS r2,#1 ;409
000264 1c7f ADDS r7,r7,#1 ;410
000266 b2bf UXTH r7,r7 ;410
000268 e001 B |L1.622|
|L1.618|
00026a f040f040 ORR r0,r0,#2 ;413
|L1.622|
00026e f851f851 LDR r4,[r1,#4]! ;447
|L1.626|
000272 2c00 CMP r4,#0 ;385
000274 d1dc BNE |L1.560|
000276 2a01 CMP r2,#1 ;450
000278 d111 BNE |L1.670|
00027a f8c5f8c5 STR r9,[r5,#0] ;451
00027e 4650 MOV r0,r10 ;452
000280 f7fff7ff BL OS_CPU_SR_Restore
000284 f888f888 STRB r9,[r8,#0] ;453
000288 4638 MOV r0,r7 ;454
00028a e7b1 B |L1.496|
|L1.652|
00028c 4650 MOV r0,r10 ;441
00028e f7fff7ff BL OS_CPU_SR_Restore
000292 f8c5f8c5 STR r9,[r5,#0] ;442
000296 f888f888 STRB r11,[r8,#0] ;443
00029a 4638 MOV r0,r7 ;444
00029c e7a8 B |L1.496|
|L1.670|
00029e 4961 LDR r1,|L1.1060|
0002a0 f040f040 ORR r0,r0,#0x80 ;458
0002a4 6a49 LDR r1,[r1,#0x24] ;458 ; OSTCBCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -