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

📄 event.c

📁 Rabbit 32Bit RTOS源代码
💻 C
字号:
/*********************************************************************
*                   Copyright (c) 2011-2012,李士伟
*                     All rights reserved.
*文 件 名:event.c
*描    述:事件源文件
*当前版本:V1.00
*作    者:李士伟
*创建日期:2012.01.01
**********************************************************************/
#include <kernel\event.h>
#include <kernel\sched.h>
#include <kernel\kd.h>
#include <kernel\flag.h>
#include <kernel\asm.h>

/*********************************************************************
*函 数 名:API_InitEvent
*描    述:初始化事件
*输入参数:pevent: 事件指针
*          event_type: 初始化事件类型,一般用OS_NO_EVENT
*输出参数:无
*返 回 值:无
*注    意:无
**********************************************************************/
void API_InitEvent(OS_EVENT *pevent, INT32U event_type)
{
    if (pevent == NULL)
    {
        return ;
    }
    OS_ENTER_CRITICAL();
    pevent->Event = event_type;
    pevent->WaitQ = NULL;
    OS_EXIT_CRITICAL();
}

/*********************************************************************
*函 数 名:API_WaitEvent
*描    述:等待事件
*输入参数:pevent: 事件指针
*          timeout:等待时限
*输出参数:err:错误类型
*返 回 值:无
*注    意:无
**********************************************************************/
INT32U API_WaitEvent(OS_EVENT *pevent, INT32U timeout, INT32U *err)
{
    INT32U event;

    OS_ENTER_CRITICAL();
    if ((pevent == NULL) || (OSIntNesting > 0))
    {
        OS_EXIT_CRITICAL();
        *err = OS_ERR;
        return OS_NO_EVENT;
    }

    event = pevent->Event;
    if (event != OS_NO_EVENT)  /* 有事件发生 */
    {
        pevent->Event = OS_NO_EVENT;  /* 清除事件标志 */

        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
        return event;  /* 返回事件类型 */
    }

    /* 等待事件 */
    OSTCBCur->Delay = timeout;  /* 设置超时等待时间 */
    OS_EnterWaitQHead(&(pevent->WaitQ), OSTCBCur);  /* 加入事件等待队列 */
    OS_Sched();

    if (OSTCBCur->Event != OS_NO_EVENT)  /* 事件发生 */
    {
        event = OSTCBCur->Event;   /* 获得事件类型 */
        OSTCBCur->Event = OS_NO_EVENT;  /* 清除事件标志 */
        OSTCBCur->Delay = 0;  /* 清除等待时限 */
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
        return event;
    }

    /* 超时,事件未发生 */
    OS_EXIT_CRITICAL();
    *err = OS_OVERTIME;
    return OS_NO_EVENT;
}

/*********************************************************************
*函 数 名:API_OccurEvent
*描    述:发生事件,向等事件的任务发送事件类型
*输入参数:pevent:事件指针
*          event: 发生事件类型
*          method:发送方式
*输出参数:无
*返 回 值:OS_ERR: 事件结构体不存在
*          OS_EVENT_NOT_CAPTURE: 前一个事件还未被任务捕获
*          OS_EVENT_SAVE: 存入事件
*          OS_EVENT_SEND: 事件发送
*注    意:无
**********************************************************************/
INT32U API_OccurEvent(OS_EVENT *pevent, INT32U event, INT32U method)
{
    INT32U prio = 0;
    OS_TCB *ptcb;
    OS_TCB *wptcb=NULL;

    if (pevent == NULL)
    {
        return OS_ERR;
    }

    OS_ENTER_CRITICAL();
    
    ptcb  = pevent->WaitQ;
    wptcb = ptcb;
    if (ptcb != NULL)  /* 有任务在等待事件 */
    {
        prio = ptcb->Prio;
    }
    else  /* 没有任务在等待事件 */
    {
        if (pevent->Event != OS_NO_EVENT)  /* 前一个事件还未被任务捕获 */
        {
            OS_EXIT_CRITICAL();
            return OS_EVENT_NOT_CAPTURE;
        }
        else  /* 前一个事件已被任务捕获,存入事件类型 */
        {
            pevent->Event = event;
            OS_EXIT_CRITICAL();
            return OS_EVENT_SAVE;
        }
    }

    /* 基于优先级发送事件给一个高优先级任务 */
    if (method == OS_BASE_PRIO)  
    {
        while (ptcb != NULL)  /* 从等待队列查询一个高优先级任务 */
        {
            if (prio <= ptcb->Prio)
            {
                prio = ptcb->Prio;
                wptcb= ptcb;
            }
            ptcb = ptcb->QNext;
        } 

        wptcb->Event  = event;  /* 将事件类型存入TCB中 */
        OS_EnterRunQ(wptcb);  /* 加入运行队列 */

    }

    /* 广播方式唤醒所有等待该事件的任务 */
    else if (method == OS_BASE_BROADCAST)
    {
        while (ptcb != NULL)
        {
            ptcb->Event = event;  /* 将事件类型存入TCB中 */
            wptcb = ptcb->QNext;
            OS_EnterRunQ(ptcb);  /* 加入运行队列 */
            ptcb = wptcb;
        }
    }

    OS_EXIT_CRITICAL();
    OS_Sched();
    return OS_EVENT_SEND;
}

/*********************************************************************
*函 数 名:API_AcceptEvent
*描    述:无等待获取事件
*输入参数:pevent: 事件结构体指针
*输出参数:无
*返 回 值:事件类型
*注    意:
**********************************************************************/
INT32U API_AcceptEvent(OS_EVENT *pevent)
{
    INT32U event;
    OS_ENTER_CRITICAL();
    event = pevent->Event;
    pevent->Event = OS_NO_EVENT;
    OS_EXIT_CRITICAL();
    return event;
}

⌨️ 快捷键说明

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