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

📄 rtos.c

📁 一个完整的rtos源代码.运行在嵌入80186 cpu上.提供4个任务,信号灯,定时器,schedule等.
💻 C
📖 第 1 页 / 共 4 页
字号:

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "preq_sem");
#endif

#ifndef NO_ERCHK
	if( (semid <= 0) || (semid > SEMMAX) )
	{
		error_trap( "preq_sem", E_ID );
		return E_ID;
	}
#endif

	scb	 = &semtbl[semid - 1];

	SRkeep = InterruptDisable();

	if ( scb->semcnt > 0 ) {
		scb->semcnt--;
		set_SR( SRkeep );
		return E_OK;
	}

	set_SR( SRkeep );

	return E_TMOUT;
}
#endif

#ifdef USED_CHECK_SEM//LeonH_0827_2003_a
/*-----------------------------------------------------------------------------
; check if Semaphore [R] been acquired
-----------------------------------------------------------------------------*/
ER check_sem( ID semid )
{

	T_SEMCB *scb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "check_sem");
#endif

#ifndef NO_ERCHK
	if( (semid <= 0) || (semid > SEMMAX) )
	{
		error_trap( "check_sem", E_ID );
		return E_ID;
	}
#endif

	scb	 = &semtbl[semid - 1];

	if ( scb->semcnt == 0 ) 
		return E_OK;
		
	return E_ID;	
}
#endif//USED_CHECK_SEM

#endif

#if FLGMAX
#ifdef USED_SET_FLG
/*-----------------------------------------------------------------------------
; Set Eventflag [S]
-----------------------------------------------------------------------------*/
ER set_flg( ID flgid, UINT setptn )
{
	T_FLGCB *fcb;
	T_TSKCB *tcb, *nexttcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

	BOOL	reqdsp;

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "set_flg");
#endif

#ifndef NO_ERCHK
	if( (flgid <= 0) || (flgid > FLGMAX) )
	{
		error_trap( "set_flg", E_ID );
		return E_ID;
	}
#endif

	fcb	 = &flgtbl[flgid - 1];

	reqdsp = FALSE;

	SRkeep = InterruptDisable();

	fcb->flgptn |= setptn;

	for( tcb = (T_TSKCB *)(fcb->queue.next);
		 (T_FLGCB *)tcb != fcb;
		 tcb = nexttcb )
	{
		nexttcb = (T_TSKCB *)(tcb->queue.next);
		if( ((tcb->wfmode & TWF_ORW) && (fcb->flgptn & tcb->waiptn)) ||
			((fcb->flgptn & tcb->waiptn) == tcb->waiptn) )
		{
			if( tcb->wfmode & TWF_CLR )
			{
				(UINT)(tcb->ans) = fcb->flgptn;
				fcb->flgptn = 0;
			}

			wakeup_task( E_OK, tcb, FALSE );

			reqdsp = TRUE;
		}
	}

	if( reqdsp )
	{
		dispatch();
	}

	set_SR( SRkeep );

	return E_OK;
}
#endif

#ifdef USED_CLR_FLG
/*-----------------------------------------------------------------------------
; Clear Eventflag [S]
-----------------------------------------------------------------------------*/
ER clr_flg( ID flgid, UINT clrptn )
{
	T_FLGCB *fcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "clr_flg");
#endif

#ifndef NO_ERCHK
	if( (flgid <= 0) || (flgid > FLGMAX) )
	{
		error_trap( "clr_flg", E_ID );
		return E_ID;
	}
#endif

	fcb	 = &flgtbl[flgid - 1];

	SRkeep = InterruptDisable();

	fcb->flgptn &= clrptn;

	set_SR( SRkeep );

	return E_OK;
}
#endif

#ifdef USED_WAI_FLG
/*-----------------------------------------------------------------------------
; Wait for Eventflag [S]
-----------------------------------------------------------------------------*/
ER wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
	T_FLGCB *fcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */
	ER		ercd;

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "wai_flg");
#endif

	*p_flgptn = 0;

