📄 rtos.c
字号:
#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 + -