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

📄 os_q.c

📁 就像在嵌入系统中使用C语言替代汇编一样,在嵌入系统中使用RTOS是大势所趋。原因主要是现在在大多数情况下编程效率比执行效率重要(单片机便宜嘛)。但纵观51的RTOS
💻 C
📖 第 1 页 / 共 2 页
字号:
                /* 判断消息入队前消息队列是否为空 */
        if (Buf[0] == 1)
        {
                /* 为空,可能有任务等待消息,查找之 */
            temp = Buf[3];
#if OS_MAX_TASKS < 9
            for (i = 0; i < OS_MAX_TASKS; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
            if (i < OS_MAX_TASKS )
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                Buf[3] &= ~OSMapTbl[i];
                OSIntSendSignal(i);
            }
#else
            for (i = 0; i < 8; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
            if (i >= 8 )
            {
                temp = Buf[4];
                for (; i < OS_MAX_TASKS; i++)
                {
                    if ((temp & 0x01) != 0)
                    {
                        break;
                    }
                    temp = temp >> 1;
                }
            }
            if (i < OS_MAX_TASKS )
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                if (i < 8)
                {
                    Buf[3] &= ~OSMapTbl[i];
                }
                else
                {
                    Buf[4] &= ~OSMapTbl[i & 0x07];
                }
                OSIntSendSignal(i);
            }
#endif
        }
        OS_EXIT_CRITICAL();
        return OS_Q_OK;
    }
    else
    {
        OS_EXIT_CRITICAL();
        return OS_Q_FULL;
    }
}
#endif

/*********************************************************************************************************
** 函数名称: OSQIntPostFront
** 功能描述: 中断中LIFO方式发送消息
** 输 入: Buf:指向队列的指针
**         Data:消息数据
** 输 出: OS_Q_FULL:队列满
**         OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_INT_POST_FRONT > 0 || EN_OS_Q_POST_FRONT > 0
        uint8 OSQIntPostFront(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
    {
                /* 存储消息 */
        Buf[Buf[2]] = Data;
        Buf[0]++;           /* 消息数目增加一 */
                /* 指向新的将要出队的消息 */
        Buf[2]--;
#if OS_MAX_TASKS < 9
        if (Buf[2] < 4)
#else
        if (Buf[2] < 5)
#endif
        {
            Buf[2] = Buf[1]-1;
        }
        
                /* 判断消息入队前消息队列是否为空 */
        if (Buf[0] == 1)
        {
                /* 为空,可能有任务等待消息,查找之 */
            temp = Buf[3];
#if OS_MAX_TASKS < 9
            for (i = 0; i < OS_MAX_TASKS; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
            if (i < OS_MAX_TASKS )
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                Buf[3] &= ~OSMapTbl[i];
                OSIntSendSignal(i);
            }
#else
            for (i = 0; i < 8; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
            if (i >= 8 )
            {
                temp = Buf[4];
                for (; i < OS_MAX_TASKS; i++)
                {
                    if ((temp & 0x01) != 0)
                    {
                        break;
                    }
                    temp = temp >> 1;
                }
            }
            if (i < OS_MAX_TASKS )
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                if (i < 8)
                {
                    Buf[3] &= ~OSMapTbl[i];
                }
                else
                {
                    Buf[4] &= ~OSMapTbl[i & 0x07];
                }
                OSIntSendSignal(i);
            }
#endif
        }
        OS_EXIT_CRITICAL();
        return OS_Q_OK;
    }
    else
    {
        OS_EXIT_CRITICAL();
        return OS_Q_FULL;
    }
}
#endif

/*********************************************************************************************************
** 函数名称: OSQPost
** 功能描述: FIFO方式发送消息
** 输 入: Buf:指向队列的指针
**         Data:消息数据
** 输 出: OS_Q_FULL:队列满
**         OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSQIntPost,OSSched
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_POST > 0
        uint8 OSQPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    if (OSQIntPost(Buf,Data) == OS_Q_OK)
    {
        OSSched();
        return OS_Q_OK;
    }
    else
    {
        return OS_Q_FULL;
    }
}
#endif

/*********************************************************************************************************
** 函数名称: OSQPostFront
** 功能描述: LIFO方式发送消息
** 输 入: Buf:指向队列的指针
**         Data:消息数据
** 输 出: OS_Q_FULL:队列满
**         OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSQIntPostFront,OSSched
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_POST_FRONT > 0
        uint8 OSQPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    if (OSQIntPostFront(Buf,Data) == OS_Q_OK)
    {
        OSSched();
        return OS_Q_OK;
    }
    else
    {
        return OS_Q_FULL;
    }
}
#endif

/*********************************************************************************************************
** 函数名称: OSQNMsgs
** 功能描述: 取得消息队列中消息数
** 输 入: Buf:指向队列的指针
** 输 出: 消息数
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_NMsgs > 0
        uint8 OSQNMsgs(uint8 OS_Q_MEM_SEL *Buf)
{
    uint8 temp;

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

    OS_ENTER_CRITICAL();
    temp = Buf[0];
    OS_EXIT_CRITICAL();
    return temp;
}
#endif

/*********************************************************************************************************
** 函数名称: OSQSize
** 功能描述: 取得消息队列总容量
** 输 入: Buf:指向队列的指针
** 输 出: 消息队列总容量
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_SIZE > 0
        uint8 OSQSize(uint8 OS_Q_MEM_SEL *Buf)
{
    uint8 temp;

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

    OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
    temp = Buf[1] - 4;
#else
    temp = Buf[1] - 5;
#endif
    OS_EXIT_CRITICAL();
    return temp;
}
#endif

/*********************************************************************************************************
** 函数名称: OSQFlush
** 功能描述: 清空队列
** 输 入: Buf:指向队列的指针
** 输 出: 无
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月26日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_FLUSH > 0
        void OSQFlush (uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return;
    }
#endif

    Buf[0] = 0;
#if OS_MAX_TASKS < 9
    Buf[2] = 4;
#else
    Buf[2] = 5;
#endif
}
#endif

#endif

⌨️ 快捷键说明

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