#ifndef NO_ERCHK
	if( (flgid <= 0) || (flgid > FLGMAX) )
	{
		error_trap( "wai_flg", E_ID );
		return E_ID;
	}

	if( (wfmode > 3) || (waiptn == 0) || (p_flgptn == NULL) )
	{
		error_trap( "wai_flg", E_PAR );
		return E_PAR;
	}

	if( sysstat & (TSS_INDP | TSS_DDSP) )
	{
		error_trap( "wai_flg", E_CTX );
		return E_CTX;
	}
#endif

	fcb	 = &flgtbl[flgid - 1];

	SRkeep = InterruptDisable();

	if( ((wfmode & TWF_ORW) && (fcb->flgptn & waiptn)) ||
		((fcb->flgptn & waiptn) == waiptn) )
	{
		*p_flgptn = fcb->flgptn;

		if( wfmode & TWF_CLR )
			fcb->flgptn = 0;

		set_SR( SRkeep );
		return E_OK;
	}

	currentrun->waiptn = waiptn;
	currentrun->wfmode = wfmode;
	ercd = wait_task( TTW_FLG, (T_QUEUE *)fcb, TRUE );

	*p_flgptn = (UINT)(currentrun->ans);

	set_SR( SRkeep );

	return ercd;
}
#endif

#ifdef USED_POL_FLG
/*-----------------------------------------------------------------------------
; Wait for Eventflag (Polling) [S]
-----------------------------------------------------------------------------*/
ER pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
	T_FLGCB *fcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "pol_flg");
#endif

	*p_flgptn = 0;

#ifndef NO_ERCHK
	if( (flgid <= 0) || (flgid > FLGMAX) )
	{
		error_trap( "pol_flg", E_ID );
		return E_ID;
	}

	if( (wfmode > 3) || (waiptn == 0) || (p_flgptn == NULL) )
	{
		error_trap( "pol_flg", E_PAR );
		return E_PAR;
	}
#endif

	fcb	 = &flgtbl[flgid - 1];

	SRkeep = InterruptDisable();

	if( ((wfmode & TWF_ORW) && (fcb->flgptn & waiptn)) ||
		((fcb->flgptn & waiptn) == waiptn) )
	{
		*p_flgptn = fcb->flgptn;

		if( wfmode & TWF_CLR )
			fcb->flgptn = 0;

		set_SR( SRkeep );
		return E_OK;
	}

	set_SR( SRkeep );

	return E_TMOUT;
}
#endif
#endif

#if MAILMAX
#ifdef USED_SND_MSG
/*-----------------------------------------------------------------------------
; Send Message to Mailbox [S]
-----------------------------------------------------------------------------*/
ER snd_msg( ID mbxid, T_MSG *pk_msg )
{
	T_MSGCB	*mcb;
	T_TSKCB *tcb;
	INT nexttail;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "snd_msg");
#endif

#ifndef NO_ERCHK
	if( (mbxid <= 0) || (mbxid > MAILMAX) )
	{
		error_trap( "snd_msg", E_ID );
		return E_ID;
	}

	if( pk_msg == NULL )
	{
		error_trap( "snd_msg", E_PAR );
		return E_PAR;
	}
#endif

	mcb	 = &mailbox[mbxid - 1];

	SRkeep = InterruptDisable();

	if( (T_MSGCB *)(mcb->queue.next) != mcb )
	{
		tcb = (T_TSKCB *)(mcb->queue.next);
		tcb->ans = (VP*)pk_msg;
		wakeup_task( E_OK, tcb, TRUE );
		set_SR( SRkeep );
		return E_OK;
	}

	nexttail = (mcb->tail == MSGQUEMAX-1) ? 0 : (mcb->tail)+1;

#ifndef NO_ERCHK
	if( mcb->head == nexttail )
	{
#ifndef RTOS_DEBUG
		error_trap( "snd_msg", E_QOVR );
#endif
		set_SR( SRkeep );
		return E_QOVR;
	}
