实现自己的小的OS

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);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值