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

📄 main.c

📁 一个在KEIL公司的MDK3.20编译通过运行的基于S3C44B0X芯片的UCOSII源代码
💻 C
字号:
/*
 * File:        main.c
 *
 * uC/OS Real-time multitasking kernel for the ARM processor.
 *
 *
 * Created by hgxxx
 *
 */

#include	"..\ucos-ii\includes.h"               /* uC/OS interface */
#include	"..\inc\44blib.h"
#include	"..\startup\44b.h"
#include	"..\startup\option.h"
#include	"..\inc\target.h"


/* allocate memory for tasks' stacks */
#ifdef SEMIHOSTED
#define STACKSIZE       (SEMIHOSTED_STACK_NEEDS+64)
#else
#define	STACKSIZE	128
#endif

OS_STK Stack0[STACKSIZE];

OS_STK Stack1[STACKSIZE];
OS_STK Stack2[STACKSIZE];
OS_STK Stack3[STACKSIZE];
OS_STK Stack4[STACKSIZE];
OS_STK Stack5[STACKSIZE];

//OS_EVENT *UartSem;

INT8U   downPt[2048];
INT16U	curnu = 0;
INT8U   downPt1[2048];
INT16U	curnu1 = 0;

OS_EVENT *UART0_SEM ;		//UART 0信号量

OS_EVENT *Key_Mbox ;		//按键消息邮箱

volatile char which_int=0;	  
unsigned char txmsg;
void DoInt4567Isr(void)
{
	which_int = rEXTINTPND;
	rEXTINTPND = 0xf;		//clear EXTINTPND reg.
	rI_ISPC = BIT_EINT4567;	//clear pending_bit	
	
	switch(which_int){
		case 1:
			{
			    txmsg=1;
			    OSMboxPost(Key_Mbox, (void *)&txmsg);
				//Uart_Printf("extern interrupt4!\n");
			    //Led_Set(0x1);
			}
		break;
		case 2:
			{
			     txmsg=2;
			    OSMboxPost(Key_Mbox, (void *)&txmsg);
				//Uart_Printf("extern interrupt5!\n");
			    //Led_Set(0x2);
			}
		break;
		case 4:
			{
			     txmsg=3;
			    OSMboxPost(Key_Mbox, (void *)&txmsg);
				//Uart_Printf("extern interrupt6!\n");
			    //Led_Set(0x4);
			}
		break;
		case 8:
			{
			     txmsg=4;
			    OSMboxPost(Key_Mbox, (void *)&txmsg);
				//Uart_Printf("extern interrupt7!\n");
			    //Led_Set(0x8);
			}
		break;
	}

}

void Init4567Isr(void)
{
	
    pISR_EINT4567= (unsigned)OSEINT4567ISR ;
	rPCONG = rPCONG | 0xff00;		//GPG4、5、6、7设为中断引脚
	rPUPG = rPUPG & 0x0f;			//GPG4、5、6、7上拉电阻有效
	rEXTINT=0x22222222;			//下降沿触发
	rINTMSK &= ~BIT_EINT4567;
}

void __irq Uart0_RxInt(void)
{
	rI_ISPC=BIT_URXD0 ;   //clear pending bits,Default value=0x0000000
	downPt[curnu] = RdURXH0();
	curnu++;
	downPt[curnu] = 0;
	curnu %= 2047;
}

void InitURXD0ISR(void)
{
	pISR_URXD0=(unsigned)Uart0_RxInt;
	rINTMSK &= ~BIT_URXD0;	//Default value=0x7ffffff
	/*pISR_FIQ,pISR_IRQ must be initialized*/   
}


void __irq Uart1_RxInt(void)
{
	rI_ISPC=BIT_URXD1 ;   //clear pending bits,Default value=0x0000000
	downPt1[curnu1] = RdURXH1();
	curnu1++;
	downPt1[curnu1] = 0;
	curnu1 %= 2047;
}

void InitURXD1ISR(void)
{
	pISR_URXD1=(unsigned)Uart1_RxInt;
	rINTMSK &= ~BIT_URXD1;	//Default value=0x7ffffff
	/*pISR_FIQ,pISR_IRQ must be initialized*/   
}


void Task1(void *i)
{
	INT32U task_time;
	INT8U err ;
	ARMStartTimer();

	OSStatInit();

	Init4567Isr();
	InitURXD0ISR();
	InitURXD1ISR();
	Uart_Printf("Task1 Running\n");
	
	for (;;){
		task_time = OSTimeGet();
		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
		Uart_Printf("Task1 go go go. @ system time  %ld\n",task_time);
		OSSemPost(UART0_SEM) ;		//置起指定的信号量
		OSTimeDly(800);
	}
}

void Task2(void *i)
{

	
	INT32U task_time;
	INT8U err ;
	Uart_Printf("Task2 Running\n");

	for (;;){
		task_time = OSTimeGet();

		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
		Uart_Printf("Task2 go go go. @ system time  %ld\n",task_time);
		OSSemPost(UART0_SEM) ;		//置起指定的信号量	
	    OSTimeDly(1600);
	}
}

void Task3(void *i)
{
	
	INT32U task_time;
	INT8U err ;
	Uart_Printf("Task3 Running\n");
	
	for (;;){
		task_time = OSTimeGet();

		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量	
		Uart_Printf("Task3 go go go. @ system time  %ld\n",task_time);
		OSSemPost(UART0_SEM) ;		//置起指定的信号量
		OSTimeDly(3200);
	}
}

void Task4(void *i)
{
	INT32U task_time;
	INT8U err ;
	Uart_Printf("Task4 Running\n");
	
	for (;;){
		task_time = OSTimeGet();

		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
		Uart_Printf("Task4 go go go. @ system time  %ld\n",task_time);
		OSSemPost(UART0_SEM) ;		//置起指定的信号量	
		OSTimeDly(6400);
	}
}

/******************************************************************************
【功能说明】按键扫描的任务,
******************************************************************************/
void Task5(void *i)
{
	INT8U err ;
	INT8U *whichkey;
	Uart_Printf("Task5 Running\n");
	for( ; ; )	
	{
	  whichkey=OSMboxPend(Key_Mbox,0,&err);
	  switch(*whichkey)
	  {
		case 1:
			{
			    Led_Set(0x1);
			}
		break;
		case 2:
			{
			    Led_Set(0x2);
			}
		break;
		case 3:
			{
			    Led_Set(0x4);
			}
		break;
		case 4:
			{
			    Led_Set(0x8);
			}
		break;
		default:
		 break;
	  }
	  OSSemPend(UART0_SEM, 0, &err);		//挂起当前任务直至其他任务或中断置起信号量
	  Uart_Printf( "%d%  key is pressed\n", *whichkey-1);
	  OSSemPost(UART0_SEM) ;		//置起指定的信号量
      OSTimeDly(50);		
	}
}

void TaskStart(void *i)
{	
    INT8U err ;
	ARMStartTimer();

	OSStatInit();
	
	for(;;){
		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
		Uart_Printf("++++++++++++++++++++++++++++++++++++++ ");
		Uart_Printf("OSCPUUsage = %d%% \n",OSCPUUsage);
		OSSemPost(UART0_SEM) ;		//置起指定的信号量 	
		OSTimeDly(10000);
	}
}

void Main(void)
{

	char Id0 = '1';
	char Id1 = '2';
	char Id2 = '3';
	char Id3 = '4';
	char Id4 = '5';
	char Id5 = '6';
	ARMTargetInit();	
	OSInit();
	OSTimeSet(0);

	//创建信号量
	UART0_SEM = OSSemCreate( 1 ) ;		//UART 0 信号量

	Key_Mbox = OSMboxCreate( (void *)0 );
	/* 
	* create the tasks in uC/OS and assign decreasing
	* priority to them 
	*/
	OSTaskCreate(TaskStart, (void *)&Id0, (void *)&Stack0[STACKSIZE - 1], 1);
	
	OSTaskCreate(Task1, (void *)&Id1, (void *)&Stack1[STACKSIZE - 1], 2);
	OSTaskCreate(Task2, (void *)&Id2, (void *)&Stack2[STACKSIZE - 1], 3);
	OSTaskCreate(Task3, (void *)&Id3, (void *)&Stack3[STACKSIZE - 1], 4);
	OSTaskCreate(Task4, (void *)&Id4, (void *)&Stack4[STACKSIZE - 1], 5);
    OSTaskCreate(Task5, (void *)&Id5, (void *)&Stack5[STACKSIZE - 1], 6);
	/* Start the  system running */
	ARMTargetStart();

	/* start the system */
	OSStart();

} /* main */

⌨️ 快捷键说明

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