#endif

	mcb->msgque[ mcb->tail ] = pk_msg;
	mcb->tail = nexttail;

	set_SR( SRkeep );
	return E_OK;
}
#endif

#ifdef USED_RCV_MSG
/*-----------------------------------------------------------------------------
; Receive Message from Mailbox [S]
-----------------------------------------------------------------------------*/
ER rcv_msg( T_MSG *ppk_msg, ID mbxid )
{
	T_MSGCB	*mcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */
	ER		ercd;

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "rcv_msg");
#endif

#ifndef NO_ERCHK
	if( (mbxid <= 0) || (mbxid > MAILMAX) )
	{
		error_trap( "rcv_msg", E_ID );
		return E_ID;
	}

	if( ppk_msg == NULL )
	{
		error_trap( "rcv_msg", E_PAR );
		return E_PAR;
	}

	if( sysstat & (TSS_INDP | TSS_DDSP) )
	{
		error_trap( "rcv_msg", E_CTX );
		return E_CTX;
	}
#endif

	mcb	 = &mailbox[mbxid - 1];

	SRkeep = InterruptDisable();

	if( mcb->head != mcb->tail )
	{
		*ppk_msg = mcb->msgque[ mcb->head ];
		mcb->head = (mcb->head == MSGQUEMAX-1) ? 0 : (mcb->head)+1;

		set_SR( SRkeep );
		return E_OK;
	}

	ercd = wait_task( TTW_MBX, (T_QUEUE *)mcb, TRUE );

	*ppk_msg = (T_MSG *)(currentrun->ans);

	set_SR( SRkeep );

	return ercd;
}
#endif

#ifdef USED_REF_MBX
/*-----------------------------------------------------------------------------
; Receive Message from Mailbox [S]
-----------------------------------------------------------------------------*/
//ER ref_mbx( T_MSG *ppk_msg, ID mbxid )
ER ref_mbx( T_RMBX *pk_rmbx, ID mbxid )
{
	T_MSGCB	*mcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */
	//ER		ercd;

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "ref_mbx");
#endif

#ifndef NO_ERCHK
	if( (mbxid <= 0) || (mbxid > MAILMAX) )
	{
		error_trap( "ref_mbx", E_ID );
		return E_ID;
	}

	if( sysstat & (TSS_INDP | TSS_DDSP) )
	{
		error_trap( "ref_mbx", E_CTX );
		return E_CTX;
	}
#endif
	mcb = &mailbox[mbxid - 1];

	SRkeep = InterruptDisable();
	if( mcb->head != mcb->tail )
	{
		pk_rmbx->pk_msg = mcb->msgque[ mcb->head ];
	}
   else
	{
   		pk_rmbx->pk_msg = NULL;
	}
	set_SR( SRkeep );
	return E_OK;
}
#endif


#ifdef USED_PRCV_MSG
/*-----------------------------------------------------------------------------
; Poll and Receive Message from Mailbox [S]
-----------------------------------------------------------------------------*/
ER prcv_msg( T_MSG *ppk_msg, ID mbxid )
{
	T_MSGCB	*mcb;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "prcv_msg");
#endif

#ifndef NO_ERCHK
	if( (mbxid <= 0) || (mbxid > MAILMAX) )
	{
		error_trap( "prcv_msg", E_ID );
		return E_ID;
	}

	if( ppk_msg == NULL )
	{
		error_trap( "prcv_msg", E_PAR );
		return E_PAR;
	}
#endif

	mcb	 = &mailbox[mbxid - 1];

	SRkeep = InterruptDisable();

	if( mcb->head != mcb->tail )
	{
		*ppk_msg = mcb->msgque[ mcb->head ];
		mcb->head = (mcb->head == MSGQUEMAX-1) ? 0 : (mcb->head)+1;

		set_SR( SRkeep );
		return E_OK;
	}


	set_SR( SRkeep );

	return E_TMOUT;
}
#endif
#endif

