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

📄 os_sem.c

📁 8052小型操作系统, 用Keil C编译器, 能进行任务切换, 信号量管理.
💻 C
字号:
/*
*********************************************************************************************************
*                                        uC/OS-16
*                                  The Real-Time Kernel
*                                  SEMAPHORE MANAGEMENT
*
* File : OS_SEM.C
* By   : zhang xian
* Date : 2006-11-26
*********************************************************************************************************
*/
#include "Includes.h"

#if EN_OS_SEM > 0
/*
*********************************************************************************************************
*                                           Initialize a semaphore
*********************************************************************************************************
*/
void  OSSemInit (INT8U SemIndex,INT8U SemCount)
{
    OSSemBuf[SemIndex] = SemCount;
}
/*
*********************************************************************************************************
*                                           ACCEPT SEMAPHORE
*
* Description: This function checks the semaphore to see if a resource is available or, if an event
*              occurred.  Unlike OSSemPend(), OSSemAccept() does not suspend the calling task if the
*              resource is not available or the event did not occur.
*
* Returns    : >  0       if the resource is available or the event did not occur the semaphore is
*                         decremented to obtain the resource.
*              == 0       if the resource is not available
*********************************************************************************************************
*/

#if EN_OS_SEM_ACCEPT > 0
INT8U  OSSemAccept (INT8U SemIndex)
{
    INT8U     cnt;
    Assert( SemIndex<=OS_MAX_SEMS );
    cnt = OSSemBuf[SemIndex];
    if (cnt > 0)
    {                                            /* See if resource is available                  */
        OSSemBuf[SemIndex]--;                    /* Yes, decrement semaphore and notify caller    */
    }
    return (cnt);                                /* Return semaphore count                        */
}
#endif

/*
*********************************************************************************************************
*                                           Pend a semaphore
*********************************************************************************************************
*/
INT8U  OSSemPend (INT8U SemIndex, INT8U Timeout) reentrant
{
    OS_SIZE   TaskMap;
    Assert( SemIndex<=OS_MAX_SEMS ); //&& Timeout!=0 );
    OS_ENTER_CRITICAL();
    OSIntNesting = 0;
    if( OSSemBuf[SemIndex]==0 )
    {
        TaskMap              =  OSMapTbl[OSTaskID];
        OSTaskReady         &= ~TaskMap;
        OSDlyTicks[OSTaskID] =  Timeout;  // if( Timeout==0 ) it'l wait for ever
        OSSemTask[SemIndex] |=  TaskMap;
        OS_Sched();
        if( (OSSemTask[SemIndex]&TaskMap)!=0 ) // 超时,信号量未就绪
        {
            OSSemTask[SemIndex] &= ~TaskMap;
            OS_EXIT_CRITICAL();
            return OS_TIMEOUT;
        }
    }
    OSSemBuf[SemIndex]--;
    OS_EXIT_CRITICAL();
    return  OS_NO_ERR;
}
/*
*********************************************************************************************************
*                                           Post a semaphore
*********************************************************************************************************
*/
void  OSSemPost (INT8U SemIndex) reentrant
{
    INT8U     WaitTask;
    //OS_SIZE   SemTask;
    Assert( SemIndex<=OS_MAX_SEMS );
    if( OSSemBuf[SemIndex]<255 )
    {
        OSSemBuf[SemIndex]++;
    }
    WaitTask = FindBitNum( OSSemTask[SemIndex] );
    if( WaitTask<OS_MAX_TASKS )
    {
        //SemTask              = OSMapTbl[WaitTask];
        OSSemTask[SemIndex] &= ~OSMapTbl[WaitTask];//~SemTask;
        OSTaskReady         |= OSMapTbl[WaitTask];//SemTask;
        OSNextTaskID         = WaitTask;
        OSDlyTicks[WaitTask] = 1;
        OSCtxSw();
    }
}
/*********************************************************************************************************/
INT8U  OSSemQuery( INT8U SemIndex ) reentrant
{
    return  OSSemBuf[SemIndex];
}
#endif
/*********************************************************************************************************/

⌨️ 快捷键说明

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