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

📄 basetask.c

📁 电力系统中的保护装置全部代码
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////////////
//      程序名: BaseTask.c
//      多任务程序
/////////////////////////////////////////////////////////////////////////////////////
#include    "BaseVariable.h"
#include    "menu_task.h"

NU_MEMORY_POOL  System_Memory;      //Nucleus 定义的结构变量

NU_TASK         Task_0_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_1_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_2_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_3_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_4_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_5_CB;              //Nucleus 定义的任务结构变量
NU_TASK         Task_6_CB;              //Nucleus 定义的任务结构变量
NU_QUEUE        SaveQueue;              //Nucleus 定义的队列结构变量

VOID    task_0(UNSIGNED argc, VOID *argv);   //任务0: 自检,遥测
VOID    task_1(UNSIGNED argc, VOID *argv);   //任务1: 保护
VOID    task_2(UNSIGNED argc, VOID *argv);   //任务2: 读键盘
VOID    task_3(UNSIGNED argc, VOID *argv);   //任务3: 显示
VOID    task_4(UNSIGNED argc, VOID *argv);   //任务4: 通信
VOID    task_5(UNSIGNED argc, VOID *argv);   //任务5: 保存报告
VOID    task_6(UNSIGNED argc, VOID *argv);   //任务6: 保存报告
VOID    timer_0(UNSIGNED argc);              //定时器0: 读开入,软件时钟加一
VOID    Application_Initialize(VOID *);      //应用程序初始化

unsigned    lcd_bg_time;                       //液晶背光时间
unsigned    subAddress_flag,subAddress_backup; //装置地址

/* Define KEY register   */
unsigned    keytime = 0;                       //键盘
unsigned    keycode = 0x0ff;
unsigned    keycounter = 0;
unsigned    key_current = 0x55aa;
unsigned    key_delaytime = 0;

/* Define KEYBUFFER   */
unsigned    key_buffer[KEY_BUFFER_LENGTH];
unsigned    *pkeybuf_in = key_buffer;
unsigned    *pkeybuf_out = key_buffer;
int         din_flag;

extern void Lcd_Draw_Diagrame();
extern void Lcd_Initial(void);
extern void Key_Scan();
extern int  Read_In_Port(int *i);

unsigned int *RDY_OE =(unsigned int*) CTRLPORT;

extern void Init_16c554(void);
extern int  Communication_1_task(void);

extern VOID EN_Sample(VOID);
extern VOID DI_Handle_Initialize(VOID);
extern VOID DI_Handle_Routine(VOID);
extern VOID Delta_I_Initialize(VOID);
extern VOID Delta_I_Routine(VOID);
extern VOID CopyFilterCoeff(VOID);
/***********************************************************************************/
/*      函数名: Application_Initialize(VOID *first_available_memory)               */
/*      功能: 创建任务, 创建保护, 初始化全局变量                                   */
/***********************************************************************************/
extern UNSIGNED *pRomsumAddr,*pRomstartAddr;
VOID   Application_Initialize(VOID *first_available_memory)
{
    VOID    *pointer;

//    UNSIGNED i;
    
   

/* Create a system memory pool that will be used to allocate task stacks,
       queue areas, etc.  */
    NU_Create_Memory_Pool(&System_Memory, "SYSMEM",
                        first_available_memory, 15000, 50, NU_FIFO);

    //创建任务0:自检
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_0_CB, "TASK 0", task_0, 0, NU_NULL, pointer, 1000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建任务1:保护
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_1_CB, "TASK 1", task_1, 0, NU_NULL, pointer, 1000,
                                        1,0, NU_PREEMPT, NU_START);

    //创建任务2:键盘
    NU_Allocate_Memory(&System_Memory, &pointer, 2000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_2_CB, "TASK 2", task_2, 0, NU_NULL, pointer, 2000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建任务3:显示
    NU_Allocate_Memory(&System_Memory, &pointer, 4000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_3_CB, "TASK 3", task_3, 0, NU_NULL, pointer, 4000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建任务4:通信
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_4_CB, "TASK 4", task_4, 0, NU_NULL, pointer, 1000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建任务5:存盘
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_5_CB, "TASK 5", task_5, 0, NU_NULL, pointer, 1000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建任务6:自检程序
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Task(&Task_6_CB, "TASK 6", task_6, 0, NU_NULL, pointer, 1000,
                                        5,1, NU_PREEMPT, NU_START);

    //创建队列1:存盘请求队列
    NU_Allocate_Memory(&System_Memory, &pointer, 1000, NU_NO_SUSPEND);
    NU_Create_Queue(&SaveQueue, "Queue_0", pointer, 1000, NU_FIXED_SIZE,
                                        1, NU_FIFO);

    CHLDEF_Initialize();           //模拟量通道结构体初始化

    Time_Initialize();             //时间初始化

    ProtectCreat();                //初始化保护链表

    CheckCreat();                  //初始化自检链表

    Base_Varible_Initialize();     //底层变量初始化

    Lcd_Initial();                 //液晶初始化

    Init_16c554();                 //16C554初始化

    CopyFilterCoeff();             //将滤波系数拷贝到内部RAM中
    EN_Sample();                   //启动T0,T1

    TCD_Interrupt_Level =  NU_ENABLE_USE_INTERRUPTS;   //初始化全部结束,开放中断 !!
}



/***********************************************************************************/
/*      函数名: task_0(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于自检                                                */
/*      说明: 程序执行一遍后,让出时间片                                            */
/***********************************************************************************/
UNSIGNED  RUNTIME0[64],TINDEX0,TT0;       //调试用,检查任务0两次执行之间的时间间隔
VOID   task_0(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS  status = (STATUS) argc + (STATUS) argv;

    register UNSIGNED  i, j;
    register CHECK     *check;
    i=(UNSIGNED)pRomsumAddr-(UNSIGNED)pRomstartAddr;
    *pRomsumAddr=LONS_Get_CRC32(pRomstartAddr,i);

    while (1)
    {
        RUNTIME0[TINDEX0] = TMD_System_Clock - TT0; //调试用,检查任务0两次执行之间的时间间隔
        if(++TINDEX0 > 63) TINDEX0 = 0;

        check = CHK_Created_Check_List;             //自检
        for (i = 0; i < CHK_Total_Check; i++, check = check->chk_link_next)
        (*(check->chk_routine_handler))(check);

        if (!(DOChn[BSJ].state))                    //如果装置已被闭锁,检查是否可以解除闭锁
        {                                
            check = CHK_Created_Check_List;
            for (i = 0, j = 0; i < CHK_Total_Check; i++, check = check->chk_link_next)
                if (check->closedown && check->pickup_flag)
                {
                    j = 1;                          //仍需闭锁保护
                    break;
                }

            if(!j)BsjBack();                        //需闭锁保护的自检错误已经返回,解除闭锁
        }

        Revert();                                   //信号复归

        StartSaveToEEP();                           //检查是否需要保存报告,电度

        RemoteMeasure();                            //遥测

        TT0 = TMD_System_Clock;

        NU_Relinquish();
    }
}



/***********************************************************************************/
/*      函数名: task_1(UNSIGNED argc, VOID *argv)                              */
/*      功能: 任务之一,主要用于通信与保护                                          */
/*      说明: 主要包括通信,开入处理,时间处理,计算,保护判别                         */
/***********************************************************************************/
UNSIGNED RUNTIME1[64],TINDEX1,TT1;         //调试用,检查任务1两次执行之间的时间间隔
VOID    task_1(UNSIGNED argc, VOID *argv)
{
    STATUS  status = (STATUS) argc + (STATUS) argv;

    static UNSIGNED RunLedClock;                      //运行灯闪烁时钟

    register PROTECT    *protect;
    register UNSIGNED   *p, i;

    while (SampleIndex < 3 * Sample_Point);           //等待采样3个周波
    Delta_I_Initialize();                             //电流突变量检查初始化
    DI_Handle_Initialize();                           //开入处理初始化

    while (1)
    {
        RUNTIME1[TINDEX1] = TMD_System_Clock - TT1;   //调试用,检查任务1两次执行之间的时间间隔
        if(++TINDEX1 > 63) TINDEX1 = 0;

        clrdog();                                     //清看门狗
        if (TMD_System_Clock - RunLedClock > 100)     //运行灯以5Hz/s的频率闪烁
        {
            RunLedClock = TMD_System_Clock;
            IOF ^= 0x40;                              //CPU板上的灯
            runledon();                               //面板运行灯
        }

        DI_Handle_Routine();                          //开入消抖

        Delta_I_Routine();                            //突变量电流元件

        if (ProtectDeclare())                         //判断突变量是否启动
        {
            Calculate();                              //模拟量计算

            protect = PRO_Created_Protect_List;       //保护
            for (i = 0; i < PRO_Total_Protect; i++)
            {
                (*(protect->pro_routine_handler))(protect);
                protect = protect->pro_link_next;
            }
        }

        DO_Logic();                                   //继电器逻辑

        TT1 = TMD_System_Clock;

        NU_Sleep(3);
    }
}



/***********************************************************************************/
/*      函数名: task_2(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于通信                                                */
/*      说明: 程序执行一遍,然后让出时间                                            */
/***********************************************************************************/
VOID   task_2(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS   status = (STATUS) argc + (STATUS) argv;

    register int *ptr = (int *)0x813000;

    lcd_bg_time = TMD_System_Clock + LCD_BG_TIMES;

    while (1)
    {
        din_flag = Read_In_Port(ptr) & 0xff;
        Key_Scan();
        NU_Relinquish();
    }
}

/***********************************************************************************/
/*      函数名: task_3(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于显示                                                */
/*      说明: 程序执行一遍,然后让出时间                                            */
/***********************************************************************************/
VOID   task_3(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS  status = (STATUS) argc + (STATUS) argv;

    while (1)
    {
        Lcd_Draw_Diagrame();
    }
}

/***********************************************************************************/
/*      函数名: task_4(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于通信                                                */
/*      说明: 程序执行一遍,然后让出时间                                            */
/***********************************************************************************/
VOID   task_4(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS  status = (STATUS) argc + (STATUS) argv;

    while (1)
    {
        Communication_1_task();
    }
}

/***********************************************************************************/
/*      函数名: task_5(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于保存数据至EEP                                       */
/*      说明: 程序执行一遍,然后让出时间                                            */
/***********************************************************************************/
VOID   task_5(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS      status = (STATUS) argc + (STATUS) argv;

    UNSIGNED    uSaveRequest;
    UNSIGNED    uSaveRequestSize;

    while (1)
    {
        if(NU_Receive_From_Queue(&SaveQueue,&uSaveRequest,1,                      //有保存要求时,继续执行
                                     &uSaveRequestSize,NU_SUSPEND) == NU_SUCCESS) //否则任务被挂起
        {
            SaveToEEP(uSaveRequest);
        }
    }
}

/***********************************************************************************/
/*      函数名: task_6(UNSIGNED argc, VOID *argv)                                  */
/*      功能: 任务之一,主要用于自检程序                                            */
/*      说明: 程序执行一遍,然后让出时间                                            */
/***********************************************************************************/
VOID   task_6(UNSIGNED argc, VOID *argv)
{
    /* Access argc and argv just to avoid compilation warnings.  */
    STATUS      status = (STATUS) argc + (STATUS) argv;

    while (1)
    {
        if (*pRomsumAddr != LONS_Get_CRC32(pRomstartAddr,(UNSIGNED)pRomsumAddr - (UNSIGNED)pRomstartAddr))
            Reset();
        NU_Sleep(10000);
    }
}

⌨️ 快捷键说明

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