/*******************************************************************************/

#include <includes_all.h>

/*********************************任务变量定义*********************************/

//任务优先级
#define	STARTUP_TASK_PRIO				3						//起始任务
#define	RUN_LED_TASK_PRIO				7						//运行指示灯任务
	
//任务堆栈大小（单位为OS_STK）
#define	STARTUP_STK_SIZE				100
#define	RUN_LED_STK_SIZE				100

//任务控制块
static	OS_TCB	STARTUP_TCB;
static	OS_TCB	RUN_LED_TCB;

//任务堆栈
static	CPU_STK	STARTUP_STK[STARTUP_STK_SIZE];
static	CPU_STK	RUN_LED_STK[RUN_LED_STK_SIZE];

/*******************************************************************************
* 函数名称：void SYSTICK_Init(void)
* 函数说明：系统滴答初始化
* 输入参数：无
* 返回参数：无
*******************************************************************************/
void SYSTICK_Init(void)
{
	SysTick_Config(SystemCoreClock/OS_CFG_TICK_RATE_HZ);		//初始化并使能SysTick定时器
	if(SysTick_Config(SystemCoreClock/OS_CFG_TICK_RATE_HZ))		//ST3.5.0库版本
	{
		/* Capture error */
		while(1);
	}
}

/*******************************************************************************
* 函数名称：void RUN_LED_TASK(void *p_arg)
* 函数说明：运行指示灯任务
* 输入参数：无
* 返回参数：无
*******************************************************************************/
void RUN_LED_TASK(void *p_arg)
{
	OS_ERR err;
	
	while(1)
	{
		LED_Run_On(LED_Run0);
		OSTimeDlyHMSM(0, 0, 0, 300, OS_OPT_TIME_HMSM_STRICT, &err);
		LED_Run_Off(LED_Run0);
		OSTimeDlyHMSM(0, 0, 0, 300, OS_OPT_TIME_HMSM_STRICT, &err);
	}
}

/*******************************************************************************
* 函数名称：void STARTUP_TASK(void *p_arg)
* 函数说明：起始任务，创建新的任务
* 输入参数：无
* 返回参数：无
*******************************************************************************/
void STARTUP_TASK(void *p_arg)
{
	OS_ERR err;
	
	SYSTICK_Init();												//系统滴答初始化
	
	/***********创建任务***********/
	OSTaskCreate((OS_TCB	 *) &RUN_LED_TCB,					//任务控制块指针
	
				 (CPU_CHAR	 *) "RUN_LED",						//任务名称
				 (OS_TASK_PTR ) RUN_LED_TASK,					//任务代码指针
				 (void		 *) 0,								//传递给任务的参数parg
					 
				 (OS_PRIO	  ) RUN_LED_TASK_PRIO,				//任务优先级
				 (CPU_STK	 *) &RUN_LED_STK[0],				//任务堆栈基地址
				 (CPU_STK_SIZE) RUN_LED_STK_SIZE/10,			//堆栈警戒线
				 
				 (CPU_STK_SIZE) RUN_LED_STK_SIZE,				//堆栈大小
				 (OS_MSG_QTY  ) 0,								//可接收的最大消息队列数
				 
				 (OS_TICK	  ) 0,								//时间片轮转时间
				 (void		 *) 0,								//任务控制块扩展信息
				 (OS_OPT	  ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),		//任务选项
				 
				 (OS_ERR	 *) &err);							//返回值
				 
	OSTaskDel(&STARTUP_TCB, &err);								//删除任务自己
				 
//	while(1)
//	{
//		LED_Run_On(LED_Run0);
//		OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
//		LED_Run_Off(LED_Run0);
//		OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
//	}
}

/*********************************************************************************
* 函数名称:	 void NVIC_Configuration(void)
* 函数说明： 中断优先级分组方式，中断优先级，使能配置
* 输入参数： 无
* 返回参数： 无
**********************************************************************************/
void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
//优先级分组方式
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//Enable the Ethernet global Interrupt
	NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* 函数名称：int main(void)
* 函数说明：程序主函数
* 输入参数：无
* 返回参数：0
*******************************************************************************/
int main(void)
{
	OS_ERR err;
	
	LED_Run_Init();						//运行指示灯配置初始化函数
	
	NVIC_Configuration();
	
	/**********网络初始化**********/
	STM32_Ethernet_Init();
	LwIP_Init();
	
	OSInit(&err);						//uCOS-III初始化
	
	/***********创建任务***********/
	OSTaskCreate((OS_TCB	 *) &STARTUP_TCB,					//任务控制块指针
	
				 (CPU_CHAR	 *) "STARTUP",						//任务名称
				 (OS_TASK_PTR ) STARTUP_TASK,					//任务代码指针
				 (void		 *) 0,								//传递给任务的参数parg
					 
				 (OS_PRIO	  ) STARTUP_TASK_PRIO,				//任务优先级
				 (CPU_STK	 *) &STARTUP_STK[0],				//任务堆栈基地址
				 (CPU_STK_SIZE) STARTUP_STK_SIZE/10,			//堆栈警戒线
				 
				 (CPU_STK_SIZE) STARTUP_STK_SIZE,				//堆栈大小
				 (OS_MSG_QTY  ) 0,								//可接收的最大消息队列数
				 
				 (OS_TICK	  ) 0,								//时间片轮转时间
				 (void		 *) 0,								//任务控制块扩展信息
				 (OS_OPT	  ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),		//任务选项
				 
				 (OS_ERR	 *) &err);							//返回值
				 
	OSStart(&err);
}

/***********************************FILE END***********************************/