/*=============================================================================
; Memorypool Management Functions
=============================================================================*/
/*=============================================================================
; Memorypool Management Functions - variable memory
=============================================================================*/
#ifdef USED_REL_BLK
/*-----------------------------------------------------------------------------
; Release Variable-Size Memory Block [E]
-----------------------------------------------------------------------------*/
ER	rel_blk ( ID mplid, VP blk )
{
	T_TSKCB *tcb;
	VP a_blk;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "rel_blk");
#endif

#ifndef NO_ERCHK
	if( mplid != 1 )
	{
		error_trap( "rel_blk", E_ID );
		return E_ID;
	}
	
	if( (blk == (VP)NULL) || (blk == (VP)NADR) )
	{
		error_trap( "rel_blk", E_PAR );
		return E_PAR;
	}
#endif

	SRkeep = InterruptDisable();

   free( blk );

	tcb = (T_TSKCB *)(mpl.queue.next);

	if( (T_QUEUE *)tcb != (T_QUEUE *)&mpl )
	{
		a_blk = malloc( (size_t)(tcb->wfmode) );

		if( a_blk == NULL )
		{
			set_SR( SRkeep );
			return E_OK;
		}

		tcb->ans = (VP*)a_blk;
		wakeup_task( E_OK, tcb, TRUE );
	}

	set_SR( SRkeep );

	return E_OK;
}
#endif

#ifdef USED_GET_BLK
/*-----------------------------------------------------------------------------
; Get Variable-Size Memory Block [E]
-----------------------------------------------------------------------------*/
ER	get_blk( VP *p_blk, ID mplid, INT blksz)
{
	ER ercd;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "get_blk");
#endif

	*p_blk = NULL;

#ifndef NO_ERCHK
	if( mplid != 1 )
	{
		error_trap( "get_blk", E_PAR );
		return E_ID;
	}

	if( blksz <= 0 )
	{
		error_trap( "get_blk", E_PAR );
		return E_PAR;
	}

	if( sysstat & (TSS_INDP | TSS_DDSP) )
	{
		error_trap( "get_blk", E_CTX );
		return E_CTX;
	}
#endif

	SRkeep = InterruptDisable();

	*p_blk = malloc( (size_t)blksz );

	if( *p_blk != NULL )
	{
		set_SR( SRkeep );
		return E_OK;
	}

	currentrun->wfmode = (UINT)blksz;
	ercd = wait_task( TTW_MPL, (T_QUEUE *)&mpl, TRUE );
	*p_blk = (VP*)(currentrun->ans);

	set_SR( SRkeep );

	return ercd;
}
#endif

#ifdef USED_PGET_BLK
/*-----------------------------------------------------------------------------
; Poll and Get Variable-Size Memory Block [E]
-----------------------------------------------------------------------------*/
ER	pget_blk( VP *p_blk, ID mplid,INT blksz)
{
	ER ercd;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "pget_blk");
#endif

	*p_blk = NULL;

#ifndef NO_ERCHK
	if( mplid != 1 )
	{
		error_trap( "pget_blk", E_ID );
		return E_ID;
	}

	if( blksz <= 0 )
	{
		error_trap( "pget_blk", E_PAR );
		return E_PAR;
	}
#endif

	SRkeep = InterruptDisable();

	*p_blk = malloc( (size_t)blksz );

	if( *p_blk == NULL )
		ercd = E_TMOUT;
	else
		ercd = E_OK;

	set_SR( SRkeep );

	return ercd;
}
#endif


#ifdef USED_REL_BLF
/*-----------------------------------------------------------------------------
; Release Fixed-Size Memory Block [E]
-----------------------------------------------------------------------------*/
ER	rel_blf( ID mplid, VP blf )
{
	T_TSKCB *tcb;
	VP a_blf;
	STATUS_REG SRkeep;					/* SR(Status Register) keep area */

#ifdef DEBUG_OS
	set_dbgtrc(currentrun, "rel_blf");
#endif

#ifndef NO_ERCHK
	if( mplid != 1 )
	{
		error_trap( "rel_blf", E_ID );

⌨️ 快捷键说明

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