一种裸机多任务实现方法--时间片轮询

一.目前嵌入式mcu应用代码的几种架构

1.1顺序执行架构

顺序执行架构运用最多,就是在一个while(1)大循环里面一条一条代码按顺序运行,从上到下,循环往复。

1.2时间片轮询架构

时间片轮询架构就是我们本文章介绍的一种架构,原理是启动一个定时器心跳,不停地计数,递减每个任务运行的间隔时间。某个任务间隔时间递减至0,那么运行此任务的功能函数,间隔时间重置。然后不停的重复往返轮询。

1.3操作系统

此类架构为带操作系统,目前使用比较多的操作系统有ucos,freertos,rt-thread等等。

二.源码

原理上节已经介绍了,源码非常精简,直接阅读使用吧。

#include<stdio.h>
#include <string.h>
#include<time.h>
#include<windows.h>

typedef struct 
{
    int time_count;              //任务将要运行的等待时间,一直递减变化
    int period;                  //任务运行的间隔时间
    void (*task_func)(void);     //任务执行函数
}_task;

void task_1(void)
{
    printf("this is task 1 !\n");
}

void task_2(void)
{
    printf("this is task 2 !\n");
}

void task_3(void)
{
    printf("this is task 3 !\n");
}

static _task task_components[] = 
{
    {10,10,task_1},
    {20,20,task_2},
    {30,30,task_3},
};

void task_scan(void)
{
    int i = 0;
    for(i=0; i<sizeof(task_components)/sizeof(_task);i++){
        if(task_components[i].time_count == 0){
            if(task_components[i].task_func != NULL){
                task_components[i].task_func();
                task_components[i].time_count = task_components[i].period;
            }
        }
    }
}

//放入定时器中断中去
void task_time_elapse(void)
{
    int i = 0;
    for(i=0; i<sizeof(task_components)/sizeof(_task);i++){
        if(task_components[i].time_count > 0){
            task_components[i].time_count --;
        }
    } 
}

DWORD WINAPI ThreadFun(LPVOID pM)
{
  while(1)
   {
       task_time_elapse();
       Sleep(20);
   }
}

void main(void)
{
    HANDLE handle = CreateThread(NULL,0,ThreadFun,NULL,0,NULL);
    while(1){
        task_scan();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值