📄 os_mbox.c
字号:
return ((void *)0);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)
{ /* 无效的事件块类型 */
*err = OS_ERR_EVENT_TYPE;
return ((void *)0);
}
#endif
OS_ENTER_CRITICAL();
msg = pevent->OSEventPtr;
if (msg != (void *)0) /* 看是否有已存在的消息 */
{
pevent->OSEventPtr = (void *)0; /* 清除邮箱 */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (msg); /* 返回接收的消息 (或空指针) */
}
OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* 没有消息,任务将等待 */
OSTCBCur->OSTCBDly = timeout; /* 在TCB中加载延时数 */
OS_EventTaskWait(pevent); /* 挂起任务直到事件发生或延时到 */
OS_EXIT_CRITICAL();
OS_Sched(); /* 寻找最高优先级任务就绪运行 */
OS_ENTER_CRITICAL();
msg = OSTCBCur->OSTCBMsg;
if (msg != (void *)0) /* 看是否有消息? */
{
OSTCBCur->OSTCBMsg = (void *)0; /* 有,清除已接收的消息 */
OSTCBCur->OSTCBStat = OS_STAT_RDY;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* 拆除TCB与ECB的链接,不在等待事件发生 */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (msg); /* 返回接收的消息 */
}
OS_EventTO(pevent); /* 延时到,就绪任务 */
OS_EXIT_CRITICAL();
*err = OS_TIMEOUT; /* 显示延时发生 */
return ((void *)0); /* 返回空消息 */
}
/*$PAGE*/
/*
*********************************************************************************************************
* 发送消息到邮箱
*
* 函数描述: 该函数发送一个消息到邮箱
*
* 输入参数 : pevent 指向带有期望邮箱的ECB的指针
*
* msg 指向发送消息的指针. 不要发送空指针
*
* 返回值 : OS_NO_ERR 调用成功,消息被发送
* OS_MBOX_FULL 邮箱中已包含信息。一次仅能发送一条消息,因此,在发送消息前必须清空邮箱。
* OS_ERR_EVENT_TYPE 发送到非邮箱型中
* OS_ERR_PEVENT_NULL 'pevent' 是一个空指针
* OS_ERR_POST_NULL_PTR 发送一个空指针
*********************************************************************************************************
*/
#if OS_MBOX_POST_EN > 0
INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0)
{ /* 无效的 'pevent' */
return (OS_ERR_PEVENT_NULL);
}
if (msg == (void *)0)
{ /* 没有发送一个空指针 */
return (OS_ERR_POST_NULL_PTR);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)
{ /* 无效的事件块类型 */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) /* 看是否任务正在等待消息邮箱 */
{
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* 就绪等待事件的最高优先级的任务,在TCB中放消息 */
OS_EXIT_CRITICAL();
OS_Sched(); /* 寻找HPT就绪运行 */
return (OS_NO_ERR);
}
if (pevent->OSEventPtr != (void *)0)
{ /* 检查邮箱中是否有消息? */
OS_EXIT_CRITICAL();
return (OS_MBOX_FULL);
}
pevent->OSEventPtr = msg; /* 在邮箱里放消息 */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 发送消息到邮箱
*
* 函数描述: 该函数发送一个消息到邮箱
*
* 输入参数 : pevent 指向带有期望邮箱的ECB的指针
*
* msg 指向发送消息的指针. 不要发送空指针
*
* opt 发送的类型:
* OS_POST_OPT_NONE 发送给单独的等待任务
* (与 OSMboxPost()功能一致)
* OS_POST_OPT_BROADCAST 发送给所有正等待消息邮箱的任务
*
* 返回值 : OS_NO_ERR 调用成功,消息被发送
* OS_MBOX_FULL 邮箱中已包含信息。一次仅能发送一条消息,因此,在发送消息前必须清空邮箱。
* OS_ERR_EVENT_TYPE 发送到非邮箱型中.
* OS_ERR_PEVENT_NULL 'pevent' 是一个空指针
* OS_ERR_POST_NULL_PTR 发送一个空指针
*
* 警告 : 如果广播发送,中断将禁止较长时间。事实上,中断禁止时间正比于等待消息邮箱的任务的数量。
*********************************************************************************************************
*/
#if OS_MBOX_POST_OPT_EN > 0
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0)
{ /* 无效的 'pevent' */
return (OS_ERR_PEVENT_NULL);
}
if (msg == (void *)0)
{ /* 没有发送一个空指针 */
return (OS_ERR_POST_NULL_PTR);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)
{ /* 无效的事件块类型 */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) /* 看是否任务正在等待消息邮箱 */
{
if ((opt & OS_POST_OPT_BROADCAST) != 0x00) /* 需要广播发送吗? */
{
while (pevent->OSEventGrp != 0x00) /* 是,广播发送给所有等待邮箱的任务 */
{
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);
} /* 就绪所有等待事件的任务,在它们相应的TCB中放消息 */
}
else
{
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /*不,就绪等待事件的HPT的任务,在其TCB中放消息 */
}
OS_EXIT_CRITICAL();
OS_Sched(); /* 寻找最高优先级就绪运行 */
return (OS_NO_ERR);
}
if (pevent->OSEventPtr != (void *)0)
{ /* 邮箱中是否有消息? */
OS_EXIT_CRITICAL();
return (OS_MBOX_FULL);
}
pevent->OSEventPtr = msg; /* 在邮箱里放消息 */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 查询一个消息邮箱
*
* 函数描述: 该函数得到消息邮箱的信息
*
* 输入参数 : pevent 指向带有期望邮箱的ECB的指针
*
* pdata 指向包含消息邮箱的数据结构的指针
*
* 返回值 : OS_NO_ERR 调用成功,消息被发送
* OS_ERR_EVENT_TYPE 从一个非消息邮箱中获取信息
* OS_ERR_PEVENT_NULL 'pevent' 是一个空指针
*********************************************************************************************************
*/
#if OS_MBOX_QUERY_EN > 0
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
INT8U *psrc;
INT8U *pdest;
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0)
{ /* 无效的 'pevent' */
return (OS_ERR_PEVENT_NULL);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)
{ /* 无效的事件块类型 */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
pdata->OSEventGrp = pevent->OSEventGrp; /* 复制消息邮箱等待列表 */
psrc = &pevent->OSEventTbl[0];
pdest = &pdata->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 1
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 2
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 3
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 4
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 5
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 6
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 7
*pdest = *psrc;
#endif
pdata->OSMsg = pevent->OSEventPtr; /* 从邮箱中得到消息 */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif /* OS_MBOX_QUERY_EN */
#endif /* OS_MBOX_EN */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -