/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.12.2
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_Q.C
**创 建 人: 陈明计
**最后修改日期: 2004年6月8日
**描 述: Small RTOS(51)消息队列代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V1.10
** 日 期: 2002年6月20日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.10.2
** 日 期: 2002年9月9日
** 描 述: 修改OSQIntPost()的Keil C51特殊代码,它编译没有问题,但会造成阅读
** 障碍。这部分代码仅在使用Keil C51时出现。
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.10.5
** 日 期: 2002年10月26日
** 描 述: 修改OSQFlush()使其不再清除等待队列,修改OSQCreate()代码避免重入,修改OSQIntPost()
** 和OSQIntPost()时其效率更高
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.11.0
** 日 期: 2002年12月2日
** 描 述: 根据新版本需求更改开、关中断代码,增加注释,简化
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.12.0
** 日 期: 2002年12月30日
** 描 述: 没有变化
**
**--------------当前版本修订-----------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年6月8日
** 描 述: 更正计算溢出的错误
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_Q
#include "config.h"
#if EN_OS_Q > 0
/*********************************************************************************************************
** 函数名称: OSQCreate
** 功能描述: 初始化消息队列
** 输 入: Buf:为队列分配的存储空间地址
** SizeOfBuf:为队列分配的存储空间大小
** 输 出: NOT_OK:参数错误
** OS_Q_OK:成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
//Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
{
OS_ENTER_CRITICAL();
if ((SizeOfBuf >= 5) && (Buf != NULL))
{
Buf[0] = 0; /* 队列中消息数目 */
Buf[1] = SizeOfBuf; /* 消息队列占用内存字节数 */
#if OS_MAX_TASKS < 9
Buf[2] = 4; /* 将要出队的消息所在位置 */
#else
Buf[2] = 5; /* 将要出队的消息所在位置 */
#endif
Buf[3] = 0; /* 消息队列的等待任务列表 */
Buf[4] = 0; /* 任务数大于等于8时为等待任务列表的一部分, */
/* 否则为消息缓冲区 */
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return NOT_OK;
}
}
/*********************************************************************************************************
** 函数名称: OSQPend
** 功能描述: 等待消息队列中的消息
** 输 入: Ret:返回的消息
** Buf:指向队列的指针
** Tick:等待时间
** 输 出: NOT_OK:参数错误
** OS_Q_OK:收到消息
** OS_Q_TMO:超时到
** OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月9日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_PENT > 0
uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
{
#ifdef __C51__
uint8 data *cp;
#endif
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
/* 可以优化寄存器的使用 */
/* 使用堆栈是为了使函数具有重入性 */
#ifdef __C51__
SP++;
*((uint8 data * data *)SP) = Ret;
#endif
/* 把任务加入等待任务队列 */
#if OS_MAX_TASKS < 9
Buf[3] |= OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
{
Buf[3] |= OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
while (Buf[0] == 0) /* 消息队列中是否有消息 */
{
/* 无消息 */
#ifdef __C51__
SP = SP + sizeof(Buf);
*((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
#endif
OSClearSignal(OSRunningTaskID()); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
#ifdef __C51__
Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
SP = SP - sizeof(Buf);
#endif
/* 任务再次运行,如果超时到,退出循环 */
if (OSWaitTick[OSRunningTaskID()] == 0)
{
break;
}
}
/* 将任务从等待队列中清除(可以删除) */
#if OS_MAX_TASKS < 9
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
{
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
/* 判断消息队列中是否有消息 */
if (Buf[0] > 0)
{
/* 有,消息出队 */
Buf[0]--; /* 队列的消息数目减一 */
/* 指向下一个出队位置 */
Buf[2]++;
if (Buf[2] >= Buf[1] )
{
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
}
#ifdef __C51__
cp = (uint8 data *)(*((uint8 data *)SP));
SP--;
*cp = Buf[Buf[2]];
#else
*Ret = Buf[Buf[2]];
#endif
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
/* 无,返回错误码 */
#ifdef __C51__
SP--;
#endif
OS_EXIT_CRITICAL();
return OS_Q_TMO;
}
}
#endif
/************************
feng_cam
- 粉丝: 0
- 资源: 1
最新资源
- 【岗位职责说明书】100000709 财务高级主管.doc
- 【岗位职责说明书】100000708 人力资源高级主管.doc
- 【岗位职责说明书】100000713 安全保卫高级主管.doc
- 【岗位职责说明书】100000803 综合行政主管.doc
- 【岗位职责说明书】100000802 财务部副经理(分公司).doc
- 【岗位职责说明书】100000800 室(职能部室)副经理.doc
- 【岗位职责说明书】100000807 工商法律事务主管.doc
- 【岗位职责说明书】100000808 档案管理主管.doc
- 【岗位职责说明书】100000809 信息管理主管.doc
- 【岗位职责说明书】100000818 会计主管.doc
- 【岗位职责说明书】100000814 绩效考核主管.doc
- 【岗位职责说明书】100000820 审计主管.doc
- 【岗位职责说明书】100000813 薪酬主管.doc
- 【岗位职责说明书】100000812 培训主管.doc
- 【岗位职责说明书】100000815 员工关系主管.doc
- 【岗位职责说明书】100000816 社会保险主管.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论4