📄 os_mutex.lst
字号:
\ 026C 7FE3 XOR.B #-1,R15
\ 026E C2FF0000 AND.B R15,&OSRdyGrp
\ 0272 ?0110:
349 }
350 rdy = TRUE;
\ 0272 5F43 MOV.B #1,R15
351 } else {
\ 0274 013C JMP (?0111)
\ 0276 ?0108:
352 rdy = FALSE; /* No */
\ 0276 4F43 MOV.B #0,R15
\ 0278 ?0111:
353 }
354 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
\ 0278 CD4C1D00 MOV.B R12,29(R13)
355 ptcb->OSTCBY = ptcb->OSTCBPrio >> 3;
\ 027C 584D1D00 MOV.B 29(R13),R8
\ 0280 12C3 CLRC
\ 0282 4810 RRC.B R8
\ 0284 4811 RRA.B R8
\ 0286 4811 RRA.B R8
\ 0288 CD481F00 MOV.B R8,31(R13)
356 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
\ 028C 584D1F00 MOV.B 31(R13),R8
\ 0290 DD480000 MOV.B OSMapTbl(R8),33(R13)
\ 0294 2100
357 ptcb->OSTCBX = ptcb->OSTCBPrio & 0x07;
\ 0296 584D1D00 MOV.B 29(R13),R8
\ 029A 78F00700 AND.B #7,R8
\ 029E CD481E00 MOV.B R8,30(R13)
358 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
\ 02A2 584D1E00 MOV.B 30(R13),R8
\ 02A6 DD480000 MOV.B OSMapTbl(R8),32(R13)
\ 02AA 2000
359 if (rdy == TRUE) { /* If task was ready at owner's priority ...*/
\ 02AC 5F93 CMP.B #1,R15
\ 02AE 0820 JNE (?0113)
360 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
\ 02B0 D2DD2100 BIS.B 33(R13),&OSRdyGrp
\ 02B4 0000
361 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
\ 02B6 5F4D1F00 MOV.B 31(R13),R15
\ 02BA DFDD2000 BIS.B 32(R13),OSRdyTbl(R15)
\ 02BE 0000
\ 02C0 ?0113:
362 }
363 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
\ 02C0 0C5C ADD R12,R12
\ 02C2 8C4D0000 MOV R13,OSTCBPrioTbl(R12)
\ 02C6 ?0104:
364 }
365 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
\ 02C6 1C420000 MOV &OSTCBCur,R12
\ 02CA FCD01000 BIS.B #16,28(R12)
\ 02CE 1C00
366 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
\ 02D0 1C420000 MOV &OSTCBCur,R12
\ 02D4 8C4E1A00 MOV R14,26(R12)
367 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
\ 02D8 0C4A MOV R10,R12
\ 02DA B0120000 CALL #OS_EventTaskWait
368 OS_EXIT_CRITICAL();
\ 02DE 32D2 EINT
369 OS_Sched(); /* Find next highest priority task ready */
\ 02E0 B0120000 CALL #OS_Sched
370 OS_ENTER_CRITICAL();
\ 02E4 32C2 DINT
371 if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
\ 02E6 1C420000 MOV &OSTCBCur,R12
\ 02EA FCB01000 BIT.B #16,28(R12)
\ 02EE 1C00
\ 02F0 0824 JEQ (?0115)
372 OS_EventTO(pevent);
\ 02F2 0C4A MOV R10,R12
\ 02F4 B0120000 CALL #OS_EventTO
373 OS_EXIT_CRITICAL();
\ 02F8 32D2 EINT
374 *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
\ 02FA FB400A00 MOV.B #10,0(R11)
\ 02FE 0000
375 return;
376 }
\ 0300 073C JMP (?0116)
\ 0302 ?0115:
377 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
\ 0302 1C420000 MOV &OSTCBCur,R12
\ 0306 8C431200 MOV #0,18(R12)
378 OS_EXIT_CRITICAL();
\ 030A 32D2 EINT
379 *err = OS_NO_ERR;
\ 030C CB430000 MOV.B #0,0(R11)
380 }
\ 0310 ?0116:
\ 0310 3841 POP R8
\ 0312 3B41 POP R11
\ 0314 3A41 POP R10
\ 0316 3041 RET
\ 0318 OSMutexPost:
381 /*$PAGE*/
382 /*
383 *********************************************************************************************************
384 * POST TO A MUTUAL EXCLUSION SEMAPHORE
385 *
386 * Description: This function signals a mutual exclusion semaphore
387 *
388 * Arguments : pevent is a pointer to the event control block associated with the desired
389 * mutex.
390 *
391 * Returns : OS_NO_ERR The call was successful and the mutex was signaled.
392 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex
393 * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
394 * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes)
395 * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX.
396 *********************************************************************************************************
397 */
398
399 INT8U OSMutexPost (OS_EVENT *pevent)
400 {
\ 0318 0A12 PUSH R10
\ 031A 0A4C MOV R12,R10
401 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
402 OS_CPU_SR cpu_sr;
403 #endif
404 INT8U pip; /* Priority inheritance priority */
405 INT8U prio;
406
407
408 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 031C C2930000 CMP.B #0,&OSIntNesting
\ 0320 0324 JEQ (?0118)
409 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
\ 0322 7C400500 MOV.B #5,R12
410 }
\ 0326 933C JMP (?0133)
\ 0328 ?0118:
411 #if OS_ARG_CHK_EN > 0
412 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 0328 0A93 CMP #0,R10
\ 032A 6C42 MOV.B #4,R12
\ 032C 9024 JEQ (?0133)
413 return (OS_ERR_PEVENT_NULL);
414 }
415 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ 032E 6C9A CMP.B @R10,R12
\ 0330 0224 JEQ (?0122)
416 return (OS_ERR_EVENT_TYPE);
\ 0332 5C43 MOV.B #1,R12
417 }
\ 0334 8C3C JMP (?0133)
\ 0336 ?0122:
418 #endif
419 OS_ENTER_CRITICAL();
\ 0336 32C2 DINT
420 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
\ 0338 1D4A0200 MOV 2(R10),R13
\ 033C 8D10 SWPB R13
\ 033E 7DF3 AND.B #-1,R13
421 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
\ 0340 1C4A0200 MOV 2(R10),R12
\ 0344 7CF3 AND.B #255,R12
422 if (OSTCBCur->OSTCBPrio != pip &&
423 OSTCBCur->OSTCBPrio != prio) { /* See if posting task owns the MUTEX */
\ 0346 1E420000 MOV &OSTCBCur,R14
\ 034A 5D9E1D00 CMP.B 29(R14),R13
\ 034E 0924 JEQ (?0124)
\ 0350 1E420000 MOV &OSTCBCur,R14
\ 0354 5C9E1D00 CMP.B 29(R14),R12
\ 0358 0424 JEQ (?0124)
424 OS_EXIT_CRITICAL();
\ 035A 32D2 EINT
425 return (OS_ERR_NOT_MUTEX_OWNER);
\ 035C 7C407800 MOV.B #120,R12
426 }
\ 0360 763C JMP (?0133)
\ 0362 ?0124:
427 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
\ 0362 1E420000 MOV &OSTCBCur,R14
\ 0366 5D9E1D00 CMP.B 29(R14),R13
\ 036A 4D20 JNE (?0128)
428 /* Yes, Return to original priority */
429 /* Remove owner from ready list at 'pip' */
430 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
\ 036C 1E420000 MOV &OSTCBCur,R14
\ 0370 5E4E1F00 MOV.B 31(R14),R14
\ 0374 1F420000 MOV &OSTCBCur,R15
\ 0378 5F4F2000 MOV.B 32(R15),R15
\ 037C 7FE3 XOR.B #-1,R15
\ 037E CEFF0000 AND.B R15,OSRdyTbl(R14)
\ 0382 CE930000 CMP.B #0,OSRdyTbl(R14)
\ 0386 0720 JNE (?0130)
431 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
\ 0388 1E420000 MOV &OSTCBCur,R14
\ 038C 5E4E2100 MOV.B 33(R14),R14
\ 0390 7EE3 XOR.B #-1,R14
\ 0392 C2FE0000 AND.B R14,&OSRdyGrp
\ 0396 ?0130:
432 }
433 OSTCBCur->OSTCBPrio = prio;
\ 0396 1E420000 MOV &OSTCBCur,R14
\ 039A CE4C1D00 MOV.B R12,29(R14)
434 OSTCBCur->OSTCBY = prio >> 3;
\ 039E 0E4C MOV R12,R14
\ 03A0 12C3 CLRC
\ 03A2 4E10 RRC.B R14
\ 03A4 4E11 RRA.B R14
\ 03A6 4E11 RRA.B R14
\ 03A8 1F420000 MOV &OSTCBCur,R15
\ 03AC CF4E1F00 MOV.B R14,31(R15)
435 OSTCBCur->OSTCBBitY = OSMapTbl[OSTCBCur->OSTCBY];
\ 03B0 1E420000 MOV &OSTCBCur,R14
\ 03B4 5E4E1F00 MOV.B 31(R14),R14
\ 03B8 1F420000 MOV &OSTCBCur,R15
\ 03BC DF4E0000 MOV.B OSMapTbl(R14),33(R15)
\ 03C0 2100
436 OSTCBCur->OSTCBX = prio & 0x07;
\ 03C2 0E4C MOV R12,R14
\ 03C4 7EF00700 AND.B #7,R14
\ 03C8 1F420000 MOV &OSTCBCur,R15
\ 03CC CF4E1E00 MOV.B R14,30(R15)
437 OSTCBCur->OSTCBBitX = OSMapTbl[OSTCBCur->OSTCBX];
\ 03D0 1E420000 MOV &OSTCBCur,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -