1. 介绍:
实现了一款在MCU(LPC1768)中运行的OS,此OS实现了硬实时和软实时。
硬实时:当tick到时时立即执行,此任务一定要是短小的,运行时间不能超过tick间隔时间。
软实时:当tick到时时把可以执行的标志设置,程序什么时候执行,在主循环中决定,主循环中会做一些其他的事情。
2. 实现概要:
1)基本结构
定义一个 任务结构体
typedef struct {
void* (*pTask)(void* para); //任务函数
void* para;
unsigned int Delay; //延时多长时间执行 [ Delay参数是决定之不执行任务的关键,当Delay=0时,任务执行 ]
unsigned int Period; //执行周期
unsigned char RunMe; //是否立即执行
}sTask;
同时定义硬实时和软实时仓库
static sTask sch_tasks[SCH_MAX_TASKS]; //任务数组
static sTask sch_hard_tasks[SCH_MAX_HARD_TASKS]; //硬实时任务数组
2)初始化
在初始化函数中初始化一个tick,选用 timer0,定时周期10ms
void sch_init(void)
{
// 初始化sch_tasks和sch_hard_tasks
// 初始化定时器0,定时周期10ms,设置定时器的执行函数
}
定时器执行函数逻辑如下:
1. 轮训硬实时数组,当 Delay == 0,则执行任务,并且Delay = Period,当 Delay != 0,则 Delay -= 1
2. 轮训软实时数组,当 Delay == 0,则设置RunMe = 1,并且Delay = Period,当 Delay != 0,则 Delay -= 1
3)线程创建
线程结构体:
typedef struct __st_THREAD_
{
///线程句柄
pthread_t handle;
///线程函数
THREAD_METHOD function;
///线程函数的参数
void* para;
}* PTHREAD, THREAD;
创建函数:
int PTHREAD_CREATE(pthread_t* tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void * arg, const int PERIOD)
线程创建的时候,根据PERIOD的正负决定是硬实时还是软实时,负数标识硬实时
if(PERIOD >= 0)
{
return sch_add_task(start_rtn, arg, 0, PERIOD);
}
else
{
return sch_add_hard_task(start_rtn, arg, 0, -PERIOD);
}
硬实时和软实时只是任务数量的不同,
创建的核心思路就是把任务要执行的函数,函数中的参数,函数执行的周期等信息传递给结构体。
4)主函数中进行软实时函数的执行
main() {
__main_LOOP:
//线程执行
PTHREAD_RUN();
//.......
goto __main_LOOP;
}
PTHREAD_RUN 函数中实现软实时的函数的调用,RunMe标识要调用多少次。
unsigned char index;
for(index = 0; index < SCH_MAX_TASKS; index++){
if((sch_tasks[index].RunMe > 0) && (sch_tasks[index].pTask != 0x0000)){
(*sch_tasks[index].pTask)(sch_tasks[index].para);
sch_tasks[index].RunMe-=1;
if(sch_tasks[index].Period == 0) {
sch_delete_task(index);
}
}
}