嵌入式 Arduino ESP32 基于时间片的 分时操作系统框架

Timer.h

#ifndef TIMER_H
#define TIMER_H

#include <Ticker.h>

Ticker myTimer;

#define u8 unsigned char 
#define u16 unsigned int
#define u32 unsigned long 
#define GetStructNum(a) (sizeof(a)/sizeof(a[0]))

#define FlushTime_Task 10 //s
#define TaskNum (GetStructNum(tasks))

typedef void(*Task)();

//任务组
typedef struct
{
    
    
  bool isOK;//剩余时间为0,任务就绪,在主函数中进入。
  u16 curTime;//当前剩余时间 由设定时间在定时器中逐步递减
  u16 endTime;//设定时间
  Task task;//任务 函数指针,指向定时执行的任务
}MyTaskList;

#endif 

Timer


MyTaskList tasks[]=
{
    
    
  {
    
    0,2,2,Task_1},
  {
    
    0,2,2,Task_2},
  {
    
    0,2,2,Task_3},
  {
    
    0,2,2,Task_4},
};

void TASK_TIMER_IRQ()
{
    
    
  for(int i=0;i<TaskNum;i++)
  {
    
    
    if(tasks[i].curTime)
    {
    
    
      tasks[i].curTime--;
    }
    else
    {
    
    
      tasks[i].isOK=true;
      tasks[i].curTime = tasks[i].endTime;
    }
  }
}

//判断是否有任务定时时间到,可以运行
void Task_Process()
{
    
    
  u8 i=0;
  for(int i=0;i<TaskNum;i++)
  {
    
    
    if(tasks[i].isOK)
    {
    
    
    //执行对应任务
      tasks[i].task();
      tasks[i].isOK=false;
    }
  }
}

void Task_1()
{
    
    
 Serial.println("Task_1 : is OK");
}

void Task_2()
{
    
    
 Serial.println("Task_2 : is OK");
}

void Task_3()
{
    
    
 Serial.println("Task_3 : is OK");
}

void Task_4()
{
    
    
 Serial.println("Task_4 : is OK");
}

main

#include "Timer.h"

void setup() {
    
    
  Serial.begin(115200);
  myTimer.attach_ms(FlushTime_Task,TASK_TIMER_IRQ);

}

void loop() {
    
    
  Task_Process();

}

实现效果,

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44291381/article/details/114986095