#ifndef MAIN_H
#define MAIN_H
//任务结构
struct TaskComponents
{
unsigned char Run; // 任务运行标记:0-不运行,1运行
unsigned long Timer; // 计时器
unsigned long ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} ;
#endif /* MAIN_H */
/***********************************任务函数列表
****************************************/
void UiTask(void);
void ModbusTask(void);
void TestTask(void);
void AutoModeTask(void);
void AlarmTask(void);
void CdtTask(void);
/************************任务清单****************/
typedef enum TasksList
{
UI_TASK, //人机界面
MODBUS_TASK, //MODUS通讯处理
CDT_TASK, //CDT通讯处理
TEST_TASK, //电压巡检、内阻测试
ALARM_TASK, //异常检测
AUTO_MODE_TASK, //工作模式自动切换
TASKS_MAX //可供分配的定时任务数目
} TaskList;
/************************************装载任务
******************************************/
struct TaskComponents Task[TASKS_MAX] =
{
//5ms*N
{0, 2, 2, UiTask}, //人机界面
{0, 5, 5, ModbusTask}, //MODUS通讯处理
{0,1000,1000,CdtTask}, //CDT通讯处理
{0, 200, 200, TestTask}, //电压巡检、内阻测试
{0, 2000, 2000, AlarmTask}, //异常检测
{0,0x0107AC00,0x0107AC00,AutoModeTask}, //工作模式自动切换
};
/**********************************************************
***************************
* Function name :main()
* Description :主函数
* Call :
* Call By :
* Input :
* Output :
* Return :
* Others :
***********************************************************
**************************/
int main( void )
{
DisableInterrupts(); //禁止所有中断
Atmega128Init();
UserInit();
EnableInterrupts(); //允许所有中断
while(1)
{
TaskProcess(); // 任务处理
}
}
/**********************************************************
*********************************
* Function name :TaskRemarks()
* Description :任务标志处理,定时器调用
* Call :
* Call By :
* Input :
* Output :
* Return :
* Others :
***********************************************************
**********************************/
static void TaskRemarks(void)
{
unsigned char i;
for(i=0; i<TASKS_MAX; i++) // 逐个任务时间处理
{
if (Task.Timer) // 时间不为0
{
Task.Timer--; // 减去一个节拍
if (Task.Timer == 0) // 时间到
{
Task.Timer = Task.ItvTime; // 恢复计时器值,从新下一次
Task.Run = 1; // 任务可以运行
}
}
}
}
/**********************************************************
************************************
* Function name :TaskProcess()
* Description :任务处理
* Call :
* Call By :
* Input :
* Output :
* Return :
* Others :
***********************************************************
************************************/
static void TaskProcess(void)
{
unsigned char i;
for (i=0; i<TASKS_MAX; i++) // 逐个任务处理
{
if (Task.Run) // 时间不为0
{
Task.TaskHook(); // 运行任务
Task.Run = 0; // 标志清0
}
}
}
/**********************************************************
***************************
* Function name :
* Description :定时器0中断服务程序,用于产生1个5ms计时信号
* Call :
* Call By :
* Input :
* Output :
* Return :
* Others :程序内开启全局中断,以响应更高级中断
***********************************************************
***************************/
ISR(TIMER0_COMPA_vect)
{
TaskRemarks();
WwdRefresh() ; //复位看门狗
}
/**********************************************************
****************************
* Function name :
* Description :定时器0初始化,用于秒计时
* Call :
* Call By :
* Input :
* Output :
* Return :
* Others :
***********************************************************
****************************/
void T0Init(void)
{
//定时器设置
TCCR0A |= (1<<WGM01); //CTC工作模式
TCCR0B |= (1<<CS02); //256分频
TCNT0 = 0; //清除计数器0
OCR0A = 155; //设置计数器TOP值
TIMSK0 |=(1<<OCIE0A); //启动定时器
}
改程序的大致意思是:主函数一直在扫描任务处理,定时器不断的中断进行任务标志的处理。弄不清楚,这里面的任务结构怎么分配,怎么运行任务,Task.TaskHook(); 指针指向该函数,不懂里面是怎么处理的?
|