📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
** mcu123.com add keil
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "queue.h"
#define TaskStkLengh 64 //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1 [TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈
OS_STK TaskStk2 [TaskStkLengh]; //串口发送任务堆栈
OS_STK TaskStk3 [TaskStkLengh];
OS_EVENT *sem;
OS_EVENT *sem1;
OS_EVENT *uartsem;
CirQueue uartqueue;
extern void UART1_Handler(void);
extern Install_IRQ( uint32 IntNumber, void *HandlerAddr, uint32 Priority );
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata); //Task1 任务1
void Task2(void *pdata); //Task0 任务2
void Task3(void *pdata);
unsigned char temp;
struct uart
{
unsigned int td_len;
unsigned int rd_len;
unsigned int td_maxlen;
unsigned int rd_maxlen;
unsigned char RecBuf[128];
unsigned char SenBuf[1010];
}uart1;
void UART1_Exception(void)
{
extern unsigned char temp;
uint8 IIR;
//OS_ENTER_CRITICAL();
while(((IIR = U1IIR) & 0x01) == 0)
{ /* 有中断未处理完 */
switch (IIR & 0x0e)
{
case 0x02: /* THRE中断 */
U1IER = U1IER & (~0x02); /* 队列空,则禁止发送中断 */
break;
case 0x0c:
while((U1LSR&0x01) == 1) /* 通知接收任务 */
{
EnQueue(&uartqueue,U1RBR);
//Uartbuf[i++] = U1RBR;
}
OSSemPost(uartsem);
break;
case 0x04: /* 接收数据可用 */
while((U1LSR&0x01) == 1) /* 通知接收任务 */
{
EnQueue(&uartqueue,U1RBR);
}
OSSemPost(uartsem);
break;
case 0x06: /* 接收线状态 */
temp = U1LSR;
break;
default :
break;
}
}
VICVectAddr = 0; // 通知中断控制器中断结束
//OS_EXIT_CRITICAL();
}
void UART_Init(void)
{
PINSEL0 &= ~0xC0000000;
PINSEL0 |= 0x40000000; /* Enable TxD1 pin */
PINSEL1 &= ~0x00000003;
PINSEL1 |= 0x00000001; /* Enable RxD1 pin */
U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
U1DLM = 0;
U1DLL = 7; /* 115200 Baud Rate */
U1FDR = 0x67; /* Fractional Divider */
U1LCR = 0x03; /* DLAB = 0 */
U1IER = 0x03; /* Enable RDA and THRE interrupts */
U1FCR = 0x41; /* FIFO为8字节触发 */
InitQueue(&uartqueue);
}
/******************串口发送一个数据****************************/
void UART1SendChar(uint8 data)
{
if ((U1LSR & 0x20) != 0)
U1THR = data;
U1IER = U1IER | 0x02;
}
/**/
void UART0Putch(uint8 *Data,uint16 len)
{
uint8 i,err;
OSSemPend(sem1,0,&err);
if ((U1LSR & 0x00000020) != 0)
{ /* UART0发送保持寄存器空 */
if (len <= 4)
{
for (i=0; i<len; i++)
{
U1THR = *Data;
Data++;}
U1IER = U1IER | 0x02; /* 允许发送中断 */
}
else
{
do{
for (i=0; i<4; i++)
{
U1THR = *Data;
Data++;
}
U1IER = U1IER | 0x02; /* 允许发送中断 */
while ((U1LSR & 0x00000020) == 0);
len -= 4;
}while(len>4);
if (len > 0)
{
for (i=0; i<len; i++)
{
U1THR = *Data;
Data++;
}
U1IER = U1IER | 0x02; /* 允许发送中断 */
while ((U1LSR & 0x00000020) == 0);
}
}
}
OSSemPost(sem1);
}
int main (void)
{
INT16U i;
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 5);
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 6);
OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 7);
OSTaskCreate (Task3,(void *)0, &TaskStk3[TaskStkLengh - 1], 4);
uart1.td_len = 10;
for (i=0; i<10; i++)
uart1.SenBuf[i] = 0x30+i;
for (i=10; i<1000; i++)
uart1.SenBuf[i] = 'a';
sem = OSSemCreate(0);
sem1 = OSSemCreate(1);
uartsem = OSSemCreate(0);
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
********************************************************************************************************/
void Task0 (void *pdata)
{
INT8U a;//,err;
a = 0x55;
TargetInit ();
UART_Init();
Install_IRQ(7,(void *)UART1_Handler,2);
while (1)
{
FIO2CLR|=0x000000FF;
UART0Putch(&a,1);
OSTimeDly(100);
}
}
/*********************************************************************************************************
** Task1 任务1
********************************************************************************************************/
void Task1 (void *pdata)
{
pdata = pdata;
while (1)
{
FIO2SET |= 0x0ff;
OSTimeDly(200);
}
}
/**********************************************************************************
** Task2 任务2 串口发送
***********************************************************************************/
void Task2 (void *pdata)
{
INT8U err;
pdata = pdata;
while(1)
{
OSSemPend(sem,0,&err);
UART0Putch(uart1.SenBuf,1000);
}
}
/**********************************************************************************
** Task3 串口接收数据
***********************************************************************************/
void Task3 (void *pdata)
{
INT8U err,a[QueueSize],i=0;
pdata = pdata;
while(1)
{
OSSemPend(uartsem,0,&err);
while(QueueEmpty(&uartqueue) == 0)
a[i++]=DeQueue(&uartqueue);
UART0Putch(a,i);
i = 0;
}
}
/**********************************************************************************
** Task4
**********************************************************************************/
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -