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

📄 main.c

📁 基于44B0的uCOS程序
💻 C
字号:
/****************************************************************************
【文  件  名  称】main.c
【功  能  描  述】三星S3C44B0X板 uC/OS-II 程序代码
【程  序  版  本】1.0
【创建人及创建日期】蓝海微芯//2003-12-19 10:57
【修改人及修改日期】蓝海微芯//2004-6-6 23:27
****************************************************************************/
#include    "def.h"
#include	"option.h"
#include	"44blib.h"
#include	"44b.h"

#include    "rtc.h"

#include    "os_cpu.h"
#include	"ucos_ii.h"               /* uC/OS interface */
#include	"target.h"
//***************************************************************************
/* allocate memory for tasks' stacks */
#ifdef SEMIHOSTED
	#define STACKSIZE       (SEMIHOSTED_STACK_NEEDS+64)
#else
	//#define  TASK_STACK_SIZE	(  256+64 )
	#define  TASK_STACK_SIZE	(  512+64 )
	//#define  TASK_STACK_SIZE	( 8192+64 )
#endif

//***************************************************************************
OS_STK Main_Task_Stack[TASK_STACK_SIZE];
void Main_Task( void *Id ) ;
#define Main_Task_PRIO       4

OS_STK Task_Beep_Stack[TASK_STACK_SIZE];
void Task_Beep( void *Id ) ;
#define Task_Beep_PRIO       5

OS_STK Task_LED_Stack[TASK_STACK_SIZE];
void Task_LED( void *Id ) ;
#define Task_LED_PRIO       6

OS_STK  Task_KeyScan_Stack[TASK_STACK_SIZE];
void Task_KeyScan( void *Id ) ;
#define Task_KeyScan_PRIO       7

OS_STK Task_Rtc_Disp_Stack[TASK_STACK_SIZE*2];
void Task_Rtc_Disp( void *Id ) ;
#define Task_Rtc_Disp_PRIO       9

OS_STK Task_User1_Stack[TASK_STACK_SIZE*2];
void Task_User1( void *Id ) ;
#define Task_User1_PRIO       10


OS_EVENT *UART0_SEM ;		//UART 0信号量
OS_EVENT *Key_Mbox ;		//按键消息邮箱
OS_EVENT *OK_Mbox;		    //按键消息邮箱

//user define 
#define	SET_LED_OUT	rPCONE=0x5569
#define	SET_D1_ON		rPDATE&=0xFFFFFFFE
#define	SET_D1_OFF		rPDATE|=0x00000001

#define SET_D4_ON		rPDATE&=0xFFFFFFF7
#define SET_D4_OFF		rPDATE|=0x00000008

#define SET_D5_ON		rPDATE&=0xFFFFFFEF
#define SET_D5_OFF		rPDATE|=0x00000010

#define SET_D6_ON		rPDATE&=0xFFFFFFDF
#define SET_D6_OFF		rPDATE|=0x00000020

#define SET_D7_ON		rPDATE&=0xFFFFFFBF
#define SET_D7_OFF		rPDATE|=0x00000040

#define SET_D8_ON		rPDATE&=0xFFFFFF7F
#define SET_D8_OFF		rPDATE|=0x00000080
//user define 

/******************************************************************************
【功能说明】主任务,在本任务中启动系统定时器并创建其他任务
******************************************************************************/
void Main_Task( void *Id )
{
	U8 err ;
	
	ARMStartTimer();
	OSStatInit();

//	OSTaskCreate( Task_Beep, (void *)0, (OS_STK *)&Task_Beep_Stack[TASK_STACK_SIZE-1], Task_Beep_PRIO ) ;
	OSTaskCreate( Task_KeyScan, (void *)0, (OS_STK *)&Task_KeyScan_Stack[TASK_STACK_SIZE-1], Task_KeyScan_PRIO ) ;
//	OSTaskCreate( Task_LED, (void *)0, (OS_STK *)&Task_LED_Stack[TASK_STACK_SIZE-1], Task_LED_PRIO ) ;
	OSTaskCreate( Task_Rtc_Disp, (void *)0, (OS_STK *)&Task_Rtc_Disp_Stack[TASK_STACK_SIZE*2-1], Task_Rtc_Disp_PRIO ) ;
	OSTaskCreate( Task_User1, (void *)0, (OS_STK *)&Task_User1_Stack[TASK_STACK_SIZE*2-1], Task_User1_PRIO) ;
	for( ; ; )	
	{
		OSTimeDly(10000);
		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
//		Uart_Printf( "++++++++++++++++++++++++++++++++++++++" ) ;
		Uart_Printf( "OSCPUUsage = %d%% \n", OSCPUUsage ) ;
		OSSemPost(UART0_SEM) ;		//置起指定的信号量
	}
}


/******************************************************************************
【功能说明】用户自定义任务,实验用
******************************************************************************/
void Task_User1( void *Id )
{
	U8 err ;
	U8 i;
	i=0;
	rPCONE=0x5569;
	rPDATE=0x0000;
	SET_D1_OFF;
	SET_D4_OFF;
	SET_D5_OFF;
	SET_D6_OFF;
	SET_D7_OFF;
	SET_D8_OFF;
	for(;;)
	{
		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
//		Uart_Printf( "i=%d,Task_User1_Running!\n",i++ ) ;
		OSSemPost(UART0_SEM) ;		//置起指定的信号量

		SET_D8_ON;
		OSTimeDly( OS_TICKS_PER_SEC/2);		//将任务延时若干时钟节拍
		SET_D8_OFF;
		OSTimeDly( OS_TICKS_PER_SEC/2 );
	}
}




/******************************************************************************
【功能说明】本任务使LED来回闪烁
******************************************************************************/
void Task_LED( void *Id )
{
	for(;;)
	{
		Led_Set( 0x08 ) ;		//
		OSTimeDly( 100 );		//将任务延时若干时钟节拍
		Led_Set( 0x04 ) ;		//
		OSTimeDly( 100 );		//将任务延时若干时钟节拍
		Led_Set( 0x02 ) ;		//
		OSTimeDly( 100 );		//将任务延时若干时钟节拍
		Led_Set( 0x01 ) ;		//
		OSTimeDly( 100 );		//将任务延时若干时钟节拍
		Led_Set( 0x00 ) ;		//
		OSTimeDly( 30 );		//将任务延时若干时钟节拍
	}
}

/******************************************************************************
【功能说明】蜂鸣器定时发生任务
******************************************************************************/
void Task_Beep( void *Id )
{
	U8 err ;
	U16 m ;

	for( ; ; )	
	{	
		for( m = 0; m < 200; m++ )
		{
			Beep( ON ) ;
			OSTimeDly(1);		//将任务延时若干时钟节拍
			Beep( OFF ) ;
			OSTimeDly(1);		//将任务延时若干时钟节拍
		}
		OSTimeDly(1500);		//将任务延时若干时钟节拍

		//OSSchedLock() ;		//停止任务调度
		OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
		Uart_Printf( "Task Beep is running!\n" ) ;
		OSSemPost(UART0_SEM) ;		//置起指定的信号量
		//OSSchedUnlock() ;		//恢复任务调度
	}
}

/******************************************************************************
【功能说明】按键扫描的任务,因启用了中断,本任务弃置不用
******************************************************************************/
void Task_KeyScan( void *Id )
{
	U8 key ;
	U8 err ;
	Uart_Printf("Task_KeyScan Running!...\n");
//	rPCONG = rPCONG &0xf0f0 ;		        //PG0156 is input
//test
	rPCONG = rPCONG &0xFFFFC3F0;			//
	rPUPG  = rPUPG  &0xff ;
	
	for( ; ; )	
	{
		if( (rPDATG&0x63)!= 0x63 )		    //有键按下
		{
			OSTimeDly(15);		            //将任务延时若干时钟节拍
			if( (rPDATG&0x63)!= 0x63 )	    //键仍然按下
			{
				switch (rPDATG&0x63)
				{
					case 0x23 : 
						key = 4 ;
						break;
					case 0x43 : 
						key = 3 ;
						break;
					case 0x61 : 
						key = 2 ;
						break;
					case 0x62 : 
						key = 1 ;
						break;
					default   : 
						key = 0 ;
						break;

//					case 0x0e : OSMboxPost(Key_Mbox, (void *)4); break ;
//					case 0x0d : OSMboxPost( OK_Mbox, (void *)6); break ;
//					case 0xdf : OSMboxPost(Key_Mbox, (void *)7); break ;
//					default :	 key = 0 ;
				}
			}

			OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
				//if( key == 0 )
				//{
					Uart_Printf( "\tkey is pressed , " ) ;
					Uart_Printf( "\tKey=%d\n",key );
				//	Uart_Printf( "rPDATG = 0x%02x\n", (rPDATG&0xe0) ) ;
				//}
			OSSemPost(UART0_SEM) ;		//置起指定的信号量
			
			while( (rPDATG&0x63)!= 0x63 )		//键仍然按下
				OSTimeDly(20);		//将任务延时若干时钟节拍
		}
		
		OSTimeDly(20);		//将任务延时若干时钟节拍
	}
}

