📄 event.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 + -