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

📄 semalib.s

📁 VxWorks BSP框架源代码包含头文件和驱动
💻 S
📖 第 1 页 / 共 2 页
字号:
	bt	semQGetCheckTrg	jsr	@r0;			/* _evtLogM1 (evtId, semId) */	nopsemQGetCheckTrg:	/* check if we need to evaluate trigger for this event */	mov.l	QG_TrgEvtClass,r1;	mov.l	QG_TRG_CLASS_2_ON,r2;	mov.l	@r1,r0;			mov	#0,r7;	/* r7: NULL */	and	r2,r0	cmp/eq	r2,r0	bf	semQGetInstDone	/*            r4    r5    r6   r7 +0 +4 +8 +12 */	/* trgCheck (evtID,index,semID, 0, 0, 0, 0, 0) */					mov.l	@sp,r6	/* r6: semId */					mov.l	r7,@-sp					mov.l	r7,@-sp					mov.l	r7,@-sp	mov.l	QG_TrgCheck,r1;		mov.l	r7,@-sp	mov.l	@r1,r0;			mov.l	Event_Obj_SemGive,r4	jsr	@r0;			mov	#TRG_CLASS2_INDEX,r5					add	#16,sp	/* pop params */semQGetInstDone:	mov.l	@sp+,r4	mov.l	@sp+,r7	lds.l	@sp+,prnoSemQGetEvt:	/* windview instrumentation - END */#endif	ldc	r7,sr			/* UNLOCK INTERRUPTS */	mov.l	WindPendQGet,r1;	sts.l	pr,@-sp	jsr	@r1;			/* unblock someone */	add	#SEM_Q_HEAD,r4		/*     r4: pointer to qHead */	mov.l	WindExit,r0;	jsr	@r0;			/* KERNEL EXIT */	nop	lds.l	@sp+,pr	rts;	mov	#0,r0			/* XXX: windExit sets d0, so this could					 *      be nop. see 68k code. */			.align	2WindPendQGet:		.long	_windPendQGet#ifdef	WV_INSTRUMENTATIONEvent_Obj_SemGive:	.long	EVENT_OBJ_SEMGIVE	/* eventP.h */				/* CLASS2_EVENT(20) = (MIN_CLASS2_ID + 20) */				/*                  = (600 + 20)	*/				/*		    = 620 = 0x26c	*/QG_WvEvtClass:		.long	_wvEvtClassQG_WV_CLASS_2_ON:	.long   WV_CLASS_2_ONQG_TrgCheck:		.long	__func_trgCheckQG_TrgEvtClass:		.long	_trgEvtClassQG_TRG_CLASS_2_ON:	.long	TRG_CLASS_2_ON	#endif/******************************************************************************** semTakeGlobal**/	.align	_ALIGN_TEXT	.type	semTakeGlobal,@functionsemTakeGlobal:				/* r4: semId, r5: timeout         */	mov.l	SmObjPoolMinusOne,r1;	mov.l	@r1,r0;	add	r0,r4			/* convert id to local adress     */	mov.l	@(4,r4),r0;		/* get semaphore type in r0       */	mov.l	SemTakeTbl,r1;		/* r1 = semaphore take table      */	and	#0x7,r0			/* mask r0 to MAX_SEM_TYPE value  */	shll2	r0			/* scale r0 by sizeof (FUNCPTR)   */	mov.l	@(r0,r1),r2;		/* r2 = appropriate take function */	jmp	@r2;			/* invoke take rtn, it will do rts */	nop				/* r4: smObjSemId, r5: timeout     *//******************************************************************************** semTakeNotBinary**/	.align	_ALIGN_TEXT	.type	semTakeNotBinary,@functionsemTakeNotBinary:	mov.l	SemTakeTbl,r1;		/* get address of take routine table */	and	#0x7,r0			/* mask r0 to sane value             */	shll2	r0			/* scale r0 by sizeof (FUNCPTR)      */	mov.l	@(r0,r1),r2;		/* get right take rtn for this class */	jmp	@r2;			/* invoke take rtn, it will do rts   */	nop				/* r4: semId, r5: timeout            */			.align	2SmObjPoolMinusOne:	.long	_smObjPoolMinusOneSemTakeTbl:		.long	_semTakeTbl/******************************************************************************** semTake - take a semaphore** STATUS semTake*     (*     SEM_ID semId,		/@ semaphore id to take @/*     ULONG  timeout		/@ timeout in ticks @/*     )*/	.align	_ALIGN_TEXT	.type	_semTake,@function					/* r4: semId */_semTake:				/* r5: timeout */	mov	r4,r0	tst	#0x1,r0	bf	semTakeGlobal		/* if semId lsb = 1 its a global sem */#ifdef	WV_INSTRUMENTATION	/* windview instrumentation - BEGIN	 * semTake level 1 (object status event )	 */		mov.l	EvtAction,r1;		/* is level 1 event collection on? */	mov.l	@r1,r0;	tst	r0,r0	bt	noSemTakeEvt 	mov.l	SemClass,r1;	mov.l	@r4,r3;			/* r3: semId->objCore */	cmp/eq	r1,r3			/* check validity */	bt	objOkTake		/* valid semaphore */	mov.l	SemInstClass,r1;	cmp/eq	r1,r3			/* check validity */	bf	noSemTakeEvt		/* invalid semaphore */objOkTake:				/* is this semaphore object instrumented? */	sts.l	pr,@-sp;		mov.l	@(SEM_INST_RTN,r3),r2;	mov.l	r5,@-sp;		tst	r2,r2	mov.l	r4,@-sp;		bt	semTakeCheckTrg	/* Check if we need to log this event */	mov.l	ST_WvEvtClass,r1;	mov.l	ST_WV_CLASS_3_ON,r5;	mov.l	@r1,r0;			mov	#0,r1	/* r1: NULL */	and	r5,r0	cmp/eq	r5,r0	bf	semTakeCheckTrg	/* log event for this object (EVT_OBJ_3, see eventP.h) */	/* __evtRtn__ (evtId,nParam,semId,state,recur, 0, 0) */	/* __evtRtn__ ( r4     r5    r6    r7    +0   +4 +8) */					mov.l	r1,@-sp					mov.l	r1,@-sp					mov.w	@(SEM_RECURSE,r4),r0;	mov.l	@(SEM_STATE,r4),r7;	mov.l	r0,@-sp					mov	r4,r6					mov.l	Event_SemTake,r4;	jsr	@r2;			mov	#3,r5					add	#12,sp	/* pop params */semTakeCheckTrg:	/* check if we need to evaluate trigger for this event */	mov.l	ST_TrgEvtClass,r1;	mov.l	ST_TRG_CLASS_3_ON,r2;	mov.l	@r1,r0;			mov	#0,r1;	/* r1: NULL */	and	r2,r0	cmp/eq	r2,r0	bf	semTakeInstDone	/* trgCheck (event,index,semID,semID,state,recur, 0,   0) */	/* trgCheck ( r4    r5    r6    r7    +0    +4   +8  +12) */					mov.l	@sp,r6;	/* r6: semId */	mov.l	r1,@-sp;		mov.w	@(SEM_RECURSE,r6),r0;	mov.l	r1,@-sp;		mov.l	@(SEM_STATE,r6),r1;	mov.l	r0,@-sp	mov.l	r1,@-sp	mov.l	ST_TrgCheck,r1;		mov	r6,r7	mov.l	@r1,r0;			mov.l	Event_SemTake,r4	jsr	@r0;			mov	#TRG_CLASS3_INDEX,r5	add	#16,sp	/* pop params */semTakeInstDone:	mov.l	@sp+,r4	mov.l	@sp+,r5	lds.l	@sp+,pr	noSemTakeEvt:	/* windview instrumentation - END */#endif 	 	mov.b	@(SEM_TYPE,r4),r0;	/* get semaphore class into r0 */	tst	r0,r0	bf	semTakeNotBinary	/* optimize binary semaphore r0 == 0 */		/* BINARY SEMAPHORE OPTIMIZATION */		.type	_semBTake,@function_semBTake:					/* r4: semId */		mov.l	ST_IntCnt,r3;#if		(CPU==SH7600 || CPU==SH7000)		mov.l	IntLockSR,r1;		mov.l	@r3,r3;		mov.l	@r1,r0;		cmp/pl	r3		bt	semBTakeIntRestrict		stc	sr,r7			/* r7: old sr */		ldc	r0,sr			/* LOCK INTERRUPTS */#else		mov.l	IntLockMask,r2;		mov.l	@r3,r3;		mov.w	XFF0F,r1;		/* r1: 0xffffff0f */		cmp/pl	r3		mov.l	@r2,r0;			/* r0: 0x000000m0 */		bt	semBTakeIntRestrict		stc	sr,r7			/* r7: 0x?___?_?_ */		and	r7,r1			/* r1: 0x?___?_0_ */		or	r0,r1			/* r1: 0x?___?_m_ */		ldc	r1,sr			/* LOCK INTERRUPTS */#endif		mov.l	@r4,r1;		mov.l	SemClass,r0		/* r0: &_semClass(=semClassId)*/		cmp/eq	r0,r1			/* check validity */#ifdef		WV_INSTRUMENTATION		bt	objOkBTake 		/* windview - check the validity of instrumented class */		mov.l	SemInstClass,r0;		cmp/eq	r0,r1		bf	semBTakeInvalidUnlock	/* invalid semaphore */objOkBTake:#else		bf	semBTakeInvalidUnlock	/* invalid semaphore */#endif		mov.l	@(SEM_STATE,r4),r0;		tst	r0,r0			/* test for owner */		bf	_semQPut		/* if sem is owned we block */		mov.l	TaskIdCurrent,r2;		mov.l	@r2,r1;		mov.l	r1,@(SEM_STATE,r4)#if		(CPU==SH7600 || CPU==SH7000)		rts;		ldc	r7,sr#else		ldc	r7,sr			/* UNLOCK INTERRUPTS */		rts;				/* r0 is 0 for return(OK) */		nop#endifsemBTakeIntRestrict:	mov.l	ST_SemIntRestrict,r0;	jmp	@r0;			/* let C do the work */	nopsemBTakeInvalidUnlock:			/* r4: semId */	mov.l	ST_SemInvalid,r0;#if (CPU==SH7600 || CPU==SH7000)	jmp	@r0;	ldc	r7,sr#else	ldc	r7,sr			/* UNLOCK INTERRUPTS */	jmp	@r0;			/* let C rtn do work and rts */	nop#endif /* (CPU==SH7600 || CPU==SH7000) */			.align	2ST_IntCnt:		.long	_intCntTaskIdCurrent:		.long	_taskIdCurrentST_SemIntRestrict:	.long	_semIntRestrictST_SemInvalid:		.long	_semInvalid#ifdef	WV_INSTRUMENTATIONEvtAction:		.long	_evtActionSemInstClass:		.long	_semInstClassEvent_SemTake:		.long	EVENT_SEMTAKE	/* CLASS3_EVENT(15) (eventP.h)*/ST_WvEvtClass:		.long	_wvEvtClassST_WV_CLASS_3_ON:	.long   WV_CLASS_3_ON	/* 0x10000007 (eventP.h) */ST_TrgCheck:		.long	__func_trgCheckST_TrgEvtClass:		.long	_trgEvtClassST_TRG_CLASS_3_ON:	.long	TRG_CLASS_3_ON	/* 0x10000100 (eventP.h) */#endifXFF0F:			.word	0xff0f/******************************************************************************** semQPut - block current task on the semaphore queue head** INTERNAL:	This routine is called from '_semBTake' and '_semCTake'.*/	.align	_ALIGN_TEXT	.type	_semQPut,@function					/* r7: old sr  */					/* r5: timeout */_semQPut:				/* r4: semId   */	mov.l	KernelState,r1;	mov	#1,r0	mov.l	r0,@r1			/* KERNEL ENTER */#ifdef  WV_INSTRUMENTATION	/* windview instrumentation - BEGIN	 * semQPut level 2 (task transition state event, EVT_TASK_1 )	 */	mov.l	QP_EvtAction,r1;	/* is level 1 event collection on? */	mov.l	@r1,r0;	tst	r0,r0	bt	noSemQPutEvt						/* Check if we need to log this event */	sts.l	pr,@-sp;		mov.l	QP_WvEvtClass,r1;	mov.l	r7,@-sp;		mov.l	@r1,r0;	mov.l	r5,@-sp;		mov.l	QP_WV_CLASS_2_ON,r1;	mov.l	r4,@-sp;		and	r1,r0					cmp/eq	r1,r0					bf	semQPutCheckTrg	mov.l	Func_EvtLogM1,r1;	mov	r4,r5	mov.l	@r1,r0;			mov.l	Event_Obj_SemTake,r4;	tst	r0,r0	bt	semQPutCheckTrg	jsr	@r0;			/* evtLogM1 (evtID,semId) */	nopsemQPutCheckTrg:		/* check if we need to evaluate trigger for this event */	mov.l  QP_TrgEvtClass,r1;	mov.l  QP_TRG_CLASS_2_ON,r2;	mov.l  @r1,r0;			mov	#0,r7	/* r7: NULL */	and    r2,r0	cmp/eq r2,r0	bf     semQPInstDone	/*            r4    r5    r6   r7 +0 +4 +8 +12 */	/* trgCheck (evtID,index,semID, 0, 0, 0, 0, 0) */					mov.l	@sp,r6;	/* r6: semId */					mov.l	r7,@-sp					mov.l	r7,@-sp					mov.l	r7,@-sp	mov.l	QP_TrgCheck,r1;		mov.l	r7,@-sp	mov.l	@r1,r0;			mov.l	Event_Obj_SemTake,r4	jsr	@r0;			mov	#TRG_CLASS2_INDEX,r5					add	#16,sp	/* pop params */semQPInstDone:	mov.l	@sp+,r4	mov.l	@sp+,r5	mov.l	@sp+,r7	lds.l	@sp+,pr	noSemQPutEvt:	/* windview instrumentation - END */#endif	ldc	r7,sr			/* UNLOCK INTERRUPTS */	sts.l	pr,@-sp			/* save return address */	mov.l	r4,@-sp			/* save semId   */	mov.l	r5,@-sp			/* save timeout */	mov.l	WindPendQPut,r0;	jsr	@r0;			/* block on the semaphore  */	add	#SEM_Q_HEAD,r4		/*	r4: &semId->qHead  */					/*	r5: timeout        */	mov.l	WindExit,r6;	tst	r0,r0			/* if (windPendQPut != OK) */	bf	semQPutFail		/*      put failed         */	jsr	@r6;			/* else KERNEL EXIT        */	nop	cmp/eq	#0x1,r0			/* test windExit */	bt	semRestart		/* RESTART */	add	#8,sp			/* tidy up */	lds.l	@sp+,pr			/* and restore return address */	rts;				/* done, return exit status in r0 */	nopsemQPutFail:	jsr	@r6;			/* KERNEL EXIT */	add	#8,sp			/* tidy up */	lds.l	@sp+,pr			/* and restore return address */	rts;				/* return to sender */	mov	#-1,r0			/* return ERROR */semRestart:	mov.l	Func_sigTimeoutRecalc,r1;	mov.l	@r1,r0;	jsr	@r0;			/* recalc the timeout */	mov.l	@sp+,r4			/*      r4: timeout   */	mov.l	@sp+,r4			/* restore semId */	lds.l	@sp+,pr			/* restore return address */	bra	_semTake;		/* start the whole thing over */	mov	r0,r5			/* update timeout */			.align	2WindPendQPut:		.long	_windPendQPutFunc_sigTimeoutRecalc:	.long	__func_sigTimeoutRecalc#ifdef WV_INSTRUMENTATIONQP_EvtAction:		.long	_evtActionFunc_EvtLogM1:		.long	__func_evtLogM1Event_Obj_SemTake:	.long	EVENT_OBJ_SEMTAKEQP_WvEvtClass:		.long	_wvEvtClassQP_WV_CLASS_2_ON:	.long   WV_CLASS_2_ONQP_TrgCheck:		.long	__func_trgCheckQP_TrgEvtClass:		.long	_trgEvtClassQP_TRG_CLASS_2_ON:	.long	TRG_CLASS_2_ON	#endif /*WV_INSTRUMENTATION*/SemClass:		.long	_semClassKernelState:		.long	_kernelStateWindExit:		.long	_windExit#if (CPU==SH7600 || CPU==SH7000)IntLockSR:		.long	_intLockTaskSR#elseIntLockMask:		.long	_intLockMask#endif/******************************************************************************** semOTake - VxWorks 4.x semTake** Optimized version of semOTake.  This inserts the necessary argument of* WAIT_FOREVER for semBTake.* STATUS semOTake*     (*     SEM_ID semId	/@ semaphore ID to take @/*     )*     {*     return (semBTake (semId, WAIT_FOREVER));*     }*/	.align	2	.type	_semOTake,@function_semOTake:				/* r4: semId        */	bra	_semBTake;		/*     do semBTake  */	mov	#-1,r5			/* r5: WAIT_FOREVER *//******************************************************************************** semClear - VxWorks 4.x semClear** Optimized version of semClear.  This inserts the necessary argument of* NO_WAIT for semBTake.* STATUS semClear*     (*     SEM_ID semId	/@ semaphore ID to empty @/*     )*     {*     return (semBTake (semId, NO_WAIT));*     }*/	.align	2	.type	_semClear,@function_semClear:				/* r4: semId       */	bra	_semBTake;		/*     do semBTake */	mov	#0,r5			/* r5: NO_WAIT     */#endif	/* !PORTABLE */

⌨️ 快捷键说明

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