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

📄 test.c

📁 ARM下的多任务操作系统源码:GogotoOS
💻 C
字号:


#include		<GGT_OS.h>

#include		"Source\OS_CPU\lpc210X.h"

#define			NOP()      __asm{NOP}


UINT8 C;

UINT8 Buf[100];
INT32 Len = 0;

void IntUart0(void)   __irq   
{								   
	NOP();NOP();
	switch (U0IIR & 0x0e)
	{
		case 0x02:
		
		break;

		case 0x04:
			while((U0LSR & 0x01) == 1)
				C = U0RBR;	
			IOPIN ^= (1 << 27);
		break;			
     	case 0x0C:	
			while((U0LSR & 0x01) == 1)
			{
				C = U0RBR;
				Buf[Len++] = C;
			}
			IOPIN ^= (1 << 27);
			//while(1);
		break;
		default: break;
	}
	VICVectAddr = 0;
	NOP();NOP();
	//VICVectAddr = 0;
}

#define 		PLL_SCALE     5
#define 		Fosc			11059200
#define 		Fcclk       (Fosc * PLL_SCALE)
#define 		Fcco        (Fcclk * 4)
#define 		Fpclk       (Fcclk / 1) * 1
#define 		Fwdt		(Fpclk / 1)
#define	 		Fadclk		1000000

#define			IRQ_ENABLE				(1<<5)

#define			WDT_INT_VECT			0		// 分配IRQ通道
#define			SOFT_INT_VECT			1		// 分配IRQ通道
#define			TIME0_INT_VECT			4		// 分配IRQ通道
#define			TIME1_INT_VECT			5		// 分配IRQ通道
#define			UART0_INT_VECT			6		// 分配IRQ通道 	1
#define			UART1_INT_VECT			7		// 分配IRQ通道 	2
#define			PWM0_INT_VECT			8		// 分配IRQ通道
#define			IIC_INT_VECT			9		// 分配IRQ通道 	6
#define			SPI0_INT_VECT			10		// 分配IRQ通道
#define			SPI1_INT_VECT			11		// 分配IRQ通道
#define			PLL_INT_VECT			12		// 分配IRQ通道
#define			RTC_INT_VECT			13		// 分配IRQ通道 	3
#define			EINT0_INT_VECT			14		// 分配IRQ通道	4
#define			EINT1_INT_VECT			15		// 分配IRQ通道
#define			EINT2_INT_VECT			16		// 分配IRQ通道 	5
#define			EINT3_INT_VECT			17		// 分配IRQ通道
#define			ADC0_INT_VECT			18		// 分配IRQ通道
//#define			IIC1_INT_VECT			19		// 分配IRQ通道
//#define			BOD_INT_VECT			20		// 分配IRQ通道
//#define			ADC1_INT_VECT			21		// 分配IRQ通道

/////////////	EXTMODE	
#define			EXTMODE0				0		// 
#define			EXTMODE1				1		// 
#define			EXTMODE2				2		// 
#define			EXTMODE3				3		// 

/////////////	EXTPOLAR	
#define			EXTPOLAR0				0		// 
#define			EXTPOLAR1				1		// 
#define			EXTPOLAR2				2		// 
#define			EXTPOLAR3				3		// 

/////////////  EXTINT
#define			EINT0					0
#define			EINT1					1
#define			EINT2					2
#define			EINT3					3

#define  CHK_UART0          16	  	// P0.16   
#define  CTL_UART0          17		// P0.17  =0:CPU对外,=1:
#define Uart0_OFF	    (IOSET|=(1<<CTL_UART0))         //关闭CPU的uart0(接电脑或其他)
#define Uart0_ON	    (IOCLR|=(1<<CTL_UART0))			//打开CPU的uart0(接电脑或其他)

