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

📄 9311main.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311main.c                                            	*/
/*模块功能:任务的创建,程序的入口									*/
/*编写日期:2004年9月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include    "includes.h"

//声明(规约等)任务
extern void YXTask(void *pdata);
extern void YCTask(void *pdata);
#if	(DF9311_FATASK > 0)
extern void FATask(struct SysPort *Info);
#endif

#if	(DF9311_1997_101_SEC > 0)
extern void P101_97SecTask(struct SysPort *Info, struct PortAppInfo* PortCfg);
#endif

#if	(DF9311_1997_101_PRI > 0)
extern void P101_97PriTask(struct SysPort *Info, struct PortAppInfo* PortCfg);
#endif

#if	(DF9311_104SEC > 0)
extern void S104_2000Task(struct SysPort *Info, struct PortAppInfo* PortCfg);
#endif

#if	(DF9311_2002_101_SEC	> 0)
extern void P101_2002SecTask(struct SysPort *Info, struct PortAppInfo* PortCfg);
#endif
#if	(DF9311_FATASK > 0)
extern void FATest(void);
#endif

#if	(DF9311_DLT645PRI > 0)
extern	void DLT645_1997PriTask(struct SysPort *Info, struct PortAppInfo* PortCfg);
#endif
//全局变量
BOOL	TGSH = FALSE;		//是否带插板(没有)
INT16U	FDNum;
INT8U	PORTCFG = 0x22;		//端口配置(均为串口)

extern struct PortAppInfo	PortInfo[2];
extern struct SysConfig		SysCfg;
extern struct SysPort		*SysPorts;
extern void	*MsgQ[MAXCOMMMSG];

//为全体规约定义
struct LinkInfo* ComLink[PORTNUM];
struct AppInfo* ComApp[PORTNUM];
struct SysPort*	ComDb[PORTNUM];

//任务堆栈
OS_STK  RunTaskStack[OS_TASK_DEF_STK_SIZE*2];
#if	(DF9311_FATASK > 0)
OS_STK  FATaskStack[OS_TASK_DEF_STK_SIZE*8];
#endif
OS_STK  YXTaskStack[OS_TASK_DEF_STK_SIZE*4];
OS_STK  YCTaskStack[OS_TASK_DEF_STK_SIZE*2];
OS_STK	USART0TaskStack[OS_TASK_DEF_STK_SIZE*22];
OS_STK	USART1TaskStack[OS_TASK_DEF_STK_SIZE*22];

//信号量
OS_EVENT *SemTimerTenMS;
OS_EVENT *SemTimerOneS;

//定时器
OS_TMR	*Time100Ms,*Time10Ms,*Time1S;
INT8U	ms100[]="100mstimer";
INT8U	ms10[]="10mstimer";
INT8U	s1[]="1stimer";

//变量
INT8U	SwitchCounter = 0, SwitchCounter2 = 0;
INT16U	usart0_Count, usart1_Count, dingding = 0, PortNo;
INT32U	com_speed =	400000 ;	// Communication speed is set to 5KHz
INT16U	SysDelay = DEFSYSDELAY;
INT16U	ResetDelay = 0;	
INT32U	i2c_speed;

#ifdef CHINESEINFO
char *PortAppInfo[] = \
{" ", "DNP3.0从站...", "DNP3.0主站...", "DL451-91(CDT)从站...", "DL451-91(CDT)主站...",
" ", " ", " ", " ", " ",
"DLT634-1997从站...", "DLT634-1997主站...", "DL/T634.5101-2002从站...", "DL/T634.5101-2002主站...", " ",
"DLT645-1997多功能电度表规约", " ", "DF9000维护...", "串口测试主站...", "串口测试从站...",
" ", " ", "IEC870-5-104(草案版)从站...", "IEC870-5-104(草案版)主站...", " ",
"modbus 主站...", " ", " ", "xt9702 主站...", "西门子101从站...",
"西门子101主站...", " ", "东方GPS时钟...", "jbus 主站...", " ",
"DCM主站...", "施奈德101从站...", "施奈德101主站...", "IEC870-5-104从站...", "IEC870-5-104主站..." };
#else
char *PortAppInfo[] = \
{" " };
#endif

//ceshi
//INT16U	Code = 0;
//INT16U	dddd[80];
/*------------------------------------------------------------------*/
/*函数名称:main()													*/
/*函数功能:主程序入口												*/
/*------------------------------------------------------------------*/
int main( void )
{
	INT8U	i;
		
	//基本初始化
	SystemInitialization();    
	Pio_init();

	//dingding
//	FlashErase(FLASH_BASE, 39);	//2,4, 39
	
	//变量检测初始化
	i2c_speed = ((MCK/4) / com_speed);
	TGSH = FALSE;
	FDNum = 1;
	if (( *ZK2_YKFX & 0x80 ) == 0 )		// 根据遥控返校的D8位进行判断
	{
		TGSH = TRUE;
		FDNum = 2;
	}
			
	PORTCFG = *Com_AuxIn;				//读取端口配置
    
    //操作系统初始化
//  at91_pio_write (&PIO_DESC, LED_Error, LED_ON);     
    OSInit();
    OSTimeSet(0);

    //参数初始化	
	InitSys();
 	
	//其它初始化
 	SystemInitOther();  
	
	//创建任务及相关
    SemTimerTenMS = OSSemCreate(0);
    SemTimerOneS = OSSemCreate(0);
    
    
    //ceshi
//	Code = Read_Manufactuer_Code(FLASH_BASE);
//	ReadCFI(FLASH_BASE, dddd);
 

	SysSchedul();
	OSTaskCreateExt(RunTask, (void *)i, &RunTaskStack[OS_TASK_DEF_STK_SIZE*2-1], RUNID, RUNID, &RunTaskStack[0], 256, (void *)0, OS_TASK_OPT_STK_CHK);

	
	//系统运行
    at91_pio_write (&PIO_DESC, LED_Error, LED_OFF); 
    OSStart();
  
    return(0);
}

/*------------------------------------------------------------------*/
/*函数名称:void RunTask()											*/
/*函数功能:创建需要运行的其它任务,运行指示灯任务					*/
/*------------------------------------------------------------------*/
void RunTask(void *i)
{
	BOOL	flag, status;
	INT8U	err;

	OSTaskCreateExt(YXTask, (void *)0, &YXTaskStack[OS_TASK_DEF_STK_SIZE*4-1], YXID, YXID, &YXTaskStack[0], 512, (void *)0, OS_TASK_OPT_STK_CHK);	
	OSTaskCreateExt(YCTask, (void *)0, &YCTaskStack[OS_TASK_DEF_STK_SIZE*2-1], YCID, YCID, &YCTaskStack[0], 256, (void *)0, OS_TASK_OPT_STK_CHK);
	#if	(DF9311_FATASK > 0)
	OSTaskCreateExt(MyFATask, (void *)0, &FATaskStack[OS_TASK_DEF_STK_SIZE*8-1], FAID, FAID, &FATaskStack[0], 1024, (void *)0, OS_TASK_OPT_STK_CHK);     
	#endif
	OSTaskCreateExt(USART1Task, (void *)0, &USART0TaskStack[OS_TASK_DEF_STK_SIZE*22-1], USART1ID, USART1ID, &USART0TaskStack[0], 2816, (void *)0, OS_TASK_OPT_STK_CHK);
	OSTaskCreateExt(USART2Task, (void *)0, &USART1TaskStack[OS_TASK_DEF_STK_SIZE*22-1], USART2ID, USART2ID, &USART1TaskStack[0], 2816, (void *)0, OS_TASK_OPT_STK_CHK);

	Time10Ms = OSTmrCreate(9,1,OS_TMR_OPT_PERIODIC,time10mscall,(void*)0,ms10,&err);
	Time100Ms = OSTmrCreate(2,10,OS_TMR_OPT_PERIODIC,time100mscall,(void*)0,ms100,&err);
	Time1S = OSTmrCreate(7,100,OS_TMR_OPT_PERIODIC,time1scall,(void*)0,s1,&err);
	status = OSTmrStart(Time10Ms,&err);
	status = OSTmrStart(Time100Ms,&err);
	status = OSTmrStart(Time1S,&err);

	while(1)
    {
    	//配合引导程序
    	if (SysDelay)
    	{
    		SysDelay--;
    		if (!SysDelay)
    		{
    				KillProg(RESET_DD, RESET_RETAIN, FALSE);
    		}
		}
   		
   		//延时重启动
   		if (ResetDelay)
   		{	
   			ResetDelay--;
   			if (!ResetDelay)
   				KillProg(RESET_RETAIN, RESET_DD, TRUE);
   		}
   			
    	//临时解决下装问题
    	if (dingding)
		{
			dingding--;
			if (!dingding)
			{
				timer_init();
				UsartOpen(PortNo);
				at91_extirq_open ( &FIQ_DESC, FIQ_INTERRUPT_LEVEL, AIC_SRCTYPE_EXT_NEGATIVE_EDGE, fiq_asm_handler) ;
			}
		}
		
		if ((at91_pio_read (&PIO_DESC) & LED_Run) == LED_Run)
		{
			at91_pio_write (&PIO_DESC, LED_Run, LED_OFF);
			if (flag)
			{
				at91_pio_write (&PIO_DESC, LED_Run, LED_ON);
				flag = FALSE;
			}
		}
		else
		{
			at91_pio_write (&PIO_DESC, LED_Run, LED_ON);
			if (!flag)
			{
				at91_pio_write (&PIO_DESC, LED_Run, LED_OFF);
				flag = TRUE;
			}
		}
		
		//测试按钮
		#if	(DF9311_FATASK > 0)
		FATest();
		#endif
			
		OSTimeDlyHMSM(0, 0, 0, 500);
	}	
}

/*------------------------------------------------------------------*/
/*函数名称:MyFATask()												*/
/*函数功能:故障检测任务											*/
/*------------------------------------------------------------------*/
void MyFATask(void *pdata)
{
	#if	(DF9311_FATASK > 0)
	FATask(SysPorts);
	#endif
	
	ErrorInfo(OSPrioCur, "FA 启动失败");
	OSTaskDel(FAID);	
}

/*------------------------------------------------------------------*/
/*函数名称:USART1Task()											*/
/*函数功能:端口1任务,默认运行维护任务								*/
/*------------------------------------------------------------------*/
void USART1Task(void *pdata)
{
	UsartApp(PORT1);
	
	ErrorInfo(OSPrioCur, "端口 1 启动失败");
	OSTaskDel(USART1ID);
}

/*------------------------------------------------------------------*/
/*函数名称:USART2Task()											*/
/*函数功能:端口2任务,默认运行维护任务								*/
/*------------------------------------------------------------------*/
void USART2Task(void *pdata)
{	
	UsartApp(PORT2);
	
	ErrorInfo(OSPrioCur, "端口 2 启动失败");
	OSTaskDel(USART2ID);
}

/*------------------------------------------------------------------*/
/*函数名称:UsartApp()												*/
/*函数功能:端口任务函数,调用规约函数								*/
/*------------------------------------------------------------------*/
BOOL UsartApp(INT16U Port)
{
	INT8U	i;
	char	err[60];
	struct SysPort *info;
	
	//端口运行标志
	for (i=0; i<SysCfg.PortNum; i++)
	{
		if (SysPorts[i].PortID == PortInfo[Port-1].Port)
		{
			if (PortInfo[Port-1].Attr != 0)
			{
				SysPorts[i].Flag = TRUE;
				break;
			}
		}
	}

	#ifdef CHINESEINFO
	sprintf(err, "端口 %d 运行 %s", Port, PortAppInfo[PortInfo[Port-1].Attr]);
	#else
	sprintf(err, "Port %d run %s", Port, PortAppInfo[PortInfo[Port-1].Attr]);
	#endif
	ErrorInfo(OSPrioCur, err);
	
	if (SysPorts[i].Flag)
	{
		switch (PortInfo[Port-1].Attr)
		{
			//添加端口运行规约区(起始)
			case DNPSEC:
				#if	(DF9311_DNP30SEC > 0)
				DnpSecTask(&SysPorts[i], &PortInfo[Port-1]);
				#endif
				break;
			
			case DNPPRI:
				break;
				
			case IEC101_1997SEC:
				#if	(DF9311_1997_101_SEC > 0)
				P101_97SecTask(&SysPorts[i], &PortInfo[Port-1]);
				#endif
				break;
			
			case IEC101_1997PRI:
				#if	(DF9311_1997_101_PRI > 0)
				P101_97PriTask(&SysPorts[i], &PortInfo[Port-1]);
				#endif
				break;
			
			case IEC101_2002SEC:
				#if	(DF9311_2002_101_SEC > 0)
				P101_2002SecTask(&SysPorts[i], &PortInfo[Port-1]);
				#endif
				break;
			
			case IEC101_2002PRI:
				break;
				
			case IEC104DRAFTSEC:
				break;
			
			case IEC104DRAFTPRI:
				break;

			case IEC104SEC:
				#if	(DF9311_104SEC > 0)
				S104_2000Task(&SysPorts[i], &PortInfo[Port-1]);
				#endif
				break;
			
			case IEC104PRI:
				break;
			case DLT645PRI:
				#if	(DF9311_DLT645PRI > 0)
				DLT645_1997PriTask(&SysPorts[i], &PortInfo[Port-1]);
				#endif				
			
			//添加端口运行规约区(终止)
			case MAINTSEC:
				info = malloc (sizeof (struct SysPort));
				if (!info)
					return (FALSE);
				memcpy (info, SysPorts, sizeof (struct SysPort));
				((struct SysPort*)info)->PortID = Port;
				MainSecTask(info);
				break;
			
			default:
				break;
		}
	}
	else
	{
		info = malloc (sizeof (struct SysPort));
		if (!info)
			return (FALSE);
		memcpy (info, SysPorts, sizeof (struct SysPort));
		((struct SysPort*)info)->PortID = Port;

		MainSecTask(info);
	}

	return (TRUE);
}


/*------------------------------------------------------------------*/
/*函数名称:SystemInitialization()									*/
/*函数功能:系统初始化												*/
/*------------------------------------------------------------------*/
void SystemInitialization (void)
{
    // 设置DF9311用到的除CS0外的其他片选
    EBI_CSR0 = EBI_CSR_0_New ;
	EBI_CSR1 = EBI_CSR_1_New ;
	EBI_CSR2 = EBI_CSR_2_New ;
	EBI_CSR4 = EBI_CSR_4_New ;
	EBI_CSR5 = EBI_CSR_5_New ;
	
    at91_pio_open ( &PIO_DESC, LED_MASK, PIO_OUTPUT );
}

void SystemInitOther(void)
{
	timer_init();
//	at91_irq_open ( SWIRQ_ID, SOFT_INTERRUPT_LEVEL, AIC_SRCTYPE_INT_EDGE_TRIGGERED, sw_asm_irq_handler ) ;
	at91_extirq_open ( &FIQ_DESC, FIQ_INTERRUPT_LEVEL, AIC_SRCTYPE_EXT_NEGATIVE_EDGE, fiq_asm_handler) ;	
	BSP_Init();
	memset (&Usart0, 0, sizeof(struct Usart));
	memset (&Usart1, 0, sizeof(struct Usart));
}

void aic_software_interrupt(void)
{

}

void SysSchedul(void)
{
	if (OSPrioCur)
	{
		SemTimerTenMS->OSEventCnt = 0;
		SemTimerOneS->OSEventCnt = 0;
	}
	
	if ((at91_pio_read (&PIO_DESC) & LED_Run) == LED_Run)
		at91_pio_write (&PIO_DESC, LED_Run, LED_OFF);
	else
		at91_pio_write (&PIO_DESC, LED_Run, LED_ON);
	
}


void delay (INT32U ms)
{
    INT32U    i ,count,j;
    
    count = ms/50;
    
	for(j = 0;j < count;j++)
	{
	    for ( i = 0 ;(i < MCK/140 );i++ ) ;
	    if ( (at91_pio_read(&PIO_DESC) & LED_Run ) == LED_Run )
	    {
	        at91_pio_write (&PIO_DESC, LED_Run, LED_OFF ) ;
	    }
	    else
	    {
	        at91_pio_write (&PIO_DESC, LED_Run, LED_ON ) ;
	    }
    }
}









⌨️ 快捷键说明

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