Author Topic: Multitasking  (Read 11958 times)

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Multitasking
« on: January 15, 2015, 10:49:39 AM »
Salut,

ich bin beim Studium der PIC/chipKit Hardware und Software auf eine interessante Eigenschaft der chipKit Umgebung gestoßen: der Task Manager
Man kann hier auf sehr einfache Weise Prozeduren zeitgesteuert ausführen lasen und hat einieg nette Funktionen zur Hand:
  • variable und einstellbare Periodendauer
  • aktivierung und deaktivierung eines Tasks im Programm
  • Start zu einem gegebenen Zeitpunkt
  • Abfrage, wann der Task als nächstes ausgeführt werden soll
  • Zugriff auf Serial.print im Task (mit Vorsicht versteht sich)

Der Standard-Blink Sketch sieht dann so einfach aus:
Code: [Select]
#include "System_Defs.h"
int blink1_id;
unsigned long blink1_var;
void blink_task1(int id, void * tptr) {
  digitalWrite(PIN_LED1, !digitalRead(PIN_LED1)); // Toggle pin state
}
void setup() {
  pinMode(PIN_LED1, OUTPUT);
  blink1_id = createTask(blink_task1, 250, TASK_ENABLE, &blink1_var);
}
void loop() {
}

Ciao, Mathias

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Multitasking
« Reply #1 on: January 15, 2015, 08:11:44 PM »
Salut,

ich habe einen weiteren Test gemacht, der zeit, wie schön man hier die Task steuern kann. In dem Test habe ich auf allen pins der linken Seite LEDs (mein erster Wing). Diese werde mit jeweils einem Task zum blinken gebracht. Im loop() schalte ich dann alle zwei Sekunden die Periodenzeiten um. Absichtlich benutze ich dabei delay() um zu zeigen, dass die Tasks im Hintergrund laufen:
Code: [Select]
/*
 Blink Task (tested in UECIDE 0.8.7)
 Utlizing the chipKIT task manager.
 This example code is in the public domain.
*/
#include "System_Defs.h"
const uint8_t LEFT=0;
const uint8_t RIGHT=1;
uint8_t nP[2][8] = {
{
0,17, 9,10,11,12,13,14 }
,{
18,17, 1, 2, 3, 6, 7, 8 }
}; // pins of version 1.0 using DP32 board definitions

volatile int blink_id[8];
unsigned long blink_var[8];
int toggle_id;
unsigned long toggle_var;
volatile int state = 0;

void blink_task(int id, void * tptr) {
  int led_pin;
  unsigned long period;
  period = getTaskPeriod(id);
  led_pin = (int)getTaskVar(id);
  digitalWrite(led_pin, !digitalRead(led_pin)); // Toggle pin state
}

void toggle_task() {
switch (state){
case 0:
for (uint8_t i=0; i<8; i++){
  setTaskPeriod(blink_id[i], 100);
}
  state++;
break;
case 1:
for (uint8_t i=0; i<8; i++){
  setTaskPeriod(blink_id[i], (200+i*10));
}
  state=0;
break;
}
}

void setup() {
for (uint8_t i=0; i<8; i++){
pinMode(nP[LEFT][i], OUTPUT);
digitalWrite(nP[LEFT][i],LOW);
  blink_id[i] = createTask(blink_task, 200, TASK_ENABLE, &blink_var[i]);
  setTaskVar(blink_id[i], (void *)nP[LEFT][i]);
}
}

void loop() {
toggle_task();
delay(2000);
}

Ciao, Mathias

 

anything