📄 basetask.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 + -