⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_mutex.s43

📁 IAR project for MSP430 and uC/OS. All configured to start filling with tasks.
💻 S43
📖 第 1 页 / 共 3 页
字号:
; 371.	    if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
	MOV	&OSTCBCur,R12	
	BIT.B	#16,28(R12)	
	JEQ	(?0115)	
; 372.	        OS_EventTO(pevent);
	MOV	R10,R12	
	CALL	#OS_EventTO	
; 373.	        OS_EXIT_CRITICAL();
	EINT		
; 374.	        *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
	MOV.B	#10,0(R11)	
; 375.	        return;
; 376.	    }
	JMP	(?0116)	
?0115:
; 377.	    OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
	MOV	&OSTCBCur,R12	
	MOV	#0,18(R12)	
; 378.	    OS_EXIT_CRITICAL();
	EINT		
; 379.	    *err = OS_NO_ERR;
	MOV.B	#0,0(R11)	
; 380.	}
?0116:
	POP	R8	
	POP	R11	
	POP	R10	
	RET		
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.	{
	PUSH	R10	
	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 ...                    */
	CMP.B	#0,&OSIntNesting	
	JEQ	(?0118)	
; 409.	        return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
	MOV.B	#5,R12	
; 410.	    }
	JMP	(?0133)	
?0118:
; 411.	#if OS_ARG_CHK_EN > 0
; 412.	    if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
	CMP	#0,R10	
	MOV.B	#4,R12	
	JEQ	(?0133)	
; 413.	        return (OS_ERR_PEVENT_NULL);
; 414.	    }
; 415.	    if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
	CMP.B	@R10,R12	
	JEQ	(?0122)	
; 416.	        return (OS_ERR_EVENT_TYPE);
	MOV.B	#1,R12	
; 417.	    }                                                 
	JMP	(?0133)	
?0122:
; 418.	#endif
; 419.	    OS_ENTER_CRITICAL();
	DINT		
; 420.	    pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
	MOV	2(R10),R13	
	SWPB	R13	
	AND.B	#-1,R13	
; 421.	    prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
	MOV	2(R10),R12	
	AND.B	#255,R12	
; 422.	    if (OSTCBCur->OSTCBPrio != pip && 
; 423.	        OSTCBCur->OSTCBPrio != prio) {                /* See if posting task owns the MUTEX            */
	MOV	&OSTCBCur,R14	
	CMP.B	29(R14),R13	
	JEQ	(?0124)	
	MOV	&OSTCBCur,R14	
	CMP.B	29(R14),R12	
	JEQ	(?0124)	
; 424.	        OS_EXIT_CRITICAL();
	EINT		
; 425.	        return (OS_ERR_NOT_MUTEX_OWNER);
	MOV.B	#120,R12	
; 426.	    }
	JMP	(?0133)	
?0124:
; 427.	    if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
	MOV	&OSTCBCur,R14	
	CMP.B	29(R14),R13	
	JNE	(?0128)	
; 428.	                                                      /* Yes, Return to original priority              */
; 429.	                                                      /*      Remove owner from ready list at 'pip'    */
; 430.	        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
	MOV	&OSTCBCur,R14	
	MOV.B	31(R14),R14	
	MOV	&OSTCBCur,R15	
	MOV.B	32(R15),R15	
	XOR.B	#-1,R15	
	AND.B	R15,OSRdyTbl(R14)	
	CMP.B	#0,OSRdyTbl(R14)	
	JNE	(?0130)	
; 431.	            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
	MOV	&OSTCBCur,R14	
	MOV.B	33(R14),R14	
	XOR.B	#-1,R14	
	AND.B	R14,&OSRdyGrp	
?0130:
; 432.	        }
; 433.	        OSTCBCur->OSTCBPrio         = prio;
	MOV	&OSTCBCur,R14	
	MOV.B	R12,29(R14)	
; 434.	        OSTCBCur->OSTCBY            = prio >> 3;
	MOV	R12,R14	
	CLRC		
	RRC.B	R14	
	RRA.B	R14	
	RRA.B	R14	
	MOV	&OSTCBCur,R15	
	MOV.B	R14,31(R15)	
