|
#include <reg52.h> #include <intrins.h> // 硬件配置 #define FOSC 12000000UL // 12MHz晶振 #define MAX_TASKS 4 // 最大任务数 #define TICK_US 100 // 定时基准(100us) #define TIMER_RELOAD (256 - (FOSC / 12 / (1000000 / TICK_US))) // 自动计算重载值 // 任务状态枚举 typedef enum { TASK_RUNNING, TASK_SUSPENDED } TaskState; // 任务控制块 typedef struct { void (*TaskHook)(void); // 任务函数指针 uint16_t Interval; // 执行间隔(ms) uint16_t Counter; // 间隔计数器(单位:TICK_US) uint8_t RunFlag; // 执行标志 uint8_t Priority; // 优先级(0-3,0最高) TaskState State; // 任务状态 } TaskControlBlock; // 全局变量 TaskControlBlock TaskList[MAX_TASKS] = {0}; uint8_t TaskCount = 0; uint8_t Task_Timeout = 0; // 定时器0初始化(100us定时,模式2自动重装载) void Timer0_Init(void) { TMOD &= 0xF0; TMOD |= 0x02; TH0 = TIMER_RELOAD; TL0 = TIMER_RELOAD; ET0 = 1; TR0 = 1; EA = 1; } // 定时器1初始化(任务超时检测,1ms) void Timer1_Init(void) { TMOD &= 0x0F; TMOD |= 0x10; TH1 = (65536 - 1000) / 256; TL1 = (65536 - 1000) % 256; ET1 = 1; TR1 = 0; } // 任务创建 uint8_t Task_Create(void (*task)(void), uint16_t interval, uint8_t priority) { if(TaskCount >= MAX_TASKS || priority > 3 || interval < 1) return 0; TaskList[TaskCount].TaskHook = task; TaskList[TaskCount].Interval = interval * (1000 / TICK_US); // 转换为TICK_US计数 TaskList[TaskCount].Counter = 0; TaskList[TaskCount].RunFlag = 0; TaskList[TaskCount].Priority = priority; TaskList[TaskCount].State = TASK_RUNNING; TaskCount++; return 1; } // 任务挂起 void Task_Suspend(uint8_t task_idx) { if(task_idx < TaskCount) TaskList[task_idx].State = TASK_SUSPENDED; } // 任务恢复 void Task_Resume(uint8_t task_idx) { if(task_idx < TaskCount) { TaskList[task_idx].State = TASK_RUNNING; TaskList[task_idx].Counter = 0; } } // 定时器0中断(更新任务计数器) void Timer0_ISR(void) interrupt 1 { uint8_t i; for(i = 0; i < TaskCount; i++) { if(TaskList[i].State == TASK_RUNNING) { if(++TaskList[i].Counter >= TaskList[i].Interval) { TaskList[i].Counter = 0; TaskList[i].RunFlag = 1; } } } } // 定时器1中断(任务超时) void Timer1_ISR(void) interrupt 3 { TR1 = 0; Task_Timeout = 1; } // 任务调度 void Task_Process(void) { uint8_t pri, i; while(1) { // 按优先级从高到低执行 for(pri = 0; pri <= 3; pri++) { for(i = 0; i < TaskCount; i++) { if(TaskList[i].State == TASK_RUNNING && TaskList[i].RunFlag) { TaskList[i].RunFlag = 0; // 启动超时检测 Task_Timeout = 0; TR1 = 1; // 执行任务 TaskList[i].TaskHook(); // 停止检测 TR1 = 0; // 超时容错 if(Task_Timeout) Task_Suspend(i); } } } } } // 示例任务 void Task1(void) { /* 10ms高优任务(优先级0) */ } void Task2(void) { /* 50ms低优任务(优先级3) */ } void main(void) { Timer0_Init(); Timer1_Init(); Task_Create(Task1, 10, 0); Task_Create(Task2, 50, 3); Task_Process(); } |