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

📄 serial.c

📁 一个小型的实时操作系统 对理解操作系统有很好的帮助
💻 C
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                      V1.50.0 内部测试版
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: serial.c
**创   建   人: 陈明计
**最后修改日期: 2004年8月8日
**描        述: serial源代码。
**
********************************************************************************************************/
#include "config.h"

uint8 Buf[NBYTE - 3];
int SerialData[14];

void Recuve(void *Pdata);
void TaskB(void *Pdata);
void TaskD(void *Pdata);

OS_STK        TaskStk[3][512];

OS_EVENT      *SerialIn;

                            int main(void)
{
    OSInit();

    OSTaskCreate(Recuve, NULL, &(TaskStk[0][512 -1]), 5, 0, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, NULL, &(TaskStk[1][512 -1]), 4, 1, 512, USR32Mode, 0);
    OSTaskCreate(TaskD, NULL, &(TaskStk[2][512 -1]), 3, 2, 512, USR32Mode, 0);

    while(1)
    {
        PCON = PCON | 0x01;                     /* CPU进入休眠状态 */
    }
    return 0;
}


        void UART0_Exception(void)
{
    uint8 IIR, temp;
    
    OS_ENTER_CRITICAL();

    while(((IIR = U0IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                                  /* THRE中断    */
                U0IER = U0IER & (~0x02);
                break;
            case 0x04:                                  /* 接收数据可用 */
                do
                {
#if EN_OS_Q_POST > 0
                    OSQPost(SerialIn, (void *)(U0RBR | 0x100));
#endif
#if EN_OS_Q_POST_FRONT > 0
                    OSQPostFront(SerialIn, (void *)(U0RBR | 0x100));
#endif
                } while ((U0LSR & 0x00000001) != 0);
                break;
            case 0x06:                                  /* 接收线状态   */
                temp = U0LSR;
                break;
            case 0x0c:                                  /* 字符超时指示 */
                do
                {
#if EN_OS_Q_POST > 0
                    OSQPost(SerialIn, (void *)(U0RBR | 0x100));
#endif
#if EN_OS_Q_POST_FRONT > 0
                    OSQPostFront(SerialIn, (void *)(U0RBR | 0x100));
#endif
                } while ((U0LSR & 0x00000001) != 0);
                break;
            default :
                break;
        }
    } 
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}


    void Recuve(void *Pdata)
{
    uint8 temp,temp1;
    uint8 Sum,i,err;

    Pdata = Pdata;

    TargetInit();

    SerialIn = OSQCreate(SerialData,sizeof(SerialData));

start:
#if EN_OS_Q_NMsgs > 0
    while (SerialIn == NULL)
    {
        OSTimeDly(1);
    }
#endif

    temp = (unsigned int)OSQPend(SerialIn, 0, &err);
    while (1)
    {
        while (1)
        {
            temp1 = (unsigned int)OSQPend(SerialIn, 20, &err);
            if (err == OS_TIMEOUT)
            {
                goto start;
            }
            if ((temp == STARTBYTE1) && (temp1 == STARTBYTE2))
            {
                break;
            }            
            temp = temp1;
        }
        
start1:
        Sum = (uint8)(STARTBYTE1 + STARTBYTE2);
        temp1 = (unsigned int)OSQPend(SerialIn, 20, &err);
        if (err == OS_TIMEOUT)
        {
            goto start;
        }
        
        for (i = 0; i < NBYTE - 3; i++)
        {
            temp = temp1;
            temp1 = (unsigned int)OSQPend(SerialIn, 20, &err);
            if (err == OS_TIMEOUT)
            {
                goto start;
            }

            if ((temp == STARTBYTE1) && (temp1 == STARTBYTE2))
            {
                goto start1;
            }
            Buf[i] = temp;
            Sum += temp;
        }
        Sum += temp1;
        if (Sum == 0)
        {
            OSTaskResume(1);
        }        
    }
}


                            void TaskB(void *Pdata)
{
    Pdata = Pdata;

    while (1)
    {
        OSTaskSuspend(OS_ID_SELF);
        U0THR = 'O';
        U0THR = 'K';
        U0THR = '!';
        U0THR = '\n';
    } 
}

                            void TaskD(void *Pdata)
{
    Pdata = Pdata;

    while (1)
    {
#if EN_OS_Q_POST > 0
        OSQPost(SerialIn, (void *)0x1f0);
        OSQPost(SerialIn, (void *)0x1f1);
        OSQPost(SerialIn, (void *)0x1f0);
        OSQPost(SerialIn, (void *)0x1f0);
        OSQPost(SerialIn, (void *)0x100);
        OSQPost(SerialIn, (void *)0x100);
        OSQPost(SerialIn, (void *)0x13f);
        OSQPost(SerialIn, (void *)0x111);
#endif
#if EN_OS_Q_POST_FRONT > 0
        OSQPostFront(SerialIn, (void *)0x13f);
        OSQPostFront(SerialIn, (void *)0x100);
        OSQPostFront(SerialIn, (void *)0x100);
        OSQPostFront(SerialIn, (void *)0x1f0);
        OSQPostFront(SerialIn, (void *)0x1f0);
        OSQPostFront(SerialIn, (void *)0x1f1);
        OSQPostFront(SerialIn, (void *)0x1f0);
        OSQPostFront(SerialIn, (void *)0x111);
#endif
        OSTimeDly(200);
        
    } 
}

⌨️ 快捷键说明

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