; 435.	        OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
	MOV	&OSTCBCur,R14	
	MOV.B	31(R14),R14	
	MOV	&OSTCBCur,R15	
	MOV.B	OSMapTbl(R14),33(R15)	
; 436.	        OSTCBCur->OSTCBX            = prio & 0x07;
	MOV	R12,R14	
	AND.B	#7,R14	
	MOV	&OSTCBCur,R15	
	MOV.B	R14,30(R15)	
; 437.	        OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
	MOV	&OSTCBCur,R14	
	MOV.B	30(R14),R14	
	MOV	&OSTCBCur,R15	
	MOV.B	OSMapTbl(R14),32(R15)	
; 438.	        OSRdyGrp                   |= OSTCBCur->OSTCBBitY;
	MOV	&OSTCBCur,R14	
	BIS.B	33(R14),&OSRdyGrp	
; 439.	        OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
	MOV	&OSTCBCur,R14	
	MOV.B	31(R14),R14	
	MOV	&OSTCBCur,R15	
	BIS.B	32(R15),OSRdyTbl(R14)	
; 440.	        OSTCBPrioTbl[prio]          = (OS_TCB *)OSTCBCur;
	ADD	R12,R12	
	MOV	&OSTCBCur,OSTCBPrioTbl(R12)	
?0128:
; 441.	    }
; 442.	    OSTCBPrioTbl[pip] = (OS_TCB *)1;                  /* Reserve table entry                           */
	ADD	R13,R13	
	MOV	#1,OSTCBPrioTbl(R13)	
; 443.	    if (pevent->OSEventGrp != 0x00) {                 /* Any task waiting for the mutex?               */
	CMP.B	#0,1(R10)	
	JEQ	(?0132)	
; 444.	                                                      /* Yes, Make HPT waiting for mutex ready         */
; 445.	        prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
	PUSH.B	#16	
	MOV	#0,R14	
	MOV	R10,R12	
	CALL	#OS_EventTaskRdy	
	ADD	#2,SP	
; 446.	        pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
	AND	#65280,2(R10)	
; 447.	        pevent->OSEventCnt |= prio;
	MOV.B	R12,R13	
	BIS	R13,2(R10)	
; 448.	        pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to mutex owner's OS_TCB             */
	AND.B	#-1,R12	
	ADD	R12,R12	
	MOV	OSTCBPrioTbl(R12),4(R10)	
; 449.	        OS_EXIT_CRITICAL();
	EINT		
; 450.	        OS_Sched();                                   /*      Find highest priority task ready to run  */
	CALL	#OS_Sched	
; 451.	        return (OS_NO_ERR);
	MOV.B	#0,R12	
; 452.	    }
	JMP	(?0133)	
?0132:
; 453.	    pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
	BIS	#255,2(R10)	
; 454.	    pevent->OSEventPtr  = (void *)0;
	MOV	#0,4(R10)	
; 455.	    OS_EXIT_CRITICAL();
	EINT		
; 456.	    return (OS_NO_ERR);
	MOV.B	#0,R12	
; 457.	}
?0133:
	POP	R10	
	RET		
OSMutexQuery:
; 458.	/*$PAGE*/
; 459.	/*
; 460.	*********************************************************************************************************
; 461.	*                                     QUERY A MUTUAL EXCLUSION SEMAPHORE
; 462.	*
; 463.	* Description: This function obtains information about a mutex
; 464.	*
; 465.	* Arguments  : pevent        is a pointer to the event control block associated with the desired mutex
; 466.	*
; 467.	*              pdata         is a pointer to a structure that will contain information about the mutex
; 468.	*
; 469.	* Returns    : OS_NO_ERR            The call was successful and the message was sent
; 470.	*              OS_ERR_QUERY_ISR     If you called this function from an ISR
; 471.	*              OS_ERR_PEVENT_NULL   'pevent' is a NULL pointer
; 472.	*              OS_ERR_EVENT_TYPE    If you are attempting to obtain data from a non mutex.
; 473.	*********************************************************************************************************
; 474.	*/
; 475.	
; 476.	#if OS_MUTEX_QUERY_EN > 0
; 477.	INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdata)
; 478.	{
; 479.	#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
; 480.	    OS_CPU_SR  cpu_sr;
; 481.	#endif    
; 482.	    INT8U     *psrc;
; 483.	    INT8U     *pdest;
; 484.	
; 485.	
; 486.	    if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
	CMP.B	#0,&OSIntNesting	
	JEQ	(?0135)	
; 487.	        return (OS_ERR_QUERY_ISR);                         /* ... can't QUERY mutex from an ISR        */
	MOV.B	#6,R12	
; 488.	    }
	RET		
