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

📄 os_q.c

📁 可以在单片机中运行的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.10
**
**
**--------------当前版本信息----------------------------------------------------------------------------
*** 文件名: OS_Q.C
** 创建人: 陈明计
** 日 期: 2002年6月20日
** 描 述: Small RTOS(51)消息队列代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 无
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define  IN_OS_Q
#include "config.h"

#if EN_OS_Q > 0
/*********************************************************************************************************
** 函数名称: OSQCreate
** 功能描述: 初始化消息队列
** 输 入: Buf:为队列分配的存储空间地址
**         SizeOfBuf:为队列分配的存储空间大小
** 输 出: NOT_OK:参数错误
**         OS_Q_OK:成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
//Buf[0]:队列中字节数,Buf[1]:Buf总长度Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
{
    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;

        return OS_Q_OK;
    }
    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日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_PENT > 0

        uint8 OSQPend(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
{
#ifdef __C51__
    uint8 idata *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 idata * idata *)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 * idata *)(SP + 1 - sizeof(Buf))) = Buf;
#endif

        OSClearSignal(OSRunningTaskID());
        OSSched();
        OS_ENTER_CRITICAL();


#ifdef __C51__
        Buf = *((uint8 OS_Q_MEM_SEL * idata *)(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 idata *)(*((uint8 idata *)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

/*********************************************************************************************************
** 函数名称: OSQAccept
** 功能描述: 无等待从消息队列中取得消息
** 输 入: Ret:返回的消息
**         Buf:指向队列的指针
** 输 出: NOT_OK:参数错误
**         OS_Q_OK:收到消息
**         OS_Q_TMO:超时到
**         OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_ACCEPT > 0
        uint8 OSQAccept(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    OS_ENTER_CRITICAL();

    if (*Buf != 0)
    {
        Buf[0]--;
        Buf[2]++;
        if (Buf[2] >= Buf[1])
        {
#if OS_MAX_TASKS < 9
            Buf[2] = 4;
#else
            Buf[2] = 5;
#endif
        }
        *Ret = Buf[Buf[2]];
        OS_EXIT_CRITICAL();
        return OS_Q_OK;
    }
    else
    {
        OS_EXIT_CRITICAL();
        return OS_Q_NOT_OK;
    }
}
#endif


/*********************************************************************************************************
** 函数名称: OSQIntPost
** 功能描述: 中断中FIFO方式发送消息
** 输 入: Buf:指向队列的指针
**         Data:消息数据
** 输 出: OS_Q_FULL:队列满
**         OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_INT_POST > 0  || EN_OS_Q_POST > 0
        uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
    uint8 temp,i;

#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    OS_ENTER_CRITICAL();

#if OS_MAX_TASKS < 9
    if (Buf[0] < (Buf[1]-4))
#else
    if (Buf[0] < (Buf[1]-5))
#endif
    {
#ifdef __C51__
        SP++;
        *((uint8 idata * idata *)SP) = Data;
#endif
        temp = Buf[2] + Buf[0] + 1;
        if (temp >= Buf[1])
        {
#if OS_MAX_TASKS < 9
            temp = temp - Buf[1]+4;
#else
            temp = temp - Buf[1]+5;
#endif
        }
#ifdef __C51__
        Buf[temp] = *((uint8 idata * idata *)SP);
        SP--;
#else
        Buf[temp] = Data;
#endif

        Buf[0]++;
        if (Buf[0] == 1)
        {
            temp = Buf[3];
            for (i = 0; i < 8; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
#if OS_MAX_TASKS < 9
            if (i < 8 )
            {
                Buf[3] &= ~OSMapTbl[i];
                OSIntSendSignal(i);
            }
#else

⌨️ 快捷键说明

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