📄 serial.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 + -