void InitUart0(void)
{
	unsigned short  Fdiv;

	PINSEL0 |= 0x00000005; 
	U0LCR = 0x83;
	        
	Fdiv = (Fpclk / 16) / (9600); 
	U0DLM = Fdiv / 256;							
	U0DLL = Fdiv % 256;
		    
	U0LCR = 0x03;
	U0IER = 0x03;
	U0FCR = 0xC7;
	
	VICVectAddr2  = (unsigned long)IntUart0;
	VICVectCntl2  = (IRQ_ENABLE | UART0_INT_VECT);
	VICIntEnable  |= (1 << UART0_INT_VECT);

	IODIR	|= (1<<17);    //P0.17为输出
	Uart0_ON;
}


#define			Nop()      __asm{NOP}


void SetWDT(void)
{
	IOPIN ^= (1 << 28);		
	IOCLR  = (1<<19); 
	Nop();	Nop();Nop();	Nop();Nop();	Nop();Nop();	Nop();
	IOSET  = (1<<19); 
	Nop();	Nop();Nop();	Nop();Nop();	Nop();Nop();	Nop();
}

INT32 IsBusy = 0;

void Dec(INT32 * Data, INT32 DecV)
{
	(*Data) -= DecV;
}

void AddDec(UINT8 Flag, INT32 * Data, INT32 AddV, INT32 DecV)
{
	(*Data) += AddV;
	Dec(Data, DecV);
	IsBusy = 1;
	U0THR = Flag;
	U0THR = *(((UINT8 *)Data) + 0);
	U0THR = *(((UINT8 *)Data) + 1);
	U0THR = *(((UINT8 *)Data) + 2);
	U0THR = *(((UINT8 *)Data) + 3);
	U0THR = ' ';
	U0THR = ' ';
	U0THR = ' ';
	IsBusy = 0;
}

void Send(UINT8 Flag, INT32 *Data)
{
	AddDec(Flag, Data, 2, 1);	
}


UINT32 TaskID1 = 0;
_Mut Mut;

void TaskMain1(UINT32 Param)	__task
{
	_Msg Msg;
	UINT32 ID;

	OSTimerSet(OSTaskSelf(), 1000);
	ID = OSTimerSet(OSTaskSelf(), 5000);
	OSTimerSet(OSTaskSelf(), 10000);
	OSTimerKill(ID);
		
	
	while(Param == 156)
	{
		SetWDT();
		OSTaskDelay(100);
		if(OSTaskMsgPeek(&Msg))
		{
			if(Msg.Msg == 1000)
				U0THR = Msg.wParam;
			if(Msg.Msg == OS_MSG_TIMER)
				U0THR = 'T';
		}
	}
}

void TaskMain2(UINT32 Param)	__task
{
	while(Param == 158)
	{
		IOPIN ^= (1 << 27);
		OSMutWait(&Mut);
		OSTaskMsgPost(TaskID1, 1000, '2', 0);
		OSMutRelease(&Mut);
	}
}

void TaskMain3(UINT32 Param)	__task
{
	while(Param == 158)
	{
		OSMutWait(&Mut);
		OSTaskDelay(4000);
		OSMutRelease(&Mut);
	}
}

void TaskMain4(UINT32 Param)	__task
{
	while(Param == 158)
	{
		IOPIN ^= (1 << 29);
		OSMutWait(&Mut);
		OSTaskMsgPost(TaskID1, 1000, '4', 0);
		OSMutRelease(&Mut);
	}
}


void TaskUasrMain(void) __task
{
	IODIR |= ((1 << 27) | (1 << 28) | (1 << 29) | (1 << 19));
	IOCLR =  ((1 << 27) | (1 << 28) | (1 << 29) | (1 << 19));
	InitUart0();
	U0THR = 'R';
	OSMutInit(&Mut);
	TaskID1 = OSTaskCreate(TaskMain1, 255, 156);
	OSTaskCreate(TaskMain2, 254, 158);
	OSTaskCreate(TaskMain3, 255, 158);
	OSTaskCreate(TaskMain4, 255, 158);

	while(1);
}


⌨️ 快捷键说明

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