基于C语言的最优时间片调度器实现

    技术2022-07-31  91

    前言

    本时间片主要用于资源很小的51单片机上运行,如果用于更高性能的处理器,可以使用链表实现更自由的操作。

    时间片调度器和任务调度器的实现

    时间片调度器主要是有单片机定时中断控制,可自由设定不同时间的时间片。主要用于单片机裸机上运行。如果把每个时间片对应的任务运行时间缩的很短,基本就是一个多线程操作系统。

    直接上代码

    头文件

    /**************************************************************************** 作者:小鱼儿飞丫飞 日期:2020-6-23 文件名:时间片轮询头文件 ****************************************************************************/ #ifndef __TIMESLICE_H__ #define __TIMESLICE_H__ /**************************************************************************** 头文件 ****************************************************************************/ #include "cms8s6990.h" /**************************************************************************** 宏定义 ****************************************************************************/ #define TIME_SILCE_REFERENCE_10MS (1) #define REAL_TIME_TASKS_NUM (9) //--实时任务数量 #define NON_REAL_TIME_TASKS_NUM (4) //--非实时任务数量 #define REAL_TIME_TASK_TYPE (0) //--实时任务 #define NON_REAL_TIME_TASK_TYPE (1)//--非实时任务 #define TASK_TYPE_NUM (1) /**************************************************************************** 变量 ****************************************************************************/ typedef void (*timeslice_procedure)(void); typedef struct _Task_Struct { uint8_t is_run; //表示任务是否在运行 uint16_t timer_slice; //·分配给任务的时间片 uint16_t time_slice_num; //时间片的个数,在TimerSlice为0时,将其赋值给TimerSlice重新计数 timeslice_procedure TaskPointer ; //任务的函数指针 }Task_Struct,*Task_Struct_P; static Task_Struct real_time_tasks[REAL_TIME_TASKS_NUM];//--因为该单片机无法动态申请内存,暂时用固定的数组。 static Task_Struct non_real_time_tasks[NON_REAL_TIME_TASKS_NUM]; typedef struct _Task_Type{ Task_Struct_P task_type; uint8_t task_num; }Task_Type; static Task_Type task_type_buf[TASK_TYPE_NUM]; /**************************************************************************** 函数 ****************************************************************************/ /*================================================================== * author : 小鱼儿飞丫飞 * date : 2020-6-8 * Function :Time_Silce_Task_Scheduler * Description :时间片任务调度器 * Input Para :sw :REAL_TIME_TASK_TYPE :实时任务 NON_REAL_TIME_TASK_TYPE:非实时任务 * Output Para : * Return Value: ==================================================================*/ void Time_Silce_Task_Scheduler(uint8_t sw); /************************************************* * 实时任务 * 10ms * *************************************************/ void Real_Time_Task_10ms(void); /************************************************* * 实时任务 * 100ms * *************************************************/ void Real_Time_Task_100ms(void); /************************************************* * 实时任务 * 1s * *************************************************/ void Real_Time_Task_1s(void); /************************************************* * 实时任务 * 1f * *************************************************/ void Real_Time_Task_1f(void); /************************************************* * 非实时任务 * 10ms * *************************************************/ void Non_Real_Time_Task_10ms(void); /************************************************* * 非实时任务 * 1s * *************************************************/ void Non_Real_Time_Task_1s(void); /************************************************* * 非实时任务 * 2s * *************************************************/ void Non_Real_Time_Task_2s(void); /************************************************* * 非实时任务 * 10s * *************************************************/ void Non_Real_Time_Task_10s(void); /************************************************* * 非实时任务 * 1f * *************************************************/ void Non_Real_Time_Task_1f(void); ///************************************************* // * 实时任务 // * 滤芯寿命计时 // * *************************************************/ //void Real_Time_Task1_Filter_Life(void); // /************************************************* // * 实时任务 // * 串口接收空闲中断 // *串口空闲中断,因为上位机等待回复时间为3s,所以此处不再单独设置定时器, // *借用此定时器,如果20ms后没接收到数据,代表一帧接收结束 // * *************************************************/ //void Real_Time_Task2_IDLE(void); ///************************************************* // * 实时任务 // * 非阻塞延时 // * *************************************************/ //void Real_Time_Task3_Delay(void); ///************************************************* // * 实时任务 // * 干拖计时 // * *************************************************/ //void Real_Time_Task4_Dry(void); ///************************************************* // * 实时任务 // * 快速出水 // * *************************************************/ //void Real_Time_Task5_Fast_Out_Water(void); ///************************************************* // * 实时任务 // * 充满计时 // * *************************************************/ //void Real_Time_Task6_Charge_End(void); ///************************************************* // * 实时任务 // * 顶部避障计时 // * *************************************************/ //void Real_Time_Task7_Top_Obstacle_Avoidance(void); ///************************************************* // * 实时任务 // * 报警计时 // * *************************************************/ //void Real_Time_Task8_Alarm(void); ///************************************************* // * 实时任务 // * 暂停计时 // * *************************************************/ //void Real_Time_Task9_Suspended(void); ///************************************************* // * 实时任务 // * led闪烁控制 // * *************************************************/ //void Real_Time_Task10_Flicker(void); ///************************************************* // * 实时任务 // * 按键计时 // * *************************************************/ //void Real_Time_Task11_Key_Timming(void); ///************************************************* // * 实时任务 // * 音乐播放 // * *************************************************/ //void Real_Time_Task12_Music(void); ///************************************************* // * 实时任务 // * 水泵出水控制 // * *************************************************/ //void Real_Time_Task13_Water_Pump(void); ///************************************************* // * 实时任务 // * 读取红外 // * *************************************************/ //void Real_Time_Task14_HW(void); ///************************************************* // * 实时任务 // * 判断碰撞 // * *************************************************/ //void Real_Time_Task15_Read_Gsensor(void); ///************************************************* // * 实时任务 // * 受困计时 // * *************************************************/ //void Real_Time_Task16_Trapped(void); ///************************************************* // * 实时任务 // * 工作时间计时 // * *************************************************/ //void Real_Time_Task17_Work(void); ///************************************************* // * 实时任务 // * 电机控制 // * *************************************************/ //void Real_Time_Task18_Duty(void); ///************************************************* // * 实时任务 // * 充电检测 // * *************************************************/ //void Real_Time_Task19_Charge(void); ///************************************************* // * 非实时任务 // * 电压检测 1s调用一次 // * *************************************************/ //void Non_Real_Time_Task1_Voltage_Detection(void); ///************************************************* // * 非实时任务 // * 定时上报电量 1s调用一次 // * *************************************************/ //void Non_Real_Time_Task2_Report_Electricity(void); ///************************************************* // * 非实时任务 // * 定时刷新电压灯 1s刷新一次 // * *************************************************/ //void Non_Real_Time_Task3_Refersh_Voltage_Lamp(void); ///************************************************* // * 非实时任务 // * 定时检测水泵电流 // * *************************************************/ //void Non_Real_Time_Task4_Check_No_Water(void); ///************************************************* // * 非实时任务 // * 保存滤芯寿命 1分钟检测一次 // * *************************************************/ //void Non_Real_Time_Task5_Save_Filter_Life(void); ///************************************************* // * 非实时任务 // * 运行时,时间和水量灯交替显示 2s调用一次 // * *************************************************/ //void Non_Real_Time_Task6_Work_Water_LED(void); ///************************************************* // * 非实时任务 // * 刷新LED // * *************************************************/ //void Non_Real_Time_Task7_Refersh_LED(void); #endif

    C文件

    /**************************************************************************** 作者:小鱼儿飞丫飞 日期:2020-6-23 文件名:时间片轮询执行文件 ****************************************************************************/ /**************************************************************************** 头文件 ****************************************************************************/ #include "timeslice.h" #include "data.h" #include "network.h" #include "cms8s6990_i2c.h" /**************************************************************************** 宏定义 ****************************************************************************/ /**************************************************************************** 变量 ****************************************************************************/ //--实时任务 //Task_Struct real_time_tasks[REAL_TIME_TASKS_NUM]={ //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task1_Filter_Life}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task2_IDLE}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task3_Delay}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task4_Dry}, //{0,100,TIME_SILCE_REFERENCE_10MS*100,Real_Time_Task5_Fast_Out_Water}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task6_Charge_End}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task7_Top_Obstacle_Avoidance}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task8_Alarm}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task9_Suspended}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task10_Flicker}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task11_Key_Timming}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task12_Music}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task13_Water_Pump}, //{0,10,TIME_SILCE_REFERENCE_10MS*10,Real_Time_Task14_HW}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task15_Read_Gsensor}, //{0,100,TIME_SILCE_REFERENCE_10MS*100,Real_Time_Task16_Trapped}, //{0,100,TIME_SILCE_REFERENCE_10MS*100,Real_Time_Task17_Work}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task18_Duty}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task19_Charge}, //}; --非实时任务 //Task_Struct non_real_time_tasks[NON_REAL_TIME_TASKS_NUM]={ //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Non_Real_Time_Task1_Voltage_Detection}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Non_Real_Time_Task2_Report_Electricity}, //{0,100,TIME_SILCE_REFERENCE_10MS*100,Non_Real_Time_Task3_Refersh_Voltage_Lamp}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Non_Real_Time_Task4_Check_No_Water}, //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Non_Real_Time_Task5_Save_Filter_Life}, //{0,200,TIME_SILCE_REFERENCE_10MS*200,Non_Real_Time_Task6_Work_Water_LED}, //{0,1,TIME_SILCE_REFERENCE_10MS*1,Non_Real_Time_Task7_Refersh_LED} //}; //--因为该单片机数据存储区太小,无法细分每个任务,只能把相同时间片的任务堆放在一起。 //--实时任务 Task_Struct real_time_tasks[REAL_TIME_TASKS_NUM]={ //-此处暂时把实时和非实时放在一起 {0,1,TIME_SILCE_REFERENCE_10MS*1,Real_Time_Task_10ms},//--10ms {0,50,TIME_SILCE_REFERENCE_10MS*50,Real_Time_Task_100ms},//--100ms {0,100,TIME_SILCE_REFERENCE_10MS*100,Real_Time_Task_1s},//--1s {0,6000,TIME_SILCE_REFERENCE_10MS*6000,Real_Time_Task_1f},//--1f {0,1,TIME_SILCE_REFERENCE_10MS*1,Non_Real_Time_Task_10ms},//--10ms {0,100,TIME_SILCE_REFERENCE_10MS*100,Non_Real_Time_Task_1s},//--1s {0,200,TIME_SILCE_REFERENCE_10MS*200,Non_Real_Time_Task_2s},//--2s {0,1000,TIME_SILCE_REFERENCE_10MS*1000,Non_Real_Time_Task_10s},//--10s {0,6000,TIME_SILCE_REFERENCE_10MS*6000,Non_Real_Time_Task_1f},//--1f }; //--非实时任务 //Task_Struct non_real_time_tasks[NON_REAL_TIME_TASKS_NUM]={ //{0,1,TIME_SILCE_REFERENCE_10MS*1,Non_Real_Time_Task_10ms},//--10ms //{0,100,TIME_SILCE_REFERENCE_10MS*100,Non_Real_Time_Task_1s},//--1s //{0,200,TIME_SILCE_REFERENCE_10MS*200,Non_Real_Time_Task_2s},//--2s //{0,6000,TIME_SILCE_REFERENCE_10MS*6000,Non_Real_Time_Task_1f},//--1f //}; //--任务类型 Task_Type task_type_buf[TASK_TYPE_NUM] ={ {real_time_tasks,REAL_TIME_TASKS_NUM}, //{non_real_time_tasks,NON_REAL_TIME_TASKS_NUM}, }; /**************************************************************************** 函数 ****************************************************************************/ /*================================================================== * author : 小鱼儿飞丫飞 * date : 2020-6-8 * Function :Time_Silce_Task_Scheduler * Description :时间片任务调度器 * Input Para :sw :REAL_TIME_TASK_TYPE :实时任务 NON_REAL_TIME_TASK_TYPE:非实时任务 * Output Para : * Return Value: ==================================================================*/ //--此处暂时把时间片调度器和任务调度器放在一起,后面换单片机优化可以分开 void Time_Silce_Task_Scheduler(uint8_t sw) { static uint16_t i=0; for (i=0; i < task_type_buf[sw].task_num; ++i) { if (task_type_buf[sw].task_type[i].timer_slice) { --task_type_buf[sw].task_type[i].timer_slice; if (0 == task_type_buf[sw].task_type[i].timer_slice) { task_type_buf[sw].task_type[i].is_run = 0x01; task_type_buf[sw].task_type[i].timer_slice = task_type_buf[sw].task_type[i].time_slice_num; } } } for (i=0; i < task_type_buf[sw].task_num; ++i) { if (task_type_buf[sw].task_type[i].is_run) { task_type_buf[sw].task_type[i].TaskPointer(); task_type_buf[sw].task_type[i].is_run = 0; } } } /************************************************* 下面就是每个时间片的具体实现了 此处省略
    Processed: 0.012, SQL: 9