?0135:
; 489.	#if OS_ARG_CHK_EN > 0
; 490.	    if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
	CMP	#0,R12	
	JNE	(?0137)	
; 491.	        return (OS_ERR_PEVENT_NULL);
	MOV.B	#4,R12	
; 492.	    }
	RET		
?0137:
; 493.	    if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
	MOV.B	#4,R13	
	CMP.B	@R12,R13	
	JEQ	(?0139)	
; 494.	        return (OS_ERR_EVENT_TYPE);
	MOV.B	#1,R12	
; 495.	    }
	RET		
?0139:
; 496.	#endif
; 497.	    OS_ENTER_CRITICAL();
	DINT		
; 498.	    pdata->OSMutexPIP  = (INT8U)(pevent->OSEventCnt >> 8);
	MOV	2(R12),R13	
	SWPB	R13	
	AND.B	#-1,R13	
	MOV.B	R13,5(R14)	
; 499.	    pdata->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
	MOV	2(R12),R13	
	AND.B	#255,R13	
	MOV.B	R13,4(R14)	
; 500.	    if (pdata->OSOwnerPrio == 0xFF) {
	CMP.B	#255,4(R14)	
	JNE	(?0141)	
; 501.	        pdata->OSValue = 1;
	MOV.B	#1,3(R14)	
; 502.	    } else {
	JMP	(?0142)	
?0141:
; 503.	        pdata->OSValue = 0;
	MOV.B	#0,3(R14)	
?0142:
; 504.	    }
; 505.	    pdata->OSEventGrp  = pevent->OSEventGrp;               /* Copy wait list                           */
	MOV.B	1(R12),2(R14)	
; 506.	    psrc               = &pevent->OSEventTbl[0];
	ADD	#6,R12	
; 507.	    pdest              = &pdata->OSEventTbl[0];
	MOV	R14,R13	
; 508.	#if OS_EVENT_TBL_SIZE > 0
; 509.	    *pdest++           = *psrc++;
	MOV.B	@R12+,0(R13)	
	ADD	#1,R13	
; 510.	#endif
; 511.	
; 512.	#if OS_EVENT_TBL_SIZE > 1
; 513.	    *pdest++           = *psrc++;
	MOV.B	@R12+,0(R13)	
; 514.	#endif
; 515.	
; 516.	#if OS_EVENT_TBL_SIZE > 2
; 517.	    *pdest++           = *psrc++;
; 518.	#endif
; 519.	
; 520.	#if OS_EVENT_TBL_SIZE > 3
; 521.	    *pdest++           = *psrc++;
; 522.	#endif
; 523.	
; 524.	#if OS_EVENT_TBL_SIZE > 4
; 525.	    *pdest++           = *psrc++;
; 526.	#endif
; 527.	
; 528.	#if OS_EVENT_TBL_SIZE > 5
; 529.	    *pdest++           = *psrc++;
; 530.	#endif
; 531.	
; 532.	#if OS_EVENT_TBL_SIZE > 6
; 533.	    *pdest++           = *psrc++;
; 534.	#endif
; 535.	
; 536.	#if OS_EVENT_TBL_SIZE > 7
; 537.	    *pdest             = *psrc;
; 538.	#endif
; 539.	    OS_EXIT_CRITICAL();
	EINT		
; 540.	    return (OS_NO_ERR);
	MOV.B	#0,R12	
; 541.	}
	RET		
; 542.	#endif                                                     /* OS_MUTEX_QUERY_EN                        */
; 543.	#endif                                                     /* OS_MUTEX_EN                              */
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -