前言
本时间片主要用于资源很小的51单片机上运行,如果用于更高性能的处理器,可以使用链表实现更自由的操作。
时间片调度器和任务调度器的实现
时间片调度器主要是有单片机定时中断控制,可自由设定不同时间的时间片。主要用于单片机裸机上运行。如果把每个时间片对应的任务运行时间缩的很短,基本就是一个多线程操作系统。
直接上代码
头文件
#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
;
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
];
void Time_Silce_Task_Scheduler(uint8_t sw
);
void Real_Time_Task_10ms(void);
void Real_Time_Task_100ms(void);
void Real_Time_Task_1s(void);
void Real_Time_Task_1f(void);
void Non_Real_Time_Task_10ms(void);
void Non_Real_Time_Task_1s(void);
void Non_Real_Time_Task_2s(void);
void Non_Real_Time_Task_10s(void);
void Non_Real_Time_Task_1f(void);
#endif
C文件
#include "timeslice.h"
#include "data.h"
#include "network.h"
#include "cms8s6990_i2c.h"
Task_Struct real_time_tasks
[REAL_TIME_TASKS_NUM
]={
{0,1,TIME_SILCE_REFERENCE_10MS
*1,Real_Time_Task_10ms
},
{0,50,TIME_SILCE_REFERENCE_10MS
*50,Real_Time_Task_100ms
},
{0,100,TIME_SILCE_REFERENCE_10MS
*100,Real_Time_Task_1s
},
{0,6000,TIME_SILCE_REFERENCE_10MS
*6000,Real_Time_Task_1f
},
{0,1,TIME_SILCE_REFERENCE_10MS
*1,Non_Real_Time_Task_10ms
},
{0,100,TIME_SILCE_REFERENCE_10MS
*100,Non_Real_Time_Task_1s
},
{0,200,TIME_SILCE_REFERENCE_10MS
*200,Non_Real_Time_Task_2s
},
{0,1000,TIME_SILCE_REFERENCE_10MS
*1000,Non_Real_Time_Task_10s
},
{0,6000,TIME_SILCE_REFERENCE_10MS
*6000,Non_Real_Time_Task_1f
},
};
Task_Type task_type_buf
[TASK_TYPE_NUM
] ={
{real_time_tasks
,REAL_TIME_TASKS_NUM
},
};
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;
}
}
}