/******************************************************************************
【功能说明】本任务显示系统当前时间
 *****************************************************************************/
void Task_Rtc_Disp( void *Id )
{
	INT8U err ;
	INT8U nop;
	INT8U m ;
	STRU_SYS_TIME c_SysTime ;
	STRU_SYS_TIME Get_SysTime;

//test for RTC init
	nop=nop;
	nop=nop;
//	rRTCCON	|=	(1<<3);	//RTC clock count reset
	nop=nop;
	nop=nop;
	
	rRTCCON=0x1;  
    Get_SysTime.ucYear  = rBCDYEAR;
	Get_SysTime.ucMonth = rBCDMON;   
	Get_SysTime.ucDay   = rBCDDAY;
	Get_SysTime.ucHour  = rBCDHOUR;
	Get_SysTime.ucMinute= rBCDMIN;   
    Get_SysTime.ucSecond= rBCDSEC;
    rBCDSEC	=	0x11;
    rBCDMIN	=	0x25;
    rBCDHOUR=	0x23;
    rBCDDAY	=	0x04;
    rBCDMON	=	0x04;
    rBCDYEAR=	0x07;
   	rRTCCON=0x0;
	nop=nop;
	nop=nop;




//end of test for RTC init 
	for( ; ; )
	{
		OSTimeDly(500);		     //将任务延时若干时钟节拍
//test
		





 



//end of test



		OSSchedLock() ;		     //停止任务调度
		c_SysTime = Get_Time() ;
		OSSchedUnlock() ;		 //恢复任务调度
//		if ( m != c_SysTime.ucSecond )
		{
			OSSemPend(UART0_SEM, 0, &err) ;		//挂起当前任务直至其他任务或中断置起信号量
			Uart_Printf( "The Time is %2x", c_SysTime.ucHour ) ;
			Uart_Printf( ":%02x", c_SysTime.ucMinute ) ;
			Uart_Printf( ":%02x", c_SysTime.ucSecond ) ;
			Uart_Printf( "--%02x", c_SysTime.ucDay ) ;
			Uart_Printf( "/%02x", c_SysTime.ucMonth ) ;
			Uart_Printf( "/%4x\n", (0x2000 + c_SysTime.ucYear) ) ;
			OSSemPost(UART0_SEM) ;		//置起指定的信号量
			
			m = c_SysTime.ucSecond ;
		}
	}
}

/******************************************************************************
【功能说明】系统主函数
******************************************************************************/
void Main(void)
{
	U16 ver ;

	ARMTargetInit();		//目标板初始化
	Uart_Printf("\n\nTarget Reset\n");
	Uart_Printf("Target Initing\n");

    Uart_Printf("\n\n注意由于本程序使用了中断,所以必须将本项目的目标代码烧写入Flash的0地址\n");
    Uart_Printf("这样Flash中才有中断向量,不过只需要烧入一次就行了,以后JTAG调试或网口下载运行本程序就没有问题了\n");
    Uart_Printf("可以使用netload或者是comload下载本目标代码到SDRAM,然后用Prog 0烧写代码到Flash(不覆盖0地址跳转指令)\n\n");
	
	OSInit();		//uCOS-II初始化
	Uart_Printf("OS Initing\n");

	OSTimeSet(0);
    Uart_Printf("OS Time setting\n");
 
    ver = OSVersion();
    Uart_Printf("OS Version: %d\n",ver);

	//创建信号量
	UART0_SEM = OSSemCreate( 1 ) ;		//UART 0 信号量
	
	//创建消息邮箱
	Key_Mbox = OSMboxCreate( (void *)0 );

	//创建信号量
	OK_Mbox = OSMboxCreate((void *)0);
   
	//创建主任务
	OSTaskCreate( Main_Task, (void *)0, (OS_STK *)&Main_Task_Stack[TASK_STACK_SIZE-1], Main_Task_PRIO ) ;
        
	ARMTargetStart();		//start the ARM target running
	Uart_Printf("OS Starting\n\n");

	OSStart();		//Start uCOS-II

    /* never reached */
}
//*****************************************************************************

⌨️ 快捷键说明

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