Arduino之任务调度

   作者:mznewfacer (Wolf Geek)             时间:2012年 05月23日           转载需说明出处,谢谢       

这两天想让arduino  ethernet即做服务器又做客户端来完成我的一些需求,想了想单片机上可以这么搞么?这是我自己首先提出的问题。

经搜索,其实还是有并行实现方案的,我还没仔细研究,有时间了再详细讲,arduino 这里有提供 concurrency,它是基于occam-pi 并行语言写的,编译程序前需要先利用jedit插件导入firmware到arduino板子上。

语法基本形式与其他并行语言类似,同时点亮两个LED灯的程序如下所示:

PROC main ()   
PAR   //occam-π 语言形式
blink (12 , 500)   //Plumbing  library 函数 每500ms对12pin口的LED灯开关
blink (11 , 500)
:

如果不用此种方式,我们知道一般单片机没有多线程的概念,要能达到“同时”的效果,就需要任务调度来实现,先看一种简单实现两灯同时开关的程序,

#define ledPin1 11
#define ledPin2 12


#define led1Cycle 500U   
#define led2Cycle 500U


unsigned long led1LastMillis = 0;
unsigned long led2LastMillis = 0;


boolean led1State = false;
boolean led2State = false;


boolean cycleCheck(unsigned long *lastMillis, unsigned int cycle)    // 检查不使用中断方式每cycle时间是否可以执行动作
{
  unsigned long currentMillis = millis();
  if(currentMillis - *lastMillis >= cycle)
  {
    *lastMillis = currentMillis;
    return true;
  }
  else
    return false;
}


void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}


void loop()
{
  if(cycleCheck(&led1LastMillis, led1Cycle))
  {
    digitalWrite(ledPin1, led1State);   //每cycle时间重置led灯状态

    led1State = !led1State;
  }
  if(cycleCheck(&led2LastMillis, led2Cycle))
  {
    digitalWrite(ledPin2, led2State);
    led2State = !led2State;
  }
}
为了方便多任务调度,可以cycleCheck封装一下直接写成库导入libraries就可以方便的实现多任务了,将该库命名为TimeSched,以下是头文件,
#ifndef TIMESCHED_H
#define TIMESCHED_H

#include "WProgram.h"


#define NO_PREDELAY 0


class  TimeSched{
  
  public:
    TimeSched(unsigned long interval,void (*function)());   //函数指针形式供调用
    TimeSched(unsigned long prev,unsigned long interval,void (*function)());
	
	void reset();
	void disable();
	void enable();
	void check();
	
	void setInterval( unsigned long interval );


  private: 
    bool active;
    unsigned long previous;
    unsigned long interval;
    void (*execute)();   
		
};
#endif

具体实现源文件,TimeSched.cpp 

#include "TimeSched.h"


TimeSched::TimeSched(unsigned long intervl,void (*function)()){
   active = true;
   previous = 0;
   interval = intervl;
   execute = function;
 } 
//构造函数
TimeSched::TimeSched(unsigned long prev,unsigned long intervl,void (*function)()){
    active = true;
    previous = prev;
    interval = intervl;
    execute = function;
}
void TimeSched::reset(){
   previous = millis();
}
void TimeSched::disable(){ 
   active = false;
}
void TimeSched::enable(){
active = true;
}
void TimeSched::check(){ //对应于小例子的cycleCheck函数 
    if ( active && (millis()-previous >= interval) )
    { 
         previous = millis(); 
         execute(); 
    }
}
void TimeSched::setInterval( unsigned long intervl){
        interval = intervl; 
}

之后就是调用该库函数,写个pde吧,在增加个打印ASCII表的工作吧~一共三个任务,

#include "TimeSched.h"
TimeSched blinkLED1 = TimeSched(500,blink); //初始化执行函数指针
TimeSched blinkLED2 = TimeSched(500,blink);
TimeSched asciiTableAction = TimeSched(10000,asciiTable); 
#define ledPin1 13
#define ledPin2 12
boolean ledState = false;
void setup(){ 
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  digitalWrite(ledPin,ledState);
  digitalWrite(ledPin,ledState);
  Serial.begin(9600);
}


void loop(){
  blinkLED1.check(); 
  blinkLED2.check(); 
  asciiTableAction.check(); 
}
//执行函数
void blink(){
  ledState ? ledState=false : ledState=true;
  digitalWrite(ledPin,ledState);
}


//打印ASCII表到串口
void asciiTable() 
{ 
  byte number = 33; //  '!' is #33 
  // 打印到 '~' #126 ... 
  while(number <= 126) { 
	Serial.print(number, BYTE);    
	  
	Serial.print(", dec: "); 
	Serial.print(number);          
	  
	Serial.print(", hex: "); 
	Serial.print(number, HEX);     // 16进制
	  
	Serial.print(", oct: "); 
	Serial.print(number, OCT);     // 8进制
	  
	Serial.print(", bin: "); 
	Serial.println(number, BIN);   // 2进制
									 
	number++; 
  } 
  asciiTableAction.disable();
}

好了,编译后上传到板子,就可以实现“同时”闪烁两个LED灯并且在串口打印数据的任务调度程序了。







  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小小调度器是一种基于Arduino的简易调度器。Arduino是一款开源硬件平台,具有易用性和可编程性。小小调度器的主要功能是控制和协调多个任务的执行顺序和时间,以实现对系统资源的合理利用。 小小调度器通过调用Arduino的定时器功能和中断控制,可以实现多个任务的并发执行。它可以根据每个任务的优先级和时间要求,在合适的时刻切换任务的执行,以保证每个任务都按照预定的顺序和时间片进行处理。 小小调度器通常采用优先级调度算法,根据任务的重要程度和需求,将任务分为不同的优先级,并按照优先级顺序进行调度。它还可以根据任务状态的改变,实时地调整任务的执行顺序和时间。 小小调度器的设计需要考虑系统资源的限制和任务之间的相互影响。在编程时,需要合理分配处理器时间和内存空间,以及避免任务之间的冲突和资源竞争。同时,还需通过合适的调度策略,减少任务切换的开销,提高系统的响应速度和效率。 小小调度器在嵌入式系统和物联网应用中具有重要作用。它可以用于控制和管理传感器数据采集、通信模块的数据传输、外设的控制等任务。通过合理调度和管理这些任务,可以实现系统的功能拓展和性能优化。 总而言之,小小调度器利用Arduino的可编程性和灵活性,可以实现对多任务系统的任务调度和管理。它在嵌入式系统和物联网应用中具有广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值