?? os_sem.c
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_sem.C
**創 建 人: 陳明計
**最后修改日期: 2004年9月5日
**描 述: Small RTOS信號量處理代碼
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 陳明計
** 版 本: V1.00
** 日 期: 2004年9月5日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 焦進星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,適用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_SEM
#define IN_OS
#include "..\APP\config.h"
#if OS_MAX_EVENTS > 0
#if EN_OS_SEM > 0
/*********************************************************************************************************
** 函數名稱: OSSemCreate
** 功能描述: 初始信號量
** 輸 入: data:信號量初始值
** 輸 出: 事件指針
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
OS_EVENT * OSSemCreate(uint16 Data)
{
OS_EVENT * Rt;
OS_ENTER_CRITICAL();
Rt = OSEventNew();
if (Rt != NULL)
{
Rt->OSEventType = OS_EVENT_SEM;
Rt->EventData.Cnt = Data;
}
OS_EXIT_CRITICAL();
return Rt;
}
/*********************************************************************************************************
** 函數名稱: OSSemPend
** 功能描述: 等待一個信號量
** 輸 入: pEvent:事件指針
** Tick:等待時間
** 輸 出: OS_NO_ERR:成功
** OS_ERR_PEVENT_NULL:事件指針為空
** OS_ERR_EVENT_TYPE:錯誤事件類型
** OS_ERR_PEND_ISR:在IRS中等待事件
** OS_EVENT_DEL:事件被刪除
** OS_TIMEOUT:超時
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_PENT > 0
uint8 OSSemPend(OS_EVENT * pEvent, uint16 Tick)
{
uint8 Rt;
if (pEvent == NULL)
{
return OS_ERR_PEVENT_NULL;
}
OS_ENTER_CRITICAL();
if (pEvent->OSEventType != OS_EVENT_SEM) /* 這個事件不是信號量 */
{
Rt = OS_ERR_EVENT_TYPE;
goto Error;
}
if (pEvent->EventData.Cnt == 0) /* 無信號量 */
{
Rt = OSEventWait(pEvent, Tick);
if (Rt != OS_NO_ERR)
{
goto Error;
}
}
if (pEvent->OSEventType != OS_EVENT_SEM) /* 這個事件不是信號量 */
{
Rt = OS_EVENT_DEL; /* 事件被刪除 */
goto Error;
}
if(pEvent->EventData.Cnt == 0) /* 無信號量 */
{
Rt = OS_TIMEOUT;
goto Error;
}
pEvent->EventData.Cnt--;
Rt = OS_NO_ERR;
Error:
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSSemAccept
** 功能描述: 無等待請求信號量
** 輸 入: pEvent:事件指針
** 輸 出: 信號量的值
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: a
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_ACCEPT > 0
uint16 OSSemAccept(OS_EVENT * pEvent)
{
uint8 Rt;
Rt = 0;
if (pEvent != NULL)
{
OS_ENTER_CRITICAL();
if (pEvent->OSEventType == OS_EVENT_SEM)
{
if (pEvent->EventData.Cnt != 0)
{
Rt = pEvent->EventData.Cnt;
pEvent->EventData.Cnt--;
}
}
OS_EXIT_CRITICAL();
}
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSSemPost
** 功能描述: 發送一個信號量
** 輸 入: pEvent:事件指針
** 輸 出: OS_NO_ERR:成功
** OS_ERR_PEVENT_NULL:事件指針為空
** OS_ERR_EVENT_TYPE:錯誤事件類型
** OS_SEM_OVF:信號量滿
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_POST > 0
uint8 OSSemPost(OS_EVENT * pEvent)
{
uint8 Rt;
if (pEvent == NULL)
{
return OS_ERR_PEVENT_NULL;
}
OS_ENTER_CRITICAL();
if (pEvent->OSEventType != OS_EVENT_SEM)
{
Rt = OS_ERR_EVENT_TYPE;
}
else
{
if (pEvent->EventData.Cnt == (uint16)(-1)) /* 到達最大值 */
{
Rt = OS_SEM_OVF; /* 信號量滿 */
}
else
{
pEvent->EventData.Cnt++;
OSEventResume(pEvent);
Rt = OS_NO_ERR;
}
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSSemQuery
** 功能描述: 查詢信號量
** 輸 入: pEvent:事件指針
** Cnt:用于輸出信號量的值
** 輸 出: OS_NO_ERR:成功
** OS_ERR_PEVENT_NULL:事件指針為空
** OS_ERR_EVENT_TYPE:錯誤事件類型
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_QUERY > 0
uint8 OSSemQuery(OS_EVENT * pEvent, uint16 *Cnt)
{
uint8 Rt;
if (pEvent == NULL)
{
return OS_ERR_PEVENT_NULL;
}
OS_ENTER_CRITICAL();
if (pEvent->OSEventType != OS_EVENT_SEM)
{
Rt = OS_ERR_EVENT_TYPE;
}
else
{
*Cnt = pEvent->EventData.Cnt;
Rt = OS_NO_ERR;
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSSemDel
** 功能描述: 刪除信號量
** 輸 入: pEvent:事件指針
** 輸 出: OS_NO_ERR:成功
** OS_ERR_PEVENT_NULL:事件指針為空
** OS_ERR_EVENT_TYPE:錯誤事件類型
** 作 者: 陳明計
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: a
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_DEL > 0
uint8 OSSemDel(OS_EVENT * pEvent)
{
uint8 Rt;
if (pEvent == NULL)
{
Rt = OS_ERR_PEVENT_NULL;
}
else
{
OS_ENTER_CRITICAL();
if (pEvent->OSEventType != OS_EVENT_SEM)
{
Rt = OS_ERR_EVENT_TYPE;
}
else
{
Rt = OSEventFree(pEvent);
}
OS_EXIT_CRITICAL();
}
return Rt;
}
#endif
#endif
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -