📄 9311